1. 环境准备与靶场搭建第一次接触SQL注入时我盯着屏幕上那个简单的输入框发呆了十分钟——谁能想到在这个看似无害的文本框背后竟藏着直通数据库的暗道DVWADamn Vulnerable Web Application就像个精心设计的黑客游乐场特别适合新手来摸清这些暗道机关。装DVWA其实比想象中简单。我用的是Windows系统直接下载了XAMPP集成环境把DVWA压缩包解压到htdocs目录下。启动Apache和MySQL服务后在浏览器输入http://localhost/dvwa就能看到登录页面。默认账号是admin密码password记得登录后要先去DVWA Security把安全级别调到Low不然很多漏洞都被防护机制过滤掉了。注意实验结束后务必关闭DVWA服务真实环境中运行这种脆弱系统相当于给黑客发邀请函2. 初探SQL注入点在DVWA左侧菜单找到SQL Injection页面就一个孤零零的输入框。我输入数字1点击提交页面返回了用户ID为1的姓名信息。这时候按下F12打开开发者工具在Network标签里能看到实际发送的请求是http://localhost/dvwa/vulnerabilities/sqli/?id1SubmitSubmit#。关键转折点出现在我输入1时——页面突然蹦出MySQL报错信息。这个单引号就像钥匙插进锁孔的声音暴露出后端代码是直接用字符串拼接SQL语句SELECT first_name, last_name FROM users WHERE user_id $id为了确认注入类型我又测试了两组神奇的组合拳输入1 and 11返回正常结果输入1 and 12返回空内容这就像在问数据库两个问题11对吗当然对、12对吗当然不对。数据库诚实的回答让我们确认此处存在字符型SQL注入漏洞。3. 手工注入七步走3.1 判断字段数量输入1 order by 2#能正常返回数据但1 order by 3#就报错说明查询结果只有两列。这里的#号是MySQL注释符相当于把后面可能存在的单引号都给屏蔽了避免语法错误。3.2 定位回显位用联合查询来探测显示位置1 union select 1,2#页面第二列显示了数字2说明这里是数据回显位。我更喜欢用更直观的测试1 union select 左边,右边#果然页面上清晰显示出左边和右边两个词。3.3 提取数据库信息在回显位换上数据库函数信息就像开了闸的洪水般涌出1 union select database(),user()#返回结果告诉我当前数据库叫dvwa操作者账号是root——这相当于拿到了金库钥匙还知道了保安的名字3.4 爆破表结构information_schema是MySQL自带的元数据库相当于数据库的户口本。通过这个户口本可以查dvwa数据库的所有表1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadvwa#group_concat函数把多行结果拼接成字符串返回结果显示出guestbook和users两个表。看到users表名时我眼睛一亮——这里肯定存着用户凭证。3.5 获取字段明细继续深挖users表结构1 union select 1,group_concat(column_name) from information_schema.columns where table_nameusers#返回的user_id,first_name,last_name,user,password等字段名简直像拿到了数据库的藏宝图。3.6 提取核心数据最激动人心的时刻到了1 union select user,password from users#屏幕上赫然显示着所有用户名和MD5加密的密码用在线解密网站破解admin的密码果然就是password的MD5值。整个过程就像在玩数字版的密室逃脱每个SQL语句都是打开新房间的密码。4. 漏洞原理深度解析回头看DVWA的Low级别源码问题出在直接拼接用户输入$query SELECT first_name, last_name FROM users WHERE user_id $id;当我输入1 union select 1,2#时最终执行的SQL变成SELECT first_name, last_name FROM users WHERE user_id 1 union select 1,2#攻击者通过精心构造的输入把原本的数据查询变成了查询任意指令的组合拳。这就像去餐厅点餐时服务员把你的点菜单和厨房操作手册一起交给了厨师。5. 防御措施对比DVWA的四个安全级别展示了防御手段的进化史Medium级别用了mysqli_real_escape_string过滤特殊字符但数字型注入仍可能绕过。High级别增加了LIMIT 1限制和页面分离给自动化工具制造障碍。最严密的Impossible级别则祭出三大杀器PDO预处理语句CSRF令牌验证严格的类型检查$data $db-prepare(SELECT ... WHERE user_id (:id) LIMIT 1;); $data-bindParam(:id, $id, PDO::PARAM_INT);这种参数化查询就像把用户输入装进防爆箱再处理彻底切断了注入通道。