[GHCTF 2025]ez_readfile
题目:
<?php
show_source(__FILE__);
if (md5($_POST['a']) === md5($_POST['b'])) {
if ($_POST['a'] != $_POST['b']) {
if (is_string($_POST['a']) && is_string($_POST['b'])) {
echo file_get_contents($_GET['file']);
}
}
}
?>
Warning: md5() expects parameter 1 to be string, array given in /var/www/html/index.php on line 3
Warning: md5() expects parameter 1 to be string, array given in /var/www/html/index.php on line 3
看起来挺简单,网上搜了个md5绕过就绕成功了,但是我始终找不到flag在哪里
最后实在受不了看了wp,我只能说给我八百年我也找不到
方法一:读取敏感文件 docker-entrypoint.sh
同样的敏感文件还有 docker-compose.yml
有出过题的,大部分都是采用https://github.com/CTF-Archives/ctf-docker-template这里面的模版。一般出题过程中,为了方便,不去修改dockerfile文件,都会直接在容器内修改,然后再commit生成镜像。
里面的php出题模版中,有一个容器启动命令文件docker-entrypoint.sh。
可以看到该命令文件在容器初始化后就会被删掉。但是在提交生成镜像后,由镜像生成容器又需要运行该文件。因此有的出题者为了方便可能就不删除该文件,这时候就可以碰碰运气,看看出题者有没有把这个文件删掉。没有删掉,就能够获取路径。
这个文件在
[GHCTF 2025]GetShell -CSDN博客 也遇到过
什么是 docker-entrypoint.sh
: Docker 容器中常见的入口脚本,通常用于在容器启动时执行一些初始化任务,比如配置环境变量(检查或设置必要的环境变量(如数据库连接配置))、设置权限、启动服务等等
可以读取到
#!/bin/bash
# Check the environment variables for the flag and assign to INSERT_FLAG
if [ "$DASFLAG" ]; then
INSERT_FLAG="$DASFLAG"
elif [ "$FLAG" ]; then
INSERT_FLAG="$FLAG"
elif [ "$GZCTF_FLAG" ]; then
INSERT_FLAG="$GZCTF_FLAG"
else
INSERT_FLAG="flag{TEST_Dynamic_FLAG}"
fi
# 将FLAG写入文件 请根据需要修改
echo $INSERT_FLAG > /f1wlxekj1lwjek1lkejzs1lwje1lwesjk1wldejlk1wcejl1kwjelk1wjcle1jklwecj1lkwcjel1kwjel1cwjl1jwlkew1jclkej1wlkcj1lkwej1lkcwjellag
#这里的echo是标准重定向输出(一般是电脑屏幕),但是很明显这里是重定向输出到
#/f1wlxekj1lwjek1lkejzs1lwje1lwesjk1wldejlk1wcejl1kwjelk1wjcle1jklwecj1lkwcjel1kwjel1cwjl1jwlkew1jclkej1wlkcj1lkwej1lkcwjellag文件中
source /etc/apache2/envvars
echo "Running..." &
tail -F /var/log/apache2/* &
#启动服务器
exec apache2 -D FOREGROUND
然后再访问这个文件就能拿到flag
方法二:利用CVE-2024-2961实现从将php://filter任意文件读取提升为远程代码执行(RCE)
攻防世界 file_include【php://filter详解】-CSDN博客
参考:
GHCTF-WEB-EZ ReadFile 详解(内含XXE条件下敏感信息的获取思路&失败的CVE-2024-2961脚本漏洞利用) -CSDN博客
2025GHCTF Official Write Up for Web | hey's blog