[网鼎杯 2020 青龙组]AreUSerialz 1
先记录一下我自己的误区/易错点:
-
__construct() 方法,在unserialize()反序列化之后不执行。。。
尽管他口口声声说 __construct() 在生成一个新的实例时会调用该方法。但仅仅限于 $a = new A() 才成立。反序列出来的不执行该方法 -
注意PHP的===,和弱类型比较等,这些点可以进行绕过
知识点:
一、序列化中的表征字符型的s,可以替换称S。表示 支持后面的字符串用16进制表示。可在这种情形下,将%00替换为\00来进行绕过。
二、PHP版本7.1+的时候,对属性的类型不敏感,当用privat,protected不方便时,可以用public进行代替。可以F12看一下X-Powered-By
分析代码:
<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
protected $op; //这是三个保护属性注意了。
protected $filename; //属性会有 %00*%00filename的样式
protected $content;
/*这个不调用, 不用看*/
function __construct() {
//仅仅在new FileHandler()的时候才调用
$op = "1";//所以这里只是unserialize()。就不用看这个__construct方法了
$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();