第13课:暴力破解漏洞

第13课:暴力破解漏洞

本课旨要:了解 SQL 注入中的盲注技术,如何利用盲注技术有效的进行攻击。

SQL 为什么有盲注呢

因为我们前面所讲的,都是有报错的,也就是加了单引号或者 and 1=2,提示报错了我们猜能判断是存在注入的。

但是有些程序员已经隐藏掉了数据库的报错信息,无论在页面输入什么 SQL 注入语句,都会显示一个结果,这样来说,我们进行手工 SQL 注入的时候将无法根据报错信息来判断我们所输入的语句执行结果,就是你不知道你输入的 and 1=1 还是 and 1=2,服务器到底带进去查询了没有。

不知道,就是盲,SQL 注入中不知道 SQL 报错信息,即为盲注。

那么如何去测试基于盲注的 SQL 注入呢?

这时候就可以换个角度考虑一下,既然无法获得基于报错的信息来判断结果,那么可以基于逻辑的真假不同结果来进行判断。

我们都开 DVWA,找到 SQL 盲注进行测试。

enter image description here

在 SQL 盲注这个表单里,输入单引号进行测试,发现页面不返回任何信息。接着尝试了 and 1=1 和 and 1=2 之后,也是不显示报错信息。

是不是说明 SQL 注入不成立?

存在这种可能性,但不是一定,输入单引号不存在报错,也无法证明他是安全的,基于盲的注入技术。

既然不给报错,那么可以用以前讲的逻辑来测试。

enter image description here

使用语句 1‘and 1=1 发现可以查询,输入 1 结果为真,输入 and 1=1 ,结果也返回真,逻辑关系就是真和真,结果肯定是真。

那么测试 and 1=2 呢?看看是否执行了。

enter image description here

逻辑假的关系,发现页面也不返回信息,那么可以断定,目标服务器存在 SQL 注入,语句被服务端接受执行了。

接着就可以正常注入了。

测试语句:

1’ and 1=1 # 
1’ and 1=2 # 

判断这两种不同的输入是否有不一样的显示,如果一个正常一个通用的错误提示或者啥也不显示,那么就可以断定存在 SQL 注入。

然后可以使用 order by 语句来确定字段,前面讲的都比较多了,就不放图了。

在猜解数据库库名的时候,可以使用二分法来猜解,使用按位与的逻辑运算来进行判断。

具体命令举例如下:

1' and ORD(MID(database(),1,1))&1>0 #

其中 ORD() 函数负责将相应的字符转换成 ASCII 码,MID() 函数实现在第一个参数的字符串中从第二个参数指定的位置开始(1 为起始位置)截取数量为第三个参数的数值的字符串。后面的&1>0表明在该字符的 ASCII 码的二进制表示中最低位是否为 1,若为 1 则 >0 为真,否则为假。如果&的是 2 或者 4,则相应的就是比较二进制从低到高的第二位或第三位,128 对应的就是最高位也就是第八位。

输入1’ and ascii(substr(databse(),1,1))>97 #,显示存在,说明数据库名的第一个字符的ascii值大于97(小写字母a的ascii值);
输入1’ and ascii(substr(databse(),1,1))<122 #,显示存在,说明数据库名的第一个字符的ascii值小于122(小写字母z的ascii值);
输入1’ and ascii(substr(databse(),1,1))<109 #,显示存在,说明数据库名的第一个字符的ascii值小于109(小写字母m的ascii值);
输入1’ and ascii(substr(databse(),1,1))<103 #,显示存在,说明数据库名的第一个字符的ascii值小于103(小写字母g的ascii值);
输入1’ and ascii(substr(databse(),1,1))<100 #,显示不存在,说明数据库名的第一个字符的ascii值不小于100(小写字母d的ascii值);
输入1’ and ascii(substr(databse(),1,1))>100 #,显示不存在,说明数据库名的第一个字符的ascii值不大于100(小写字母d的ascii值),所以数据库名的第一个字符的ascii值为100,即小写字母d。

还有一种情况则是基于时间的盲注。原理是,当对数据库进行查询操作,如果查询的条件不存在,语句执行的时间便是 0,但往往语句执行的速度非常快,线程信息一闪而过,得到的执行时间基本为 0,根据页面返回的时间来判断是否存在注入,查询的语句是 sleep() 函数。

在 MySQL 中,sleep() 函数语法如下:

<span class="hljs-function"><span class="hljs-title">sleep</span><span class="hljs-params">(seconds)</span></span>

sleep() 函数代码执行延迟若干秒。

我靶机出了点问题,就不演示具体过程了,找了两篇有靶机演示的文章供读者阅读和参阅:CSDNfreebuf

总结

SQL 注入中的盲注技术需要各位读者掌握明白,无外乎三种方式,基于布尔型的 SQL 盲注、基于时间的 SQL 盲注、基于报错的 SQL 盲注。

上一篇
下一篇
目录