由于学校要举办个CTF比赛,所以没办法必须参加。。。然后就是准备各种脚本了,关于webshell的查杀有了一个新的想法。
最简单的一句话形如:<?php @eval($_POST['pass'])?>
,原理很简单
首先$_POST
会获取POST到服务器的参数名为pass
的POST请求数据,然后函数eval
会将$_POST
获取的字符串按照PHP语法进行解析,这样我们通过各种PHP函数的组合使用就能通过中国菜刀等工具对服务器的文件等进行操作,这也就是常见一句话的工作原理。
这里我用两个i春秋上的过狗马来分析下:
第一个:
第二个:
现在的webshell大部分都是回调函数,匿名函数,及一些PHP的特殊的函数,或者是PHP的特性。构造出无特征的webshell,传统的基于正则的webshell查杀对于这些webshell是无法查出的,根据在D盾中的测试,就算报出,也是级别为1,2的低级的,基本上咱们就忽略了。
咱们都知道传统的webshell查杀基本上都是基于正则库(这里不得不吐槽下公司的那个webshell查杀工具,真几把垃圾的不行),为什么我们自己就能断定某个PHP脚本是是webshell呢?因为我们在自己的大脑中虚拟调试了这个PHP脚本,知道它是干嘛的了,所以这就是和工具的区别,所以我打算开发的webshell查杀就是基于虚拟执行和正则的webshell查杀。
比如我们那上面的第一个列子:
如果我们echo $zk,$ef,$dva,$zvm
则结果为:str_replace,base64_decode,create_function,create_function(@eval($_POST['wen']))
这样在基于正则匹配之后是不是就很明显了。
再来看几个例子:
|
|
按照这个思路是不是很容易检测了。
再来看一个:
所以现在要做的就是找出脚本中所有的变量及匿名函数即可。