第十九届ciscn&第三届长城杯半决赛WP

awdp
MediaDrive
分析
首先查找查找敏感函数
发现有一个file_get_contents并且他的路径是从cookie中的basepath这个参数而来

所以可以通过修改cookie中的basepath来进行任意文件读取
break1
但是在读文件之前有一个黑名单来阻止读取flag
但是,他的黑名单检测是在iconv转换之前的检测
那我们看看这个iconv转换
1 | $convertedPath = @iconv($user->encoding, "UTF-8//IGNORE", $rawPath); |
有一个点很重要IGNORE,也就是他会把不符合编码规则的内容直接给忽略掉,
所以我们可以f=fl%dfag来绕过正则匹配

break2
但是,还有一种方法ISO-2022-CN-EXT存在unicode转换漏洞,用unicode绕过


fix
修的话就比较简单了
一是把黑名单放在转换之后
二是把路径直接写死为/var/www/html/uploads/

easy_time(预期解可能吧
break
首先他的认证全是cookie

我们不需要去爆破哈希,而直接修改cookie就可以登陆(当时比赛没看出来,是爆弱口令出来的,T~T)

然后看到有一个路由/plugin/upload

发现他上传文件后会自解压

并且使用的是os.path.join,存在路径穿越的危险
然后构造路径穿越去写马
1 | import zipfile |
但是我在本地复现提示不合法


然后在docker-compose.yaml中发现端倪

他开了只读!!!
我们能写的地方只有下面tmp那几个
但是网上wp都是这么写的(T~T)
在刷公众号时发现了这位师傅

然后就去研究了一下
然后在phpinfo中发现了这个题开了Zend OPcache


并且默认的路径正好就是tmp
Opache是php中一个生成缓存文件的拓展,当我们访问一个php文件时,他会产生一个缓存文件,下次访问该php文件时,就会直接根据缓存文件回显页面
所以想要rce,我们就得覆盖掉生成的bin文件
根据前人的智慧可以知道

然后结合我们自己的题目环境就是
1 | <?php |


通过开天眼发现确实没错
然后就是伪造的问题了,有一个简单的方法就是在启动一个docker,把里面index.php改成木马然后访问拿缓存文件
然后缓存文件要改两个地方,一个systemid和时间戳(得小端序倒着写!其他师傅没提到我还研究老一会T~T




参考文章
- 标题: 第十九届ciscn&第三届长城杯半决赛WP
- 作者: tiran
- 创建于 : 2026-03-31 00:23:09
- 更新于 : 2026-03-31 00:26:02
- 链接: https://www.tiran.cc/2026/03/31/第十九届ciscn-第三届长城杯半决赛WP/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。