WEB注入类题目解析

后台登陆-实验吧

链接: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php
考点:利用MD5注入sql语句,绕过对关键字(or)的过滤
查看源代码发现:
在这里插入图片描述
其实链接中的ffifdyop的MD5值就是我们可以满足绕过的hash值:276f722736c95d99e921722cf9ed621c。是十六进制表示的,decode之后是’or’6,or之后有6不等于0即可绕过,不影响。
执行语句SELECT * FROM admin WHERE username = ‘admin’ and password = '‘or’6’。得到flag。

加了料的报错注入-实验吧

链接:http://ctf5.shiyanbar.com/web/baocuo/index.php
考点:报错注入,注入语句的特殊用法
根据提示利用POST上传username和password,带引号的注入会报错,说明注入成功了。需要构造语句:
第一条 查库名:
username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select database()),0x7e))or’
第二条 查表名:
username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema regexp database()),0x7e))or’
第三条 查字段:
username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name regexp ‘ffll44jj’),0x7e))or‘
第四条 查记录:
username=1’ or extractvalue/&password=1/(1,concat(0x5c,(select group_concat(value) from ffll44jj)))or’
可依此得到我们想要的内容,进而得到flag。
需要用到的知识:
1.http分割注入(用注释符/**/把中间的语句password注释掉)
2.extractvalue函数(解析XML,返回查询的语句?不太懂)
3.concat函数(concat(a,b,c)把字符串abc连起来,我也不知道为什么要连,前面后面还是0x7e?)
4.这道题过滤了等号,所以可以用 in(),regexp()’'等方法绕过
5.用到了group_concat()函数,因为查询结果有多行(多个表),这个函数的作用是将多行聚合为一行返回结果。

认真一点-实验吧

链接:http://ctf5.shiyanbar.com/web/earnest/index.php
考点:盲注,脚本跑数据库内容
1.提交1或用语句让框内为真,显示You are in。

2.提交语句有错误或语句让框内为假,不报错,但显示You are not in(实质和报错一样)

3.提交某些特殊字符会被过滤并显示sql injection detected,经过各种测试(可用Burp suite进行模糊测试或脚本提交敏感字符)发现过滤的字符有and,空格,+,#,union,逗号,

4.提交语句id=1’or’1’='2,如果网页对or没有任何处理的话,应返回You are in(因为后面的语句错误,相当于只提交id=1),但返回的却是You are not in,说明or被处理了。一般的后台处理逻辑是匹配or、or(不分大小写)、or+空格并替换为空。尝试改变大小写和用oorr代替,发现回显都为You are in,也就是说,后台处理应该是匹配or(小写),并将其替换为空,并且仅仅处理了一次。所以在接下来的语句构造中我们可以用oorr,OR等代替or。

那么接下来我们使用python脚本进行盲注
跑数据库名长度->跑数据库名->跑表名长度->跑表名->跑字段名长度->跑字段名(具体脚本代码不列出,参考上面给的链接,以下为一些对代码的解释。)
链接中脚本思想:通过构造 2’oorr(这里放语句)oorr’2 ,当括号中括号为真时,页面返回You are in ; 否则返回其他。

通过requests.post(url,data) 一个个将猜数字,猜库名表名字母的语句post上去,当"You are in" 出现在 requests.post(url,data).txt 时,说明返回成功,返回当前语句中猜测的字母,数字。

1.由于提取字符函数substr()被过滤了,用mid()函数达到同样效果

2.由于逗号被过滤了,在mid()函数中用from(%d)for(1)代替逗号分隔符,如mid((database())from(1)foorr(1))代表库名第一个字母(for中的or也被过滤了,所以用foorr)。

3.由于空格被过滤了,我们用
flag = flag.replace(’ ', chr(0x0a))
将构造语句中的空格用chr(0x0a),也就是换行符\n替代(这也行?),其实在原代码语句中,后面用括号代替空格的情况也可以改回用空格了。

4.提醒requests.post(url,data)中的data一定要是字典{id:“ ”}。

5.猜长度的语句和猜字母的一样,只不过放在后面的字母为’’,同时做一个计数器,当匹配到空时,说明名字匹配结束,返回计数器当前的数字就是名字长度。

6.(group_concat(table_name separatoorr ‘@’)
(group_concat(column_name separatoorr ‘@’)
用以上语句代替table_name和column_name,是因为可能有多个表段和多个字段,这个语句让多个表名,字段名一起输出并用@将之分隔。

7.最后有个小坑就是用脚本跑出来的数据长度13位不是实际的穿的长度,因为数据中含有的-是空格转义来的,脚本识别到就以为数据结束了(这里不是很明白,空格和空不是不一样么?为什么遇到空格就停了)。由上面可知,最后爆出的flag是flag{haha you-win!}中的-是空格,所以真正的flag是flag{haha~you win!}。
代码不再贴出。

登陆一下好吗-实验吧

链接: http://ctf5.shiyanbar.com/web/wonderkun/web/index.html
考点:构造永真语句
WEB注入类题目解析_第1张图片如图是一个登陆框,输入内容查询会报错,并且可以发现or被过滤掉了,我们可以构造永真的语句进行注入:
select , from , where username=‘t’=’ ‘and password=‘t’=’’;这是一个永真的语句。
输入到username和password即可得到flag。

Who are you?-实验吧

链接: http://ctf5.shiyanbar.com/web/wonderkun/index.php
考点:时间盲注,脚本利用
翻翻源码,抓抓包,乱试一通都没有什么结果
题目中提示有ip,立马应该联想到X-Forwarded-For
虽然知道是这个方面的题,但完全不知道从何入手,悄咪咪去翻一下wp
才知道原来X-Forwarded-For后面的的参数是先入数据库再取出来,并不是直接显示的
所以这里的X-Forwarded-For应该是存在注入的(果然是大佬,学到了)
而且经过测试,’,'以及后面的内容都会被过滤,这就导致我们的传统注入语句失效了
查了一下,这里需要用到select case when then语句

提交X-Forwarded-For:1’ and case when (length((SELECT concat(database())))<10) then sleep(3) else sleep(0) end and ‘1’='1;果然发生了延迟

剩下的就是用代码跑了…

因缺思汀的绕过-实验吧

链接: http://ctf5.shiyanbar.com/web/pcat/index.php
考点:sql语句绕过,返回行数限制,rollup用法
源代码中发现source.txt,打开看到代码,做了三层限制:关键字限制,返回行数限制,pwd判断。
WEB注入类题目解析_第2张图片
第一层限制发现or并没有进行过滤
第二层限制我们可以利用limit限制返回语句的行数1' or 1 limit 1 offset 0#返回“亦可赛艇”,注入成功。当注入1' or 1 limit 1 offset 2#时返回“一颗赛艇”,说明数据库共两行数据。
第三层限制,这里是个if判断,只要为true 就可以过,于是可以利用group by with rollup来绕过,group by with rollup会在统计后的产生一条null信息,然后在pwd里不写值,if就为true了。

说明一下with rollup语句是:在group分组字段的基础上再进行统计数据,数据的名称默认是null。
前面我们知道数据库共两行数据,因此可构造payload:1' or 1 group by pwd with rollup limit 1 offset 2#这里offset是2,即with rollup的统计数据的存放处,行名为null,即可使if为true,成功绕过。

你可能感兴趣的:(WEB注入类题目解析)