盲注
有时候,开发人员不会把数据库报错信息显示在前端页面,这样就使我们想要通过union注入或报错注入的攻击方式难以实现。
当不显示报错信息的时候,我们还可以通过盲注的方式来对数据库进行注入攻击。
盲注,顾名思义,就是在页面没有提供明显信息的情况执行的注入方式。
盲注又分为两种,布尔型盲注和时间型盲注。
布尔型盲注,以sqli-lab第8关为例:
1、输入id=1正常显示,输入id=123456显示与正常不同,显示为空,输入id=1'不报错,但是显示也是为空
这里输入id=1' 的时候,可能是两种情况。一种就是1’被当做字符串处理,数据库查询的就是id="1'",这样数据库中没有这个值,所以查询为空,跟id=123456相同。
另一种就是单引号被拼接进数据库语句中,形成注入,然后前端没有报错信息显示,所以返回为空。
2、通过构造sql注入语法来尝试,发现这里就是存在sql注入。
我们已知的是1=1和1=2显示不同,没有其他任何信息。这种情况下就称为布尔型盲注。
3、布尔型盲注会利用到数据库中的一些表达式:
length() :字符串长度
substr():截取字符串
ascii():字符串的ascii编码
4、布尔型盲注的要点就是通过不停发送数据包,对结果进行真假判断,从而得到正确结果。
a.1' and length(database())=1--+ 对当前数据库名的字符串长度进行确认,只有当最后的长度为正确长度时候,页面就会返回id=1时候的正确页面。类似于1' and 1=1--+
通过burpsuite的fuzz方式得到数据库长度为8
5、知道长度之后,就需要对字符进行确认,实际上原理都一样
1' and substr(database(),1,1)='a'--+
通过database()这个表达式表现数据库名,然后从左起第1位开始截取1个字符,以此类推,直到得到所有结果为止。
6、通过burpsuite的手工方式可以让大家明白盲注的原理。但是盲注一般不推荐手工,但原理必需明白。只有明白了原理才能写出盲注的自动化利用脚本。除了自己写脚本外,也可以使用sqlmap之类的工具帮助你盲注。
时间型盲注
当不管我们如何输入,页面信息都没有任何变化的时候,不提供给攻击者任何有用的信息,这时候就只能尝试时间型盲注。
时间型盲注就是在布尔型盲注的基础上增加了时间的判断。
时间盲注的关键函数是if(),sleep(),通过对布尔型注入的判断,辅以时间延迟的方法,来最终获得注入结果。
以第9关为例:
1' and if(length(database())=1,sleep(5),1)%23
if(length(database())>1,sleep(5),1) 如果数据库名字符长度大于1为真,则mysql休眠5秒,否则查询1。
判定的方法就是根据请求响应的时间来判定,其他操作跟布尔型雷同。