SDPCSEC纳新赛3.0
本文最后更新于 2026年4月29日 下午
web
real_signin
提示有备份,直接扫一下目录,果然发现了index.php.bak
1 | |
非预期?
1 | |
直接就能出来,不知道是不是就是这样的
猜测应该想考哈希扩展

1 | |

点墨染翰
上传头像只允许jpg和png,并且后端做了检查
查看历史页面的源码有一段比较可疑
1 | |
推测漏洞点在7.png上
上传文件名为 <?php phpinfo();?>.png成功读取,下面上马
<?php @eval($_POST['pass']);?>.png

real_Grafana
这个版本的grafana有CVE,但是需要用户名和密码,我们直接爆破一下
1 | |
下面直接打CVE-2024-9264

Y0u_@r3_n0t_Acc1oFl4g
app.py:
1 | |
config.py:
1 | |
- /secret 路由接受 param 参数
- 参数经过 base64 解码后,传入 restricted_loads() 进行 pickle 反序列化
分析 RestrictedUnpickler 限制
1 | |
限制条件:
- 只能从 config 模块加载类/函数
- 名称不能包含 __(防止使用 _reduce__、__init_ 等魔术方法)
config.py 中存在一个 backdoor 函数:
1 | |
关键点:
- backdoor 函数可以执行任意 Python 代码
- 但需要 notAcc1oFl4g[“Acc1oFl4g”]==”yes” 才能触发
- notAcc1oFl4g 是一个字典,初始值为 {“Acc1oFl4g”:”no”}
攻击思路
利用 pickle 操作码:
- 获取 config.notAcc1oFl4g 字典对象
- 修改字典值:notAcc1oFl4g[“Acc1oFl4g”] = “yes”
- 获取 config.backdoor 函数
- 调用 backdoor 执行任意代码
这里有一个叫pker的工具可以帮我们利用操作码,这里好像有python版本兼容问题,要放kali里面跑
1 | |
由于这里没有回显,所以我们用异常抛出把flag吐出来
1 | |

referer
超かぐや姫!
flask框架,邮箱的地方存在ssti,但是邮箱地址不让有小括号、中括号,试了双引号包裹貌似也不行,这样就不能执行命令了
后台应该是把config和request也删了,没法直接调用
1 | |
找到一条能读敏感信息的链子

一个月之后的4.29
问了一下师哥还是从邮箱格式上突破小括号的限制
其实当时我问gemini然后它告诉我了这种格式但是没说要加双引号,哈基米怎么这样

thinking…
第一次做thinkphp,这里详细讲一下怎么找到漏洞以及怎么利用。我们先看一下目录结构,如何审计这个代码?
如果只想快速审计一个 ThinkPHP 题,优先看这几个位置:
- application/route.php
- controller
- model
- public/index.php
- vendor 里有没有额外注册的路由或危险扩展
先看路由文件 attach/application/route.php,能立刻知道站点主要功能只有 3 个入口:
- GET /designer 编辑文章
- POST /preset/save 保存文章
- GET /preset/preview/:id 查看文章
这里调用了看控制器 attach/application/index/controller/Theme.php,我们重点关注这里的save和preview
1 | |
我们接着去看类ThemePreset的定义
1 | |
我们去找基类Model,调用链是:
- ThemePreset::get() 取模型
- 模板或控制器访问 $preset->snapshot
- 进入 Model::getAttr()
- 看到字段类型是 serialize
- 再进入 readTransform()
- 最终执行 unserialize($value)
所以业务逻辑被还原成了:
1. 用户可控 snapshot
2. 原样入库
3. 之后读取时自动 unserialize
也就是说这里的业务层给了我们反序列化的入口,我们下一步需要去找POP链来利用这个漏洞,找到这样一篇文章,链子可以直接拿来用
ThinkPHPv5.0.x反序列化利用链 - juanxincai017 - 博客园
或者gpt也给我写了一个exp
1 | |
总的来说大致流程如下
1 | |
不太好理解,我们重点关注一下它是怎么落地的
Thinkphp5.0反序列化链在Windows下写文件的方法-先知社区
为什么最后文件名是 a.php3b58…php
因为 ThinkPHP 文件缓存不是直接写到 a.php,它还会自动追加缓存 key:
$filename = $this->options[‘path’] . $name . ‘.php’;
而触发 tag=1 后,第二次写入的 key 是:tag_ . md5(1)
再经过一层 md5,得到:3b58a9545013e88c7186db11bb158c44即a.php3b58a9545013e88c7186db11bb158c44.php

Misc
easy_traffic
首先筛选http流量

我们发现两个POST流量
第一个上传了1.zip,我们追踪tcp把压缩包保存,发现里面有flag.png但是需要密码解压
我们看第二个POST

请求包的部分url解码,反转,base64解码得到一串代码
1 | |
我们用Python脚本解密响应包
1 | |
得到kskblzdjd
这个就是压缩包的密码,我们得到了flag.png

这个是汉信码,我们找一个在线网站
