TRX CTF 2025 WEB题目分析
寒影和寒风萧 CTF 149浏览 · 2025-02-27 11:24

Online Python Editor

Pasted image 20250224123346.png
进来后是一个线上的python editor,校验你输入的python语法是否正确。这里给了dockefile和一些文件,我们看看

app.py

secret.py

然后在index.html中

做了一个请求,所以逻辑就是,我们在网页中输入内容,然后他把我们输入后的内容发送到后端的check路由进行检查,利用ast.parse来构成语法树,如果有错误就调用traceback.format_exc()函数报错。

我们这里先随便示例
Pasted image 20250224124006.png
控制台中便有报错,并且告诉你在第几行,然后在请求中会这样报错
Pasted image 20250224124122.png
会traceback爆出错误。 接下来我们看一下ast辅助函数
Pasted image 20250224124211.png
也就是说我们可以指定一个filename作为他的输入文件。 所以我们这里应该是传入一个secret.py刚好他的flag位置在第六行,我们就构造5个换行符\n,然后加上一个:(只要令他报错就行),他就会把第六行的报错内容输出出来,刚好也是flag位置,所以就能得到flag 最后打法:
Pasted image 20250224124614.png


内心os:当时已经读到第一行了,但是没想到\n能往下面读这个特性....

Baby Sandbox

同样也是有附件,我们拿出来看看

server.js

bot.js

~~我服了才看见最顶上的注释...~~~

先看一下bot这边,可以看到:

在local的地方存储了flag

在这里跳转到其local然后将参数传递过去。 传递到index.ejs中

然后这里用了<%=%>来渲染,其实就是把iframe嵌套进来 然后在iframe中嵌套的地方:

然后这里我觉得有必要说一下关于Shadow DOM方面的一些知识点。 因为我们可以看到其实从始至终flag都没有被渲染到可视的页面内,那为什么我们最终能获取到flag?就是要Hacking Shadow DOM。

Shadow DOM 是 Web Components 技术的一部分,它允许你创建 封装的 DOM,从而使你能够将 HTML 结构、CSS 样式和 JavaScript 功能封装在一个独立的、隔离的环境中。这使得组件的样式和功能不受外部页面的影响,也不影响外部页面。(GPT回答)

而在iframe.ejs中有这么一行shadow.appendChild(flagElement);,也就是他把这个flag封装起来,也就是页面上是不会显示的,所以我们在传payload的时候就没办法利用正则来对页面内的flag进行获取。

具体怎么攻击可以看这一篇。 https://blog.ankursundara.com/shadow-dom/ 所以我们可以利用window.find来指向他进行获取flag的操作。

接着我们来看CSP和SandBox的位置

可以看到设置了策略script-srcunsafe-inline所以可以内联执行js 其他的,这里的default-src设置成了none,阻止页面加载任何外部资源。所以对于外带flag这里还需要绕过一下。

这里设置了一个sandbox,但是还是限制了弹出新窗口。 具体绕过看这一篇: https://blog.huli.tw/2022/04/07/en/iframe-and-window-open/

所以我们可以利用top.document.body进行写入,然后在导航页写入xss,进行外带flag

最终exp:

注意一下为了完整的将payload传输,我们需要hex一下。 最后外带

Pasted image 20250225235405.png


zStego

简介

进来后页面是一个文件上传和扫描功能
Pasted image 20250226153925.png


我们来看一下源码(主要片段)

所以我们的思路其实就是伪造一个docx文件,让他在file_get_content的时候把一个压缩后的flag.txt拿出来再放进decode一下即可。 但是这里要注意一下怎么去构造这个文件,用软链接使其media指向根目录去读取flag,这里直接贴exp吧

最后拿到flag
Pasted image 20250227175937.png


0 条评论
某人
表情
可输入 255