糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > pop链 php POP链

pop链 php POP链

时间:2021-10-20 12:03:18

相关推荐

pop链 php POP链

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

在,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链》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。