又是一年TCTF,鸽了好久还是出了3题验了1题,感觉近年来难度越来越高了对新手貌似极其不友好……

worldcup

因为最近在写golang玩,研究了一下go template的模板注入。Fuzz了一圈后发现它对于反引号的支持挺差的,而在ES6就已经有模板字符串(Template String)了,因此我们可以通过反引号来逃逸进而实现XSS。
比较尴尬的是第二层XSS其实都是非预期……正解其实是利用了一个go的parse bug,不过貌似出题时有点失误可以直接一个payload打两个,那还是留着下次出题用吧23333
第二个比较有意思的点是渲染引擎对错误的处理,因为模板错误会导致go panic,而在gin框架开启了recovery后panic的请求依然会返回未出错的部分,因此这里我其实是模拟了这样一种编程pattern

1
2
3
calculate
render
update

这样做是有风险的,因为一旦panic后后面的update操作就不会被执行了,而在用户侧可以根据内容得到一个T/F类型的返回(类似盲注)而在模板中用户可以针对当前传入参数执行包括if-condition在内的许多操作,从而在特定情况下达到操控update操作的目的。

在全局空间中 {{.}}{{$}} 效果相同

singer

纯粹是看了b站一些沙雕音符画视频出的签到题……
按照音符顺序画出画就能得到flag字母,做出的人还是蛮多的。

boynextdoor

貌似之前都没有AI安全,就整了一个(其实我也不会hhhh)
题目嘛很直接,github上找了一个挺多人用的人脸识别库,模拟的情形是在目标向量泄露时训练出一个攻击样本使其与目标的距离低于人脸识别阈值。看wp貌似有用GAN或者FGSM之类高大上的东西搞得,但其实没有这么麻烦。因为微小的扰动即可使结果发生变化,可以通过贪心的方式,将人脸的部分像素随即改变,只要距离变短(不一定非要梯度下降)就可以保存进行下一轮迭代,也就是所谓的“爬山算法”。
需要注意的一点是爬山算法只能找到局部最优解,因此可能存在找不到符合条件的解的情况。所以初始图片的选择、步长的选择等都需要找到合适的值,否则可能存在步长过长局部最优震荡或者过短迭代时间太长的情况出现。

zsx师傅的useCTF

验了下题,前面都还好审了下locutus,因为替换._,因此可以通过这个trick绕过__proto__检测从而进行原型链污染,然后预期解是搜索dangerouslySetInnerHTML找到可以利用的库从而XSS,然而我看了看能控制的相关库只有个reapop,翻了翻文档找到个allowHTML参数,看名字就知道污染了就能X了……
然后在第二层因为清cookie的原因陷入react中无法自拔,本来就不太会这玩意儿追了半天react没发现什么能污染的东西,干脆弃疗了(,问了下exp发现是利用react的一些内部变量啥的还原,确认过眼神是我搞不动的东西。
不过有意思的一点是比赛时貌似都是非预期23333,有的队利用覆盖string split从而带出flag,还有的利用force-cache黑魔法强制使用缓存,还是学习到了很多东西。
(不会真有ctfer会前端吧,不会吧不会吧)