sql绕过less-23 less-25 less-26 less-27 以及一点http头注入 less-18 less-5

目录

sql绕过原理:

less-23(注释符绕过)

less -25(and和or的绕过 双写绕过)

具体使用:

less-26(空格的绕过)

具体使用:

less-27(union和select的绕过)

具体使用:

Http头注入

报错注入:

updatexml运用方法:(作用就是替换个xml块,可以进行百度查找具体含义)

具体使用:

extractvalue()运用方法:

具体使用:

less-5 利用报错函数floor


sql绕过原理:

后端为了防止一些sql攻击,在程序中禁用了一些常用的关键字以及注释符之类的东东,不过如果没有进行深层次的分析过滤,只是过滤了整体,是可以通过一些措施进行绕过。

1.大小写绕过,例如:AnD 1=1

2.双写绕过,比如 union 在程序员处理时被替换为空,那需要我们可以尝试把 union 改写为 Ununionion 红色部分替换为空,则剩下的依然为空,可以结合大小写过滤一起。

3.编码绕过,可以通过一些url编码,比如将空格进行url编码,通过编码来代替空格,形成绕过

4.内联注释绕过

在 Mysql 中内容注释中的内容可以被当作 SQL 语句执行。例子  /*!select*/ * from admin。/*! ... */ 是一种条件注释,它允许开发者编写特定于MySQL版本的SQL代码。(ps:需要在mysql5.0以上的环境才能执行)

less-23(注释符绕过)

在一些情况下,开发人员会将注释符进行绕过,比如把常见的注释符--+ -- #等全部替换为空,导致注释符无法在url上使用。该靶场就是一个对于注释符绕过的例子

如上图,启动靶场后,输入在?id=1' 出现了报错的提示(真实环境没这种东西)并且报错提示的报错是引号没有对此进行闭合。

输入注释符--+后,发现报错依然存在,可以初步判定,此地可能存在了一个关于注释的过滤。

这时就要想个办法可以不使用注释符,并且可以sql语句。 or ’1‘=’1 来对其进行绕过(上图),原理如下:   正常情况下,在添加了?id=xx后,后端给数据库会传递一下类似于下面的信息,来判断数据库中是否存在该id的数据。。

select * from user where id = '用户输入的信息'

而此次对了注释符进行了禁用,因此会想到使用or来进行绕过。

select * from user where id ='用户输入的东西 or 1=1'

其中,需要想办法让这个or逃逸出来,因此,需要在or的前面添加上一个',先让前面的id进行闭合

变成 id='xx' or 1=1'  此时,注释符已经被过滤,而后方又多出来一个引号,在sql语句中,引号是要成双成对出现的,因此,可以再添加一个'让后面那个1闭合 语句变成 id ='xx' or 1='1',此时,一个普通int类型的1不可能会去等于一个字符串(string)类型的1,因此前面那个1也需要加上两个引号,语句为:

select * from user where id='xx' or '1'='1'

因为or语句的原因,一边为真即为真,成功完成过滤。(真实情况闭合的可能不一定是' 上面的绕过当前的写法只是基于该靶场)

上图的sql语句因该为 select * from user where id ='xx' union select 1,2,'3'

3前面的引号是为了与后面的引号完成闭合

通过上面的讲述,使用union select对其进行语句查询。

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() and '1'='1(上图语句)

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and '1'='1

?id=-1' union select 1,(select group_concat(username,0x3a,password)from users),3 and '1'='1

ps:因为sql语句中,union select 和 from不可以一起进行使用,因此将读取数据的语句再重新进行一次查询,让union select不用与from产生接触。

【?id=-1' union select 1,group_concat(username,ox3a,password) from users,3 and '1'='1】这样写是错的

less -25(and和or的绕过 双写绕过)

和此前一样,后端可能会对and 和 or 这样的关键字进行绕过,并且这种关键字很可能是连大小写都会进行。通过观看靶场代码,可以看到 /i表示大小写,这里无论or和and是小写还是大写,都会进行过滤。

因此可以尝试通过双写和注释进行绕过。

?id=1 --+

先对其进行查看,发现是个数值型注入

输入1=1后,由于这是个练习的靶场,下面会出现语句执行后的结果(真实情况基本都是盲注,咱先练)可以发现刚刚输入的and消失了,基本确定这个靶场会对and进行一个过滤(or也一样)

前面已经看过源码(正常看不见,这里偷个懒),可以知道大写的字符也无法进行绕过,因此可以尝试双写绕过对其进行绕过

?id=1 aandnd 1=1 --+ 可以发现,在and里塞了个and,就成功过滤了。因为这里的后端只是对and和or的整体进行了了一次替换。就是将关键字替换为对应的空。此处 aandnd红色部分替换为空,剩下的依然为空,所以and成功显示出来。

也可以通过&&来代替and,进行绕过(or也一样,也可以使用||进行绕过)ps(and和or的双写格式可以随意)

具体使用:

?id=-1' union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where table_schema=database() --+

less-26(空格的绕过)

反正都是后端过滤,偷个懒,看源码(当前在docker环境下,因此可以进到docker的容器内进行查找 命令:docker exec -it sqli-labs bash (如果把靶场名字改了这也要改)     phpstudy下也可直接查看)

可以发现,这个过滤了or and \* 空格等一些关键字。

因此,这里可以尝试通过编码对其进行绕过。

因为靶场有报错提示,直接判断这里是单引号闭合(真实情况可能不太好判断,需要多输入一些参数(符号)测试)。

可以发现空格 and 和注释符全部都进行了过滤

可以发现,除了and可以进行双写绕过,其他都没有任何作用,因此考虑使用编码进行绕过。

编码: hex,urlencode 空格 URL 编码%20
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空字符

?id=1'%0Aanandd%0A'1'='1%0A    这里的%0A相当于新建了一页,可以用他来代替空格的使用(%0b也是可以的,都是为了分割两边的语句)  and这里则接着采用双写的方法,因为注释符被过滤了,而前面已经验证了个url的闭合方式为' 闭合,因此可以通过前面讲的注释符绕过直接将其绕过。

此外,还可以通过?id=1' ||'1进行绕过  将其转为sql语句进行理解:

select * from user where id='xx || 1'

拆分该语句 为了完成绕过,需要先将id进行闭合 因此语句为 id='xx' || 1',此时多了个单引号出来,因此需要将其闭合,变成id='xx' || '1',语句为id='xx' || '1' 这时,因为||是可以替代or来进行使用的(这个是学计算机的基本常识),在语法中相当于或者,而此时右边的 '1' 永远为真(因为 '1' 永远都是’1‘ )因此可以通过该语句直接完成绕过。

具体使用:

ps(下面这个?记得一起加到url里)

?id=0%27%a0union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()%a0anandd%a0%271%27=%271

less-27(union和select的绕过)

过滤了union select关键字(源码看的,嘻嘻)

判断注入点为字符型

发现注释符和空格全被过滤。此时可以根据上面所学,先对空格进行绕过,成功绕过

?id=1'%0Aand%0A'1'='1

准备开始用union select查询,发现union select被过滤了。此时先别慌,目前知道注释符,空格和union select被过滤了,但不知道union select是被关键字过滤还是其他什么,因此可以先试着用大小写进行测试

?id=1'%0Aunion%0Aselect1,2,'3

发现使用大小写成功绕过

?id=0'%0AuNIon%0AsEleCt%0A1,2,'3

具体使用:

ps(下面这个?记得一起加到url里)

?id=0'%0AuNIon%0AsEleCt%0A1,group_concat(table_name),3%0Afrom%0Ainformation_schema.tables%0Awhere%0Atable_schema=database()%0Aand%0A'1'='1

Http头注入

   http 头注入介绍: 在安全意识越来越重视的情况下,很多网站都在防止漏洞的发生。例如 SQL 注入中,用户提交的参数都会被代码中的某些措施进行过滤。 过滤掉用户直接提交的参数,但是对于 HTTP 头中提交的内容很有可能就没有 进行过滤。例如 HTTP 头中 User-Agent、Referer、Cookies 等。ps(这些都是数据包内很重要的东西,其中 User-Agent俗称ua头,作用是判断你登录该网站的是手机还是电脑,Referer:判断你的数据是从哪里访问的(从哪来的)Cookie:服务器委托浏览器存储在客户端里的一些数据,这些数据通常都会记录用户的关键识别信息)

启动靶场,并进行抓包,可以看到,将账号密码都为admin发送出去后,界面会接收一个UA头的信息,可以直接看到浏览器的内核信息(ps:下面那张图片咋开的前面说过)

http注入产生条件:1 获得头信息 2 没过滤 3 与数据库有操作,在真实环境下,我们是看不到源码的,因此如果能得到这种头信息,需要先尝试手工进行注入(http注入和sql注入是不一样的,http基本都是通过insert来进行的插入)

加入\的原因主要是为了让服务器内出现如解析错误,通过\导致转义出现错误等情况,导致了服务器回显错误信息,这里的错误信息和UA头是没有任何关系的,因为这个\加在后面,并不是UA出现的问题。(ps:不是所有这种http头加入\就会返回报错信息,主要还是根据服务器具体的实现与配置来决定。)可以发现,报错信息显示的是ip和一个admin,根据此前所学sql注入的报错,可以判断这个地方是有个注入点。需要通过sql注入中的报错函数来完成http头的注入。

此前没讲过报错注入,这里简单提一下

报错注入:

报错注入主要是通过函数的报错来获取想要的信息,可以举一个简单的例子:

sum(int,int)

这是一个非常简单的求和函数(sum就是求和函数),往里面传入两个int(整数)类型的数据就可以实现简单的求和。但这时我偏不给他传入int类型的数据,我给他传入string(字符串)类型的数据

sum(string,string)

此时,由于传入的类型是string,并不是上面的int,这里就会出现报错。但在mysql中,如果出现报错(比如这两个string出现报错),是会把报错的参数给输出出来的。(比如这两个string的参数为’张三‘,’李四‘,放到这个sum里面,这个sum函数就会报错,把’张三‘和’李四显示出来‘)。(因为sum只接收int类型的函数)

所以,如果我此时我把这个string类型的参数写成database(),这时sum得到的参数便是

sum(database(),string)

而这个sql语句(也就是database()),他会先执行,得到一个数据库的名字,但由于这个数据库的名字也是一个字符串类型的名字,他就会把这个错误显示出来,也就是sum函数执行之后会显示这个数据库的名字,攻击者就可以通过该报错知道数据库的一些信息,从而达成一个报错注入的基本要求。

http头的注入运用到了updatexml()函数与extractvalue()函数

updatexml运用方法:(作用就是替换个xml块,可以进行百度查找具体含义)

updatexml(XML_document,XPath_string,new_value);(基本只用xpath,剩下两个用不上)

XML_document:String 格式,为 XML 文档对象的名称,文中为 Doc

XPath_string:Xpath 格式的字符串,代表路径。

new_value:String 格式,替换查找到的符合条件的数据

' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1 --+

这条句子中,前面的' 和此前的sql注入一样,先将前面闭合(也可以根据最开始输入的那个\的图片看出来)。updatexml为函数名字,左边和右边的2个1就是用不上的东西,利用concat将0x7e和那个select查询函数连接起来(concat不知道是啥速度去复习mysql) 0x7e就是键盘上1左边的那个小波浪线。这里先提一下,因为上面所说,这条xpath的路径,他运用到了一个语法叫做XPATH语法,

这是一种在xml中查找信息的语法(具体怎么用可以去查查,还可以用它来爬虫哦~),而对于xpath语法而言,使用这种语法的话,这种语法是不允许有~(波浪线)存在的,如果存在波浪线,这个xpath语法就是报错。而我们这里的http头注入所运用的报错函数,他就是需要~才能导致报错的出现,因此只要存在波浪线,就可以确保这个函数报错。而0x7e就是十六进制的~, 在sql语言中直接执行十六进制数据库是认识的,至于为什么两个0x7e一方面是确保报错,一方面是确保报错,另一方面是为了格式好看。ps(某些老师说这个只是为了格式好看是错误的哦) 

而中间的select语句就是查询语句,此处为查询版本。后面的or ’1‘=’1也就是前面讲的,对前面的东西进行闭合,就不用再加注释。

具体使用:

' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '1'='1

extractvalue()运用方法:

extractvalue 函数的基本格式为:

ExtractValue(xml_frag, xpath_expr)

extractvalue 函数接收两个字符串参数,一个属 xml 标记片段和 xpath 表达式 xpath expr

简单来说 第一个标记片段没有用,第二个xpath expr用来写路径(和上面那个一样,不过这就两个)

' and extractvalue('1',concat(0x7e,(select @@version),0x7e)) or '1'='1

该函数运用方法和上面的 一样,不过多赘述。

具体使用:

' and extractvalue('1',concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) or '1'='1

less-5 利用报错函数floor

对于这个函数,简单说一下。不用想着深入理解,咱这些菜菜的水平用不到那么高端,只需要理解如何去用好这个函数,能够进行攻击即可。

一、原理 通过使用 count()、floor()、rand()、group by 四个条件形成主键重复的错误

count():计算满足某一条件下的行数

floor():向下取整的函数

rand():生成 0~1 之间的浮点数(生成随机数)

count():group by:针对表中的字段来分组

floor() select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a) #

很简洁的原理概况:group by会把数据库里的数据分在一起,而数据库中,主键存在且唯一,而rand可以生成随机数,随机数自然是不确定的,如果随机数的数生成的数和主键的数一样,就会出现报错。(大概是这样,具体不会)实际情况下,只需要会运用select中的东西就可以了。

进入靶场

输入?id=1' 出现报错,根据报错提示,该报错为字符型

使用unio select查询依旧提示you are in ,优回显有报错,因此尝试报错注入。ps(此前已经知道几个表了,偷个懒)

?id=1' union select 1,2,3 from (select count(*),concat((select concat(version(),database(),user()) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

具体使用:

?id=1' AND (SELECT 1 from 
(SELECT count(*),concat(0x23,
(SELECT table_name from information_schema.`TABLES` WHERE table_schema = database() LIMIT 3,1),
0x23,floor(rand(0)*2)) as x from information_schema.`COLUMNS` GROUP BY x) 
as y)--+

0x23为#号,为了格式好看。

ps:输入过程中可能出现该报错,这个报错的意思是主键重复了,因为主键有且只能有一个,所以需要注意画圈那两地,得不一样才能耍。

这条payload是借鉴这位佬的,对于上述没懂这个floor的可以看看他的MYSQL floor 报错注入详解_mysql中floor的用法_mysql报错注入之floor报错详解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_45146120/article/details/100062786

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值