看我是如何把SQLMap里的功能移植到我的程序的
字数 738 2025-08-10 12:18:06
SQLMap WAF检测功能移植教学文档
1. 背景与目标
本教学文档旨在指导如何从SQLMap工具中提取WAF(Web应用防火墙)检测功能,并将其移植到自定义程序中。SQLMap的WAF检测功能经过长期维护和社区验证,具有较高的准确性和广泛的WAF覆盖范围。
2. SQLMap WAF检测机制分析
2.1 目录结构
SQLMap的WAF检测功能主要位于以下目录:
/waf/ - 包含各种WAF检测脚本
/data/ - 包含攻击向量和HTTP头常量定义
2.2 核心流程
-
初始化阶段:
- 设置环境路径(
setPaths()函数) - 加载WAF检测脚本(
_setWafFunctions()函数)
- 设置环境路径(
-
检测阶段:
- 使用预定义的攻击向量触发WAF
- 分析响应头、状态码和响应体
- 匹配WAF指纹特征
3. 关键功能提取与移植
3.1 环境路径设置
import os
def setPaths(rootPath):
paths = {}
paths['SQLMAP_ROOT_PATH'] = rootPath
paths['SQLMAP_WAF_PATH'] = os.path.join(rootPath, "waf")
# 其他路径可根据需要添加
return paths
3.2 WAF脚本加载
import glob
import os
import sys
import inspect
def load_waf_functions(waf_path):
waf_functions = []
for script in glob.glob(os.path.join(waf_path, "*.py")):
dirname, filename = os.path.split(script)
if filename == "__init__.py":
continue
dirname = os.path.abspath(dirname)
if dirname not in sys.path:
sys.path.insert(0, dirname)
try:
module_name = filename[:-3]
if module_name in sys.modules:
del sys.modules[module_name]
module = __import__(module_name)
functions = dict(inspect.getmembers(module))
if "detect" in functions:
product_name = functions.get("__product__", module_name)
waf_functions.append((functions["detect"], product_name))
except ImportError as e:
print(f"Error loading WAF script {filename}: {str(e)}")
# 排序确保通用检测在后
waf_functions.sort(key=lambda x: "generic" in x[1].lower())
return waf_functions
3.3 请求函数实现
import requests
def get_page(url, params=None, headers=None):
try:
response = requests.get(url, params=params, headers=headers)
return response.text, response.headers, response.status_code
except Exception as e:
print(f"Request failed: {str(e)}")
return None, None, None
3.4 WAF检测核心逻辑
def detect_waf(target_url, waf_functions):
detected_wafs = []
for detect_func, waf_name in waf_functions:
try:
# 使用闭包传递get_page函数
def wrapped_get_page(**kwargs):
return get_page(target_url, **kwargs)
if detect_func(wrapped_get_page):
detected_wafs.append(waf_name)
except Exception as e:
print(f"Error during {waf_name} detection: {str(e)}")
return detected_wafs
4. 关键数据提取
4.1 攻击向量
从SQLMap的data.py中提取WAF触发向量:
WAF_ATTACK_VECTORS = [
"1 AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1",
"' OR '1'='1' --",
"1 AND 1=1 UNION ALL SELECT 1,@@version,3,4,5,6--",
# 其他SQL注入攻击向量...
]
4.2 HTTP头常量
class HTTP_HEADER:
SERVER = "Server"
X_POWERED_BY = "X-Powered-By"
SET_COOKIE = "Set-Cookie"
# 其他常用HTTP头...
5. 完整集成示例
import os
import glob
import inspect
import sys
import requests
# 配置部分
SQLMAP_ROOT = "./sqlmap" # 假设sqlmap源码目录
TARGET_URL = "http://example.com"
# 1. 设置路径
paths = {
'SQLMAP_WAF_PATH': os.path.join(SQLMAP_ROOT, "waf")
}
# 2. 加载WAF函数
waf_functions = []
for script in glob.glob(os.path.join(paths['SQLMAP_WAF_PATH'], "*.py")):
# ... 同前文load_waf_functions实现 ...
# 3. 定义get_page函数
def get_page(url, **kwargs):
# ... 同前文实现 ...
# 4. 检测WAF
detected = detect_waf(TARGET_URL, waf_functions)
if detected:
print(f"Detected WAF: {', '.join(detected)}")
else:
print("No known WAF detected")
6. 自定义WAF检测脚本开发
参考SQLMap的WAF检测脚本结构,可以开发自定义检测:
# 文件名: mywaf.py
__product__ = "MyCustomWAF"
def detect(get_page):
for vector in WAF_ATTACK_VECTORS:
page, headers, code = get_page(get=vector)
# 检测特征1: 特定响应头
if "MyWAF-Protection" in headers.get(HTTP_HEADER.X_POWERED_BY, ""):
return True
# 检测特征2: 特定状态码和内容
if code == 403 and "blocked by MyWAF" in (page or ""):
return True
return False
7. 优化建议
-
性能优化:
- 缓存检测结果避免重复请求
- 并行执行多个WAF检测
-
功能扩展:
- 添加被动检测模式(仅分析正常响应)
- 支持自定义攻击向量
- 添加WAF绕过建议
-
错误处理:
- 增强网络请求异常处理
- 添加超时机制
8. 注意事项
- 确保遵守目标网站的使用条款,不要未经授权进行测试
- 高频的WAF检测请求可能触发防护机制,建议控制请求频率
- 部分WAF检测可能产生大量日志,注意清理测试痕迹
通过以上步骤,您可以成功将SQLMap中的WAF检测功能提取并集成到自己的安全工具中,同时保持该功能的完整性和准确性。