pop链 php,POP链

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

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

0x01 PHP对象注入攻击

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

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

d68187f853dc1ebf8d6fa55826fdcbb9.png

POP链的入口点在哪?

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

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

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

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

0x02 TypechoPOP链

typecho/install.php

03f722f069bbcecaab7e912cb541139f.png

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

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

ee85903c1e86fcf613eb8aea7d57b2b3.png

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

4d1974c9a32dad374764ad4014763342.png搜索项目发现了3处包含__toString方法的

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

Typecho/Feed.php->toString()

60ac4a05d24c9df8556cf87ec11b29e2.png

60ac4a05d24c9df8556cf87ec11b29e2.png

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

2cf92b76ffbf37716245fa683ea56121.png

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

/Typecho/Request.php

e1e325974ae6e796bee034abe0c4f566.png

调函数

69d8d43f9cbfba1a15edfaa1992705a7.png

再调函数

e4d2941e197aaba78bbed61bf1d877a0.png

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

58a03025678bf26a76d4a57cb38ff764.png

简单总结一下:

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值