------已搬运-------BUUCTF:[网鼎杯 2020 青龙组]AreUSerialz 1

本文介绍了在网鼎杯2020青龙组的AreUSerialz 1挑战中遇到的PHP反序列化问题。文章详细讨论了__construct()方法在unserialize()后的执行情况,以及如何通过使用S标识符和16进制表示绕过限制。提到了PHP 7.1+版本对属性类型不敏感的特性,并给出了两种绕过in_valid的方法,包括使用大写S表示字符串和改用public属性。
摘要由CSDN通过智能技术生成

[网鼎杯 2020 青龙组]AreUSerialz 1

先记录一下我自己的误区/易错点:

  1. __construct() 方法,在unserialize()反序列化之后不执行。。。
    尽管他口口声声说 __construct() 在生成一个新的实例时会调用该方法。但仅仅限于 $a = new A() 才成立。反序列出来的不执行该方法

  2. 注意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();
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值