使用 sqlmap 的 Tamper 脚本绕过基本过滤器

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索如何使用 sqlmap 强大的 tamper 脚本来绕过常见的 Web 应用程序过滤器。许多 Web 应用程序会实现基本的输入验证和过滤,以防止 SQL 注入攻击。这些过滤器可能会阻止常见的 SQL 关键字、空格或其他字符。sqlmap 的 tamper 脚本可以自动修改 SQL 注入的 payload,以规避这些过滤器,从而使你的攻击更有效。你将学会识别需要规避的场景,列出可用的 tamper 脚本,应用特定的脚本,并观察其对生成 payload 的影响。

识别需要规避的场景

在此步骤中,你将理解 tamper 脚本的必要性。Web 应用程序通常会采用基本的过滤器来阻止常见的 SQL 注入模式。例如,一个过滤器可能会阻止空格或将其替换为其他字符,或者它可能会阻止 UNIONSELECT 等关键字。当 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

此命令将输出位于 sqlmaptamper 目录中的所有 .py 文件的列表。每个文件代表一个不同的 tamper 脚本。例如,你可能会看到 space2comment.pyunionalltostring.pyapostrophemask.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 的差异。

使用选定的 Tamper 脚本执行扫描

在此步骤中,你已在上一步中使用 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。

比较使用和不使用 Tamper 脚本的 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 注入测试能力。