sql盲注讲解

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-04 16:52:46

盲注

有时候,开发人员不会把数据库报错信息显示在前端页面,这样就使我们想要通过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。

判定的方法就是根据请求响应的时间来判定,其他操作跟布尔型雷同。




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!