Httpパラメーターの汚染(詳細)

Http Parameter Contamination(HPC)攻撃の研究を続けながら、彼の最初の研究でIvan Markovicの影響を受けなかった環境を含め、原始ファジングを実行しました。 根本的に新しいものは発見されなかったことにすぐに注意する必要があります。 一方、Pythonインタープリターの興味深い機能が明らかになり、Tomcatサーバーに関連するサービス拒否のための戦闘分割が行われました:)しかし、後者によると、これまでのところ非開示ではありません。



結果を下の写真に示します。



画像



*文字「\ 0」は、ヌルバイトがアプリケーションによって正しく処理されることを意味します。



最も興味深い機能は濃い赤で強調表示されています。 それほど興味深いものではありませんが、注目に値するものは淡い赤で強調表示されています。 結果をより詳細に検討してください。



攻撃者にとって最大の価値は、ASP Webアプリケーションによって着信データを処理する機能です。 実際、ASPアプリケーションは、URLデコード中に「正しい」文字を形成しない場合、パラメータ名またはその値で「%」文字を検出し、それを削除するだけです。 これにより、アプリケーションが着信データを処理する前に使用されるさまざまなセキュリティフィルターとWebアプリケーションファイアウォールを非常に簡単にバイパスできます。 Ivan Markovicの研究では、パストラバーサルの脆弱性を利用する際にMod_Securityルールをバイパスする次の例を示しています。



192.168.2.105/test.asp?file=.%./bla.txt







IISプラットフォームにとってより重要なのは、MSSQL DBMSの使用と、SQLインジェクションなどのアプリケーションでの脆弱性の出現です。 同様に、この方法を使用すると、対応するMod_Securityルールをバイパスしてこの脆弱性を利用できます。



?id = 1; selec%t + @%@ version--

?id = 1; selec%t + convert(int、(selec%t + table%_name + from(selec%t + row_number()+ over +(order + by + table%_name)+ as + rownu%m、table %_name + from + information_schema.tables)+ as + t + where + t.rownu%m = 1))-

...



ここでは、Mod_Securityの基本ルール(基本ルール)をバイパスすることについてのみ話していることを予約する価値があります。 高度なルール(オプションおよび実験的)を使用する場合、そのようなフェイントは合格しません。



PHPインタープリターには、受信データを処理する便利な機能もあります。 これは暗黙的な型変換( ?Param [] = 123-> param = Array )であり、誰もが長い間知っているはずであり、値 "register_argc_argv"が設定された配列$ _SERVER ["argv"]( ?1 + 2 )を制御する能力「オン」。 攻撃者は、PHPの最初の機能を利用してさまざまな制限をバイパスし(たとえば、変数を暗黙的に比較する場合)、エラーメッセージを強制する(Webサーバーのルートディレクトリを開く)ことができます。 PHPの2番目の機能を使用すると、Webサーバーを介してスクリプトにアクセスし、コマンドラインからスクリプトが受け入れるパラメーターを渡すことができます。



PHPのあまり面白くない機能は、文字「+」、「。」、「[」、および「スペース」をアンダースコア(「_」)に置き換えることです。 なぜこれはそれほど危険ではないのですか? 実際、このようなPHPの動作は、Webサーバーに渡されるパラメーターの名前でのみ観察され、値では観察されないということです。 これにより、「野生生物」でこの機能を使用する可能性が大幅に減少します。



そして、最後に注意したいのは、Pythonインタープリターです。 ファジング中に、Pythonが%80-%FFの範囲の文字に遭遇すると、エラーメッセージが返されます(ala ...



画像



(付録)

テスト用に、スクリプトを以下にリストします。



PHP:



<?php

$ G =&$ _ GET;

foreach($ G = $ k => $ v)

{

print $ k。 "="。$ v;

}

?>



ASP:

<%

Request.QueryStringの各変数に対して

Response.Write(var& "="&Request.QueryString(var))

次の

%>



JAVA:

<%

java.util.Enumeration names = request.getParameterNames();

while(names.hasMoreElements()){

String keyx = names.nextElement()。ToString();

out.println(keyx + "=" + request.getParameter(keyx)); }

%>



期間:

CGIを使用します。

私の$ cgi =新しいCGI;

my @params = $ cgi-> param();

印刷<< ENDOFTEXT;

HTTP / 1.0 200 OK

コンテンツタイプ:テキスト/ html



ENDOFTEXT

foreach my $ parameter(sort @params){

print $ parameter。 "="。$ cgi-> param($ parameter);

}



パイソン:

インポートcgi、os



印刷(「ステータス:200 OK」)

print( 'Content-type:text / html; charset = utf-8;')

印刷( "")



クエリ= os.environ.get( 'QUERY_STRING')



ペア= cgi.parse_qs(クエリ)



キーの場合、pairs.items()の値:

印刷(キー、値)



All Articles