布尔型与时间型手工盲注
在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办?
例如应用程序就会返回一个“通用的”的页面,戒者重定向一个通用页面(可能为网站首页)。
这时,我们之前学习的 SQL 注入办法就无法使用了。
盲注
盲注即在 SQL 注入过程中,SQL 语句执行选择后,选择的数据不能回显到前端,
我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
SQL 盲注分为三大类
基于布尔型 SQL 盲注
逻辑原理
输入语句 select ascii(substr(database(),1,1))>xx 其中xx自由变换 <>=也可以变换
;通过对比据库表名的第一个字符。ascii 码的长度,判断出数据库表名第一个字符
substr()函数
substr(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定在字符串的何处开始。
length(可选)规定被返回字符串的长度。
那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用 length 来判断表名的长度
例如输入语句:select length(database())<xx;
web页面操作
输入 sql 语句:vince' and ascii(substr(database(),1,1))=112#,
不断修改112ascii码 显示信息出来则为正确,通过这个方法,
就能得到后台数据库的名称的第一个字符的 ascii 码
转码工具 char (112)
得到第一位密码
基于时间型 SQL 盲注
base on time(时间型)盲注
可以通过后端的执行时间来进行注入。这里会用到的 payload: vince' and sleep(x)#
基于时间的延迟,构造一个拼接语句: vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#
如果猜测真确,那么就会响应 10 秒
例如vince' and if(substr(database(),1,1)='p',sleep(10),null)#
再 web控制台下,判断出 database 的表名的一个字符为p
逐步向下获取数据
基于报错型 SQL 盲注
注意
实际操作中通常不会使用手动盲注的办法,可以使用 sqlmap 等工具来增加盲注的效率。