之前玩CTF遇到一个一句话很有意思,于是就把之前收藏的文章拿出来看看,学习一下,同时分享给各位。所有的吗都是在前人的基础上稍作修改,对于一些关键点会稍作解释,方便大家理解。
第一种
隐藏关键字,通过对单个字符变量进行++操作来获取其他字符,再进行拼接得到我们想要的函数。
1 | @$_=[].''; //PHP5.3之后(不包括5.3)才能这么用,数组被强制转换成字符串,获取字符串Array,等下要用到A |
所以我们可以根据这个思路构造一句话,如下:(ASSERT("eval($_POST[c])");
当中还有base64解密)
1 |
|
在另一种变形,不使用任何大小写字符,如下:ASSERT($_POST[_]);
1 |
|
这个变种一句话是在今年的湖湘杯CTF中遇到的,题目的WAF源代码也可以贴出来给大家
1 |
|
第二种
使用正则匹配配合/e模式,制作一句话木马
当使用e修饰符时, preg_replace() 在进行对字符串的替换后, 替换后的字符串会被作当做php代码来执行。单引号、双引号、反斜线(/)和 NULL字符在替换时会被反斜线转义。
1 |
|
406576616c286261736536345f6465636f646528对应@eval(base64_decode(
虽然5.5.0之后会报错,但是一句话的功能还是能正常执行。
mb_ereg_replace()函数也可以达到同样执行效果,但是过防护软件效果不好。
1 |
|
第三种
利用PHP反射机制制作免杀木马
将一句话打乱写在注释语句中,通过PHP的反射机制来构造、执行一句话。这里需注意,用于动态执行的字符串必须要是”assert”,不能是”eval”,因为在PHP中,eval、die不是函数,而assert是函数。代码如下:(ASSERT(eval($_POST['_'])))
1 |
|
如果注释中有关键字,安全狗会把他当成一句话(估计安全狗使用的是关键字匹配),但是D盾不会,所以在过安全狗的时候,如果对webshell进行了混淆,不要把明文关键字放在注释里面。
使用反射函数来完成一句话功能
1 |
|
关于PHP的反射机制,可以参考这篇文章:PHP的反射机制
当然,还有很多种一句话的变形,这里推荐下面这个博客,写的可是详细,可以好好看看。
Deformity PHP Webshell、Webshell Hidden Learning
参考文章
http://www.cnblogs.com/Littlehann/p/3522990.html
http://www.freebuf.com/articles/web/138687.html
http://blog.csdn.net/hguisu/article/details/7357421