sqlilabs6
接下来是第二部分的21关
其实感觉和第20关没有多大差别,我们看看源码吧 发现还是有点差别的 比如说:
有一个**$cookee = base64_decode($cookee);**
好像是将cookee给编码解密了,说明前面肯定还有一个加密,我们用burp suit抓包试试
果不其然 他的cookee被加密了 我们直接网页搜索解密软件 然后发现结果是 admin
然后我们利用这里来注入一下 看下源代码 发现是’)单引号组合括号的 ,然后我直接输入’) and 1=1# 发现他报错了
\Issue with your mysql: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation ‘=’**有点奇怪 我们再来看看源代码
可以发现这边这个使用的是encode
base64_encode是加密,而base64_decode是解密
所以我们来思考一下他代码是如何运行的
他是这样的 如果账号密码正确 则保存你此时的cookies,并且加密发送,所以我再burp suit抓包的时候,抓到的用户名就是加密的,然后跳转到下一个页面,在这个页面中要利用cookies输出账号密码,所以他又解码输出了,而这个时候如果我们要利用burp suit修改cookies的数据达到注入的目的,我们就需要将我们的注入语句也进行加密,这样他解密以后才会被mysql识别并执行命令。OK 大概了解整个运转过程后,我们寻找注入点
发现在下面 有个’)单引号加括号的注入点,然后我们在burp suit注入试试uname后面的那串东西是1’)and extractvalues(1,concat(‘‘,database(),’‘))# 经过base64位编码以后的结果
这个又是什么神仙报错???? 但是我们可以看到有个security 我们数据库的名字的出现 但是为了避免不是偶然我们再试试看,我无语了 原来是我函数名输错了,应该是extractvalue 所以正确的界面应该是
OK 利用报错注入成功
第22关
这一题和上一题又有点不一样,题目说是基于双引号的注入
但我们从这个语句可以发现,他不是直接在select里面添加双引号 而定义一个$cookee1 并且这个cookee1=”$cookee”
其实按照php的语法上面那个其实可以等价为下面那个,但是我不知道他为啥要这样操作?更安全吗?
然后就直接把上一题的单引号和括号换成双引号就行,其他的没啥区别
23关
23关 又回到了以前熟悉的界面 但是好像跟之前的有不太一样,因为加了单引号报错 加了双引号和and1=1 and1=2 却不报错 让我们再来研究一下源码
这里介绍一个函数
preg_replace替换函数
preg_replace 函数执行一个正则表达式的搜索和替换。
语法:
preg_replace(要替换的东西,替换成啥东西,哪个里面的东西需要替换);
知道这个以后我们不难发现,再上面这个代码中 我们的注释符需要替换。 那么注释符被替换我们该如何实现注入呢?
我们要回归使用注释符的本质:没加注释符前后面的语句因为没有闭合所以会报错,所以我们加了注释符直接让其消失就好了,而现在没了注释符,我们就需要将语句闭合起来,使其不报错,叫做单引号闭合绕过这个其实之前遇到过 加了超级多引号,我看太麻烦就没去试,今天看来不得不试了!!!
在之前更正的原理中,我们知道了闭合单引号的真相,所以这关现在就显得很简单了
有个问题:为啥order by 在这里好像不管怎么放置都是错误的,这就很纳闷了??order by 后面加数字,加字段名都是可以的,但是字段名是不可以带引号的,意思是让这个列排序,但是因为单引号闭合后里面的数字变成字符串了这就产生了语法错误。
更本质的说法是:不只order by,凡是字符串但又不能加引号的位置都不能参数化;包括sql关键字、库名表名字段名函数名等等
来自46关的一个补充纠错
payload:?id=-1’union select 1,database(),’3 这个时候数据库就出来了
payload:?id=-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=’security’ or’1=1
第24关
这关就和之前的很不一样了
查阅资料后 知道一件事:SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入
什么是二阶注入:
1.构造带有注入语句的危险payload1数据,在http请求中提交到服务器当中,该数据会被服务器存储到数据库当中
2.当我们要修改该payload1数据的时候,程序在检索存储payload1的数据库的时候将会造成SQL注入,如果攻击成功,在第二次响应中返回结果
3.也称为存储型注入,将可能造成sql注入的语句存储到数据库中,当再次调用该数据的时候,就可能发生SQL注入。
先来看看源码
先从index.php看起:一开始就是一个session_start()函数
seession:
https://blog.csdn.net/zhengxijia2012/article/details/73437376
谈谈我的理解,为什么我们一开始cookies可以在多个页面保存使用,就是因为有这个session函数发挥作用
然后在其他源码中,我们不难发现,基本上每个数据都有过滤操作,但是我发现 在pass_change的时候,他的username是没有过滤操作的
如上,在下面的update语句中 username是直接从数据库被调用的,这就意味着我们可能可以通过这个数据进行注入(二阶注入),如果我们要利用这点,也就是说我们必须有数据是带有危险字符的存储在数据库当中,那么接下来,我们需要在数据库中构建这样一个数据,从上面的代码中我们发现他的username是用单引号闭合的,所以我们需要构建一个单引号注入的数据——admin’# ,这里有个问题:不是被转义了吗,为啥在数据中还会以单引号的形式存在,这是因为转义只是暂时的,存储以后还是以单引号的形式存在的
有错就die网页,so 报错注入不行
2.延时注入
有字符数限制,所以不行
第25关
首先看一下源代码:发现定义了blacklist()函数
作用如下,就是过滤掉 or 和and,那么我们该如何绕过呢?
看到这个我们就知道是单引号注入,接下来我试着构建payload试试
从那个preg_replace函数中我们可以看出,他是将or转义成啥都没有,所以有一种思路是,在and里面插入and 转义完后即可留下我们本来的语句
所以payload
1 | ?id=1'aandnd 1=2 --+ |
其他绕过方法
绕过思路:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/or/
(4)利用符号 and=&& or=||
(5)双写绕过
https://blog.csdn.net/qq_42181428/article/details/105061424?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control 这个是关于绕过的以及CTF题目的一篇文章,感觉还挺厉害
我又没保存博客人傻了——-
第25关a和25关没多大区别
26关
先研究一下源代码
首先是一个新函数
fopen()函数
fopen()函数用于打开文件文件或者URL,
语法:
fopen(filename,mode,include_path,context)
而在这个里面的意思是 打开那个txt然后写入数据。
我们接着往下看
在这关当中,他过滤了很多东西 我们依次来看看吧,分别是:
三种注释符,空格,还有反斜杠,还有and,or(这里要特别注意information里面有个or所以也会被过滤, 所以在注入的时候记得注意也要双写)
好了 接下来我们开始试着绕过:
1.因为空格被过滤了,所以我们可以采取是用括号的方式绕过这个过滤
2.由于注释符过滤,除了用一些特殊的字符代表注释符,我们这里先采用闭合单引号的方式绕过,那么我们知道,单引号内的内容会被转变成字符串,所以有用到数字的方法在这里都行不通,使用union拼接语句的时候,可以获取到数据库,但是再往下由于要使用limit所以也不行了,所以这里我们采取报错注入的方式:
构建payload:
//?id=1’aandnd(extractvalue(1,concat(‘‘,database(),’‘)))aandnd’1’=’1//
//?id=1’aandnd(extractvalue(1,concat(‘‘,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)=’security’),’‘)))aandnd’1’=’1//
第26a关
这关和26关没有多大区别,唯一区别是这里需要采取单引号+括号的形式来注入
还是有其他区别的,比如在这关当中,他是不输出报错信息的,并且因为是采取单引号+括号闭合方式进行注入的,如果我们想要时间盲注的方式,也不太行因为闭合以后,单引号加括号里面的内容就会变成字符,跟之前用不了order by是一个意思。
查了一下好像确实只能用%a0进行绕过了,然后接下来需要安装一下虚拟机
第27关
这关过滤的是
这关过滤的有如下内容,但是我们可以发现,这次没有过滤and但是过滤了select和union还有注释符那些
然后我们可以发现,这一次的正则表达式和前面几个又有点不太一样,反斜杠后面又多了一些字母
作用如下:
https://blog.csdn.net/onthewaygun/article/details/10009021?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control根据以上资料 我们可以知道,这次的正则表达式替换的更加牛,他是一直在替换,就是说不能双鞋,因为你双写完以后替换过一遍,待会还会再替换一次,所以这里我们只能采用大小写混搭的方式进行注入
//刚刚居然崩溃了–导致没保存。。成年人的崩溃就在一瞬间。。。。。。//
那我们接下来构建payload:
?id=1’and(extractvalue(1,concat(‘‘,database(),’‘)))and’1=1
?id=1’and(extractvalue(1,concat(‘‘,(seLeCt(group_concat(table_name))from(table_schema))=’security’),’‘)))and’1=1
下面也是这样的一套组合拳,其实我发现,我们可以利用报错注入的原因是在报错注入的时候我们可以将所有数据一起报错出来(group_concat)函数,但是当只能使用时间盲注的时候就没办法了,因为都是需要数字说明截取。
这里有个问题,为什么在下面的查询语句中or无法报错,但是and可以报错
27a关因为无报错信息所以只好采取时间盲注或者union select联合注入,然后就需要用到特殊转义字符。。
开始搭linux系统
第28关
感觉还是需要使用linux系统进行操作会比较方便一些,用括号的方式进行闭合太累了
28a关也和这个差不多
小结一下:
1.最近做的都是被过滤的题目,要如何绕过过滤方法也就是这几种似乎也没啥好说的了–
2.然后源代码的学习挺有用的,感觉看源代码对于整个过程会更了解一些,然后注入的过程也更有感触了。
参考链接:https://www.cnblogs.com/forforever/p/13764024.html