2025第五届长城杯网络安全大赛初赛 Web方向 WP

Web

文曲签学

长按Fn进入调试模式,输入#HELP可以查看帮助

输入#LIST可以查看列表,再输入#READ HINT获得提示

在公众号获得提示

双写../进行目录穿越,读取flag

EZ_upload

打开之后上传一个文件,得到源码

文件移动成功后执行命令 cd /tmp && tar -xvf ' . $filename.'&&pwd,即进入 /tmp/ 目录,解压上传的文件,然后显示当前路径

关键就是这一行代码,将文件按tar格式解压。我们写入木马到tar文件,然后想办法让其解压到/var/www/html即可

打开本地虚拟机,先创建一个符号链接,指向/var/www/html

1
ln -s /var/www/html su

然后往/var/www/html写入一句话木马,命名1.php

接着把符号链接su写入su1.tar

1
tar -cvf su1.tar su

然后再把木马写入su2.tar

1
tar -cvf su2.tar su/1.php

先上传su1.tar,再上传su2.tar,解压后木马就可以写到/var/www/html目录里面

然后访问1.php,没有报404,说明成功写入

蚁剑连接

根目录找到flllllll1111ag

SeRce

打开后看到题目源码

1
2
3
4
5
6
7
8
9
<?php
highlight_file(__FILE__);
$exp = $_GET["exp"];
if(isset($exp)){
if(serialize(unserialize($exp)) != $exp){
$data = file_get_contents($_POST['filetoread']);
echo "File Contents: $data";
}
}

要先满足 serialize(unserialize($exp)) != $exp 才可以用 file_get_contents 读取文件。一开始exp还弄得很长,但其实很简单,输入个1就可以,1 并不是合法的序列化格式,unserialize("1") 返回 false 并且会触发一个警告,但是 PHP 的 serialize(false) 会返回字符串 "b:0;",和输入 "1" 不同,因此条件成立

然后filetoread写入文件路径,例如/etc/passwd,POST发送

后面尝试寻找flag找不到,想起来之前见过一个由file_get_contents到任意命令执行的漏洞,上网搜索一番,找到CVE-2024-2961,大概就是GNU C库glibc中iconv()函数的缓冲区溢出漏洞。漏洞会在将字符串转换为ISO-2022-CN-EXT字符集时,导致输出缓冲区最多溢出4字节,从而引发程序崩溃或覆盖内存

参考文章:从多个比赛引发的CVE-2024-2961漏洞学习思考-先知社区

这里用工具来做,地址:https://github.com/ambionics/cnext-exploits

工具下载到虚拟机后,要根据题目修改cnext-exploit.py代码,具体如下

然后执行命令,因为当前用户为www-data,权限很低,所以把文件写到/tmp目录下,/tmp 通常默认可读写,其他目录需确认权限

先读取根目录文件有什么

1
python3 cnext-exploit.py https://eci-2ze1g7zvc6cw53q7usqk.cloudeci1.ichunqiu.com:80?exp=1 "ls / > /tmp/1.txt"

直接读取flag发现无法读取,后面查看readflag发现是个程序,且当前用户具备执行权限,可以运行获取flag

1
python3 cnext-exploit.py https://eci-2ze1g7zvc6cw53q7usqk.cloudeci1.ichunqiu.com:80?exp=1 "/readflag > /tmp/flag.txt"

返回题目,修改POST读取/tmp/flag.txt即可

2025第五届长城杯网络安全大赛初赛 Web方向 WP

https://waynejoon.github.io/posts/ctf-2025changcheng-web-wp/

作者

WayneJoon.H

发布于

2025-09-15

许可协议