在二进制安全领域,Return-oriented programming(ROP)是一种常用的绕过防护攻击方式。攻击者可以利用内存中已有的进程片段(称作gadgets),通过汇集这些进程片构建一个攻击途径(称作gadget chains)。

在2009年,Esser提出这种代码复用产生攻击的思想在PHP系统中同样适用[1][2]。

0x01 PHP对象注入攻击

PHP对象注入攻击本质上属于一种代码复用技术。那么为何代码可以复用?得益于魔术方法,在一定的条件下魔术方法可以不被调用直接触发,得以代码复用。

这种触发形式层层相扣,在魔术方法中触发另一个类的魔术方法,这便形成了POP链。

POP链的入口点在哪?

触发魔术方法,我们需要这个类在内存中的对象值。而像数组、对象这种复杂数据结构在非内存使用的情况下通常是以序列化形式存在。我的理解是将复杂数据结构转化成另一中便于存储或者传输的形式存在,比如存入数据库,显然一个字符串更合适。当进程调用时在还原成原来的形式调入内存,这就是反序列化。

反序列化的对象当然能触发类中的魔术方法,从而触发POP链。string serialize ( mixed $value )

serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。

0x02 TypechoPOP链

typecho/install.php

第230行反序列化操作,在内存中还原数据。

第232行new了一个Db类,触发指定__construct函数,参数可控

第120行进行了字符串连接操作,如果$adapterName是一个object结构数据,触发__toString函数。在项目中搜索包含__toString方法的任意类

搜索项目发现了3处包含__toString方法的

找到下一个可利用的魔术方法点或者漏洞触发点

Typecho/Feed.php->toString()

**在第290行,出现了object->attr结构,对象名可控,此时,只要类内不包含screenName这个属性,便会触发get方法。**在项目中搜索包含__get方法&&没有screenName属性的任意类

搜索项目发现了13处包含__get方法的类(盗图)

/Typecho/Request.php

调函数

再调函数

最终跳到了第164行,两个参数都可控,命令执行。

简单总结一下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19$config=unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));

$db=new Typecho_Db($config['adapter'], $config['prefix']);

Public function ($adapterName,$prefix='typecho_')

$adapterName='Typecho_Db_Adapter_'.$adapterName;

Public function__toString()

'.htmlspecialchars($this->_subTitle).'

Public function ($key)

Return $this->get($key);

Public function get($key,$default=NULL)

Return $this->_applyFilter($value);

Private function_applyFilter($value)

call_user_func($filter,$value);

pop链 php,POP链相关推荐

  1. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  2. 链客区块链技术问答社区

    链客是中国领先的区块链垂直领域技术问答社区(www.liankexing.com),旨在为大家提供一个直接.高效的技术交流平台,区块链技术爱好者遇到的每一个问题,链客做到有问必答! 在这里: ①海量的 ...

  3. 一文读懂公有链、私有链、联盟链

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链中公有链.私有链.联盟链都是区块链技术的一个细分,而技术仅仅是一种工具,怎么在不同的场景应用好不同的工具才是技术进 ...

  4. 区块链以及区块链技术总结

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 摘要:区块链是目前一个比较热门的新概念,蕴含了技术与金融两层概念.从技术角度来看,这是一个牺牲一致性效率且保证最终一致性 ...

  5. 公有链和联盟链的本质不同

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 区块链是生命体.经济体.未来的区块链世界离不开自己的价值尺度建设 公有链和联盟链的本质不同 区块链受到大家广泛关 ...

  6. 入链、出链、反向链接、内链、外链的关系

    出入链和内外链没有绝对的关系 出链:自己网页到别的网页 入链:别的网页到自己网页 外链:来源于/去往别的网站的别的网页 内链:来源于/去往本网站的别的网页 反向链接=入链

  7. 国内三分之一世界500强企业正布局区块链,区块链风口已经出现

    世界五百强 在美国<财富>杂志公布的最新一期世界500强榜单上,中国公司达到了120家,已经非常接近美国(126家),远超第三位的日本(52家). 从行业分布来看看,互联网行业的公司排名均 ...

  8. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  9. 2018年DApp分析 | 链塔区块链产业年鉴精选

    2018年DApp分析 | 链塔区块链产业年鉴精选 DApp的全称为Decentralized Application,是指去中心化应用或者分布式应用.DApp的出现是区块链应用落地的有益尝试,DAp ...

最新文章

  1. 世界上有没有无法破解的密码?揭秘量子通信 | 图图是道
  2. 从学术界到产业界,阿里云李飞飞谈数据库为何要开源? | 《新程序员》
  3. 基于JDK 1.8 的 Java 容器UML图
  4. DataAdapter对象
  5. Spring之Spring Boot
  6. mysql_close6_关于mysql_close()函数的10篇文章推荐
  7. Vue小案例 之 商品管理------创建页面与部分数据
  8. 详述MySQL事务的实现原理
  9. python编写web漏洞扫描器_Python脚本实现Web漏洞扫描工具
  10. npm查找依赖包版本
  11. 扩展kalman滤波matlab程序,扩展卡尔曼滤波算法的matlab程序
  12. 二项分布,柏松分布和正态分布
  13. 计算机显示器分辨率,电脑显示器分辨率调多少合适
  14. 第八章:Junit——selenium IED 的版本和 火狐浏览器的版本 相对应
  15. Bootstrap框架快速上手
  16. 如何通俗易懂地阐述机器学习?
  17. 【Python爬虫教学】百度篇·手把手教你抓取百度搜索关键词后的页面源代码
  18. 如何在IDEA设置Java类和方法的注释模板?
  19. Can't connect to MySQL server (10060)异常解决方法
  20. linux man命令如何翻页,Linux中如何使用 man page

热门文章

  1. 海思屏幕HAL代码解析
  2. 学生党必备好物神器:科大讯飞智能录音笔
  3. Flume-ng配置
  4. 乐博乐博亮相2020科博会,掀起少儿编程教育新浪潮!
  5. Day 7(云计算-zsn)
  6. cherry 键盘WIN键不生效问题
  7. 2021-02-05
  8. IE的浏览器模式和文档模式
  9. 试题 算法训练 24点 蓝桥杯 Java
  10. 【Scratch-外观模块】像素化特效指令