引言
在本实验中,你将探索如何使用 sqlmap 强大的 tamper 脚本来绕过常见的 Web 应用程序过滤器。许多 Web 应用程序会实现基本的输入验证和过滤,以防止 SQL 注入攻击。这些过滤器可能会阻止常见的 SQL 关键字、空格或其他字符。sqlmap 的 tamper 脚本可以自动修改 SQL 注入的 payload,以规避这些过滤器,从而使你的攻击更有效。你将学会识别需要规避的场景,列出可用的 tamper 脚本,应用特定的脚本,并观察其对生成 payload 的影响。
在本实验中,你将探索如何使用 sqlmap 强大的 tamper 脚本来绕过常见的 Web 应用程序过滤器。许多 Web 应用程序会实现基本的输入验证和过滤,以防止 SQL 注入攻击。这些过滤器可能会阻止常见的 SQL 关键字、空格或其他字符。sqlmap 的 tamper 脚本可以自动修改 SQL 注入的 payload,以规避这些过滤器,从而使你的攻击更有效。你将学会识别需要规避的场景,列出可用的 tamper 脚本,应用特定的脚本,并观察其对生成 payload 的影响。
在此步骤中,你将理解 tamper 脚本的必要性。Web 应用程序通常会采用基本的过滤器来阻止常见的 SQL 注入模式。例如,一个过滤器可能会阻止空格或将其替换为其他字符,或者它可能会阻止 UNION 或 SELECT 等关键字。当 sqlmap 的默认 payload 被阻止时,你需要修改它们来绕过这些过滤器。
考虑一个假设场景,其中一个 Web 应用程序会过滤用户输入中的空格。如果 sqlmap 尝试注入 ' OR 1=1-- 这样的 payload,过滤器可能会将其转换为 'OR1=1--,从而使 payload 无效。Tamper 脚本可以帮助 sqlmap 生成能够绕过此类限制的替代 payload。
为了在不使用任何规避技术的情况下模拟基本的 sqlmap 扫描,我们将使用一个虚拟 URL。这将帮助我们稍后比较使用和不使用 tamper 脚本生成的 payload。
执行以下 sqlmap 命令,针对一个虚拟目标启动基本扫描。请注意,此目标实际上并不易受攻击,但它允许我们观察 sqlmap 的行为和生成的 payload。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --output-dir=/tmp/sqlmap_output_no_tamper
此命令将尝试执行基本的 SQL 注入扫描。--dump 选项用于转储数据,--batch 以非交互模式运行,--forms 检查表单,--level 1 --risk 1 设置检测级别和风险,--parse-errors 解析错误消息,--technique=U 指定 UNION 查询 SQL 注入,--eta 显示预计到达时间,--output-dir 指定输出目录。
观察输出。虽然此特定命令可能无法在给定 URL 上找到漏洞(因为这是一个通用测试站点,并未专门为此实验目的进行配置),但目标是查看 sqlmap 的初始尝试,并理解有时这些尝试可能会被过滤器阻止。
--list-tampers 列出可用的 Tamper 脚本在此步骤中,你将学习如何列出 sqlmap 中所有可用的 tamper 脚本。sqlmap 提供了各种 tamper 脚本,每种脚本都旨在绕过特定类型的过滤器或 WAF(Web 应用程序防火墙)。了解哪些脚本可用对于选择适合你规避需求的脚本至关重要。
要列出所有可用的 tamper 脚本,请在 sqlmap 中使用 --list-tampers 选项。
sqlmap --list-tampers
此命令将输出位于 sqlmap 的 tamper 目录中的所有 .py 文件的列表。每个文件代表一个不同的 tamper 脚本。例如,你可能会看到 space2comment.py、unionalltostring.py、apostrophemask.py 等脚本。每个脚本都有特定用途,例如用注释替换空格,将 UNION ALL 转换为字符串连接,或屏蔽撇号。
查看列表,并尝试根据脚本名称了解其中一些脚本的用途。例如,space2comment.py 旨在用 SQL 注释替换空格,这可以绕过阻止空格的过滤器。
--tamper=space2comment 选择并应用 Tamper 脚本在此步骤中,你将为你的 sqlmap 扫描选择并应用一个特定的 tamper 脚本。在本实验中,我们将使用 space2comment tamper 脚本。此脚本将 SQL 注入 payload 中的空格替换为 /**/(多行注释)序列。此技术对于阻止或移除空格但允许 SQL 注释的过滤器非常有效。
要应用 tamper 脚本,请使用 --tamper 选项,后跟脚本名称(不带 .py 扩展名)。
执行以下 sqlmap 命令,这次包含 space2comment tamper 脚本:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --tamper=space2comment --output-dir=/tmp/sqlmap_output_with_tamper
注意添加了 --tamper=space2comment。这会告诉 sqlmap 在将所有生成的 payload 发送到目标之前,先通过此特定 tamper 脚本进行处理。
虽然输出可能与上一步看起来相似,但内部而言,sqlmap 正在修改其 payload。在下一步中,我们将检查生成的 payload 的差异。
在此步骤中,你已在上一步中使用 space2comment tamper 脚本执行了 sqlmap 命令。本步骤的目的是强化执行过程,并为 payload 比较做准备。
你运行的命令是:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --tamper=space2comment --output-dir=/tmp/sqlmap_output_with_tamper
此命令指示 sqlmap 执行扫描,但这次它将使用 space2comment tamper 脚本修改其 payload。例如,像 UNION SELECT 这样的 payload 可能会被转换为 UNION/**/SELECT。这种细微的更改通常可以绕过简单的空格过滤机制。
--output-dir=/tmp/sqlmap_output_with_tamper 选项确保 sqlmap 的输出,包括任何生成的 payload 或日志,都存储在单独的目录中。这对于在下一步比较 payload 非常有用。
让 sqlmap 扫描完成。即使它在模拟目标上没有找到漏洞,关键在于 sqlmap 已经尝试使用了被篡改的 payload。
在最后一步中,你将比较使用 space2comment tamper 脚本和不使用该脚本时 sqlmap 生成的 payload。此比较将直观地展示 tamper 脚本如何修改注入 payload 以规避过滤器。
sqlmap 会在其输出目录中记录其活动,包括它发送的 payload。我们在步骤 1 和步骤 3 中为扫描指定了不同的输出目录。
首先,让我们尝试查找可能包含 payload 的日志文件。sqlmap 通常在其输出目录中的文件中存储 HTTP 请求。
导航到输出目录并查找请求日志。确切的文件名可能会有所不同,但它们通常位于 log/ 目录下或直接位于目标的目录中。
让我们尝试查找一个包含请求的通用日志文件。sqlmap 通常会创建 session.log 或类似文件。
使用 grep 在两次运行的日志文件中搜索常见的 SQL 关键字。
通过查看空格处理方式的差异来比较 payload。
echo "--- Payloads without tamper script ---"
grep -r "UNION" /tmp/sqlmap_output_no_tamper/ | head -n 5
echo ""
echo "--- Payloads with tamper script ---"
grep -r "UNION" /tmp/sqlmap_output_with_tamper/ | head -n 5
你应该会观察到,在“使用 tamper 脚本的 payload”输出中,SQL 关键字(如 UNION SELECT)中的空格被替换为 /**/ 注释,而在“不使用 tamper 脚本的 payload”输出中,则使用常规空格。这清晰地说明了 space2comment tamper 脚本的效果。
此比较突显了 tamper 脚本在修改 payload 以绕过基本过滤机制方面的有效性,使 sqlmap 成为一个更通用的渗透测试工具。
在本实验中,你成功学习了如何使用 sqlmap 的 tamper 脚本来绕过基本的 Web 应用程序过滤器。你首先了解了在面对输入过滤器时规避技术的需求。然后,你探索了如何使用 --list-tampers 列出可用的 tamper 脚本,并为实际演示选择了 space2comment 脚本。最后,你使用和不使用 tamper 脚本执行了 sqlmap,并比较了生成的 payload,清晰地观察到 space2comment 脚本如何将空格修改为 /**/ 注释。这次实践经验使你掌握了一项基本技能,通过规避常见的过滤机制来增强你的 SQL 注入测试能力。