看我是如何把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 核心流程

  1. 初始化阶段

    • 设置环境路径(setPaths()函数)
    • 加载WAF检测脚本(_setWafFunctions()函数)
  2. 检测阶段

    • 使用预定义的攻击向量触发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. 优化建议

  1. 性能优化

    • 缓存检测结果避免重复请求
    • 并行执行多个WAF检测
  2. 功能扩展

    • 添加被动检测模式(仅分析正常响应)
    • 支持自定义攻击向量
    • 添加WAF绕过建议
  3. 错误处理

    • 增强网络请求异常处理
    • 添加超时机制

8. 注意事项

  1. 确保遵守目标网站的使用条款,不要未经授权进行测试
  2. 高频的WAF检测请求可能触发防护机制,建议控制请求频率
  3. 部分WAF检测可能产生大量日志,注意清理测试痕迹

通过以上步骤,您可以成功将SQLMap中的WAF检测功能提取并集成到自己的安全工具中,同时保持该功能的完整性和准确性。

SQLMap WAF检测功能移植教学文档 1. 背景与目标 本教学文档旨在指导如何从SQLMap工具中提取WAF(Web应用防火墙)检测功能,并将其移植到自定义程序中。SQLMap的WAF检测功能经过长期维护和社区验证,具有较高的准确性和广泛的WAF覆盖范围。 2. SQLMap WAF检测机制分析 2.1 目录结构 SQLMap的WAF检测功能主要位于以下目录: 2.2 核心流程 初始化阶段 : 设置环境路径( setPaths() 函数) 加载WAF检测脚本( _setWafFunctions() 函数) 检测阶段 : 使用预定义的攻击向量触发WAF 分析响应头、状态码和响应体 匹配WAF指纹特征 3. 关键功能提取与移植 3.1 环境路径设置 3.2 WAF脚本加载 3.3 请求函数实现 3.4 WAF检测核心逻辑 4. 关键数据提取 4.1 攻击向量 从SQLMap的 data.py 中提取WAF触发向量: 4.2 HTTP头常量 5. 完整集成示例 6. 自定义WAF检测脚本开发 参考SQLMap的WAF检测脚本结构,可以开发自定义检测: 7. 优化建议 性能优化 : 缓存检测结果避免重复请求 并行执行多个WAF检测 功能扩展 : 添加被动检测模式(仅分析正常响应) 支持自定义攻击向量 添加WAF绕过建议 错误处理 : 增强网络请求异常处理 添加超时机制 8. 注意事项 确保遵守目标网站的使用条款,不要未经授权进行测试 高频的WAF检测请求可能触发防护机制,建议控制请求频率 部分WAF检测可能产生大量日志,注意清理测试痕迹 通过以上步骤,您可以成功将SQLMap中的WAF检测功能提取并集成到自己的安全工具中,同时保持该功能的完整性和准确性。