搜索
写经验 领红包
 > 电器

sql盲注的原理(sql盲注是什么意思)

导语:SQL 盲注攻击实战

6.1 SQL 盲注的分类

  上一章介绍了按照注入类型,SQL 注入可以分为普通注入和盲注。当注入的页面无法直接显示数据内容,就只能靠盲注来猜解。盲注又可以具体分为布尔型盲注和延时型盲注。    布尔型盲注是指注入页面中没有直接显示数据内容,但会显示输出的结果对还是错,查询的数据有还是没有。比如输入的 ID 值查询到有该记录,就在页面上显示该记录存在;如果输入的 ID 值不存在,页面上就显示记录不存在,除此之外没有任何更多的信息,我们通过注入构造的任何 SQL 语句也只能返回存在或者不存在两种结果。通过返回结果的对或错来判断构造的 SQL 语句是否成立,这种盲注方式就是布尔型盲注。    对于某些 SQL 注入页面,可能页面中任何信息都不返回,甚至连记录是否存在都不告诉你,这时布尔型盲注也就无效了。但是基于 sleep() 函数可以实现延时查询,我们可以构造一个判断语法,如果返回结果为真,则延时 5 秒再进行查询操作。那么我们就可以通过观察提交 SQL 注入语句后,页面响应是否有延时卡顿,来判断我们构造的 SQL 语句是否成立。这种盲注方式就称为延时型盲注。

6.2 Low 级别 SQL 盲注攻击实战6.2.1 布尔型盲注

设置安全级别为 Low,点击 SQL Injection (Blind) 按钮进入 SQL 盲注攻击模块,随便输入 ID 值,发现只返回一个结果 User ID exists in the database,告诉我们该 ID 存在,没有显示关于该 User 的任何信息,如图 6-1。说明该页面只能通过盲注来攻击

图 6-1

文本框中输入 1 and 1=1 和 1 and 1=2 都返回结果 exists,说明不是数字型注入点,如图 6-2,图 6-3

图 6-2

图 6-3

在文本框中输入 1&,返回结果 exists,如图 6-4,输入 1&,返回结果 MISSING,说明存在 SQL 注入漏洞,为字符型,如图 6-5

图 6-4

图 6-5

在文本框中输入 1&,返回结果 MISSING,说明当前数据库名长度大于 1 个字符,截图略

length(database()) //当前数据库名的长度

逐个猜测数据库名字长度,直到输入 1& 时,返回结果 exists,说明当前数据库名长度为 4 字符,截图略

在文本框中输入 1&,返回结果 exists,输入 1&,返回结果 exists,说明数据库名的第一位字符是小写字母。(小写字母 a 的 ASCII 码为 97,小写字母 z 的 ASCII 码为 122),截图略

substr(database(),1,1) //截取数据库名称,从第一个字符开始截,一共截取1个字符

ascii() //取括号中的字符的 ASCII 码

通过增加数字 97 来逐步缩小范围,直到输入 1&,返回结果 MISSING,说明数据库名的第一个字符的 ASCII 码正好是 100,也就是小写字母 d,截图略

在文本框中输入 1&,返回结果 exists,输入 1&,返回结果 MISSING,说明第二位字符是小写字母 v,截图略

使用相同的方法,最终可以猜测出数据库名为 dvwa

在文本框中输入 1&,返回结果 MISSING,输入 1&,返回结果 exists,说明当前数据库中存在 2 张表,截图略

在文本框中输入 1&,返回结果 MISSING,逐步增大猜测数字,直到猜测数字 9,返回结果 exists。最后得知数据库中第一张表名长度为 9 字符,截图略

select table_name from information_schema.tables where table_schema=database() limit 0,1

//查询当前数据库中的表名,只取第 0 和第 1 条记录之间的记录,也就是查询出的第一张表名

在文本框中输入 1&,返回结果 MISSING,逐步增大猜测数字,直到猜测数字 5,返回结果 exists。最后得知数据库中第二张表名长度为 5 字符,截图略

select table_name from information_schema.tables where table_schema=database() limit 1,2

//查询当前数据库中的表名,只取第 1 和第 2 条之间的记录,也就是查询出的第二张表名

在文本框中输入 1&,返回结果 exists,输入 1&,返回结果 exists,说明第一张表名的第一位字符为小写字母 (原理同第 6 步)

逐步缩小范围,最终可确认第一张表名的第一位字符为字母 g。输入 1&,猜解第一张表名的第二位字符,过程略

输入 1&,猜解第二张表名的第一位字符。重复上述步骤最终可猜解出两个表名分别为 guestbook 和 users,过程略

输入 1 and (select count(column_name) from information_schema.columns where table_name=&39;)=1 39; and length((select column_name from information_schema.columns where table_name=&39; limit 0,1))=1 39; and ascii(substr((select column_name from information_schema.columns where table_name=&39; limit 0,1)1,1))<9739; and ascii(substr((select user from users limit 0,1),1,1))<9739; and sleep(5)39; and if(length(database())=1,sleep(5),1)39; and if(length(database())=4,sleep(5),1)39; and if(ascii(substr(database(),1,1))>97,sleep(5),1)39; and if(ascii(substr(database(),1,1))<9122,sleep(5),1)39; and if (要猜解的条件,sleep(5),1) 注释掉;对于 sleep() 函数,正常使用布尔型盲注就可以了

设置好 Burpsuite 和浏览器的代理,随便输入一个 ID 值,拦截数据包后,第一个数据包正常放行,修改第二个数据包,在 cookie:id=1 后加入 &,返回结果 MISSING,如图 6-10,图 6-11;加入 &,返回结果 exists,如图 6-12,图 6-13。发现可以成功注入,并猜解出当前数据库名的长度为 4

图 6-10

图 6-10

图 6-11

图 6-12

后续猜解步骤思路与 Low 级别一致,只需要在 Burpsuite 中对 cookie 值进行注入即可

6.5 Impossible 级别 SQL 盲注攻击

  设置安全级别为 Impossible,查看 SQL 盲注页面源码,发现使用了 PDO 技术,几乎彻底杜绝了 SQL 注入;另外还使用了 Anti-CSRF token 机制,使用随机 token 来阻止自动化注入。该防御机制下,SQL 盲注几乎无法实现,如图 6-13  

图 6-13

本文内容由小媛整理编辑!