web攻防--PHP反序列化

web,攻防,php,序列化 · 浏览次数 : 15

小编点评

**PHP 反序列化漏洞简介** PHP 反序列化漏洞是一种利用 PHP 代码将字节序列转换为对象或变量的攻击。当在网络传输过程中将对象转换为字节序列时,攻击者可以利用漏洞进行代码执行或数据窃取。 **漏洞原理** 当 PHP 解析字节序列时,会调用 `unserialize()` 方法将序列中的字节数据转换为对象。`unserialize()` 方法的第二个参数是一个布尔值,指定是否保持对象的属性命名空间。如果该参数设为 `false`,属性会被转换为字符串类型。 **漏洞利用** 1. 攻击者构造一个包含恶意代码的字符串。 2. 将该字符串作为 `serialize()` 方法的第一个参数传递给目标对象。 3. 使用 `unserialize()` 方法将序列中的字节数据解码为对象。 4. 该对象可以被用于执行恶意代码或获取敏感信息。 **示例** ```php // 攻击字符串 $evil_string = serialize(json_encode(array('name' => 'John'))); // 注入恶意字符串到数据库中 $sql = "INSERT INTO users (name) VALUES ('$evil_string')"; // 执行 SQL 语句 // ... // 攻击成功,用户被恶意代码访问 ``` **防范措施** * 使用 `serialize()` 和 `unserialize()` 方法时,使用 `false` 的第二个参数。 * 对序列化数据进行过滤和验证。 * 使用安全连接和密码验证。 * 密切监控网站的网络活动。

正文

web攻防--PHP反序列化

漏洞简介

序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。

反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。例如将二进制数据流或文件加载到内存中还原为对象。
在这里插入图片描述

魔术方法

在Python和PHP中,一般通过构造一个包含魔术方法(在发生特定事件或场景时被自动调用的函数,通常是构造函数或析构函数)的类,然后在魔术方法中调用命令执行或代码执行函数,接着实例化这个类的一个对象并将该对象序列化后传递给程序,当程序反序列化该对象时触发魔术方法从而执行命令或代码。在Java中没有魔术方法,但是有反射(reflection)机制:在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法,这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。一般利用反射机制来构造一个执行命令的对象或直接调用一个具有命令执行或代码执行功能的方法实现任意代码执行

  • 常见得魔术方法
    在这里插入图片描述

在这里插入图片描述

php属性类型

  1. 对象变量属性:
    public(公共的):在本类内部、外部类、子类都可以访问
    protect(受保护的):只有本类或子类或父类中可以访问
    private(私人的):只有本类内部可以使用
  2. 序列化数据显示:
    public属性序列化的时候格式是正常成员名
    private属性序列化的时候格式是%00类名%00成员名
    protect属性序列化的时候格式是%00*%00成员名

漏洞利用

  • POP链构造
    POP:面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,序列化攻击都在PHP魔术方法中出现可利用的漏洞,因自动调用触发漏洞,但如关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。

  • PHP-绕过漏洞
    CVE-2016-7124(__wakeup绕过)
    漏洞编号:CVE-2016-7124
    影响版本:PHP 5<5.6.25; PHP 7<7.0.10
    漏洞危害:如存在__wakeup方法,调用unserilize()方法前则先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup执行

  • 字符串逃逸
    在利用反序列化漏洞过程中,传入序列化数据,假如程序对序列化数据进行关键字过滤,使得序列化数据字符串变长或者变短,便可用字符串逃逸进行绕过。即利用过滤后得关键字产生字符占位进行构造序列化数据。

  • php原生类
    在利用反序列化漏洞时,没有看到魔术类方法,通过具体分析,判断可能使用到哪些魔术方法,通过查看php中内置得魔术方法进行利用。

查看原生类函数脚本

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            '__destruct',
            '__toString',
            '__wakeup',
            '__call',
            '__callStatic',
            '__get',
            '__set',
            '__isset',
            '__unset',
            '__invoke',
            '__set_state'
        ))) {
            print $class . '::' . $method . "\n";
        }
    }
} 

有些原生类魔术方法需要开启才可以利用,例如__call内置得魔术方法SoapClient需要开启extension=soap
具体利用参考浅析PHP原生类

  • 框架类反序列化利用
    在PHP的各种框架中也存在着反序列化漏洞,但是这些反序列化漏洞利用起来特别困难,需要进行代码审计,并根据审计结果编写poc,难度有点大,于是可以利用一些反序列化工具来为各种框架生成反序列化漏洞利用的payload。例如phpggc,NotSoSecure等,在得知框架版本,查看工具中是否有符合版本漏洞,找到反序列化入口即可。

以上内容仅作学习,如有错误或瑕疵,欢迎批评指正,感谢阅读。

与web攻防--PHP反序列化相似的内容:

web攻防--PHP反序列化

# web攻防--PHP反序列化 ## 漏洞简介 序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。 反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。

[攻防世界][Web]PHP2

打开靶机对应的url 就一行字 Can you anthenticate to this website? 第一感觉就需要做目录文件扫描 使用御剑和dirsearch进行扫描,发现一个文件 index.phps 知识点: phps 是php标准中用来表示可以查看的php源文件的约定,不会被服务器执行

[攻防世界][Web]ics-06

打开靶机对应的url,展开是一个网站的样子,其实啥也么有 所有tab都点一遍,发现只有报表中心有内容,url为 http://61.147.171.105:49797/index.php?id=1 猜测这里是题眼,使用burpsuite的intruder直接爆id的值(0-10000) 最后发现id

Web攻防--xxe实体注入

# web攻防--xxe实体注入 ## 漏洞简介 XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。 在某些情况下,攻击者可以利用 X

Web攻防--JS算法逆向--断点调试--反调试&&代码混淆绕过

# Web攻防--JS算法逆向--断点调试--反调试&&代码混淆绕过 ## JS算法逆向 在进行渗透测试过程中,在一些功能点进行参数注入或者枚举爆破等过程中,会出现参数进行加密的情况,但是我们输入参数并不是加密状态,即便测试点存在漏洞也不可能测试成功,这时候便需要将所提交参数进行加密后在进行注入,针

Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

预编译 编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作, 预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,关键字不会被拆开,注入语句也就不会被识别为SQL的关键字,从而防止恶意注入语句改变原有SQL语句本身逻辑。 Java_JDBC注入 在使用JDBC进行数据库操作

Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

JNDI注入 什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。 JNDI支持的服务主要有:DNS

[转帖]Web技术(三):TLS 1.2/1.3 加密原理(AES-GCM + ECDHE-ECDSA/RSA)

文章目录 前言一、TLS 加密原理1.1 TLS 信息加密1.2 TLS 完整性校验与认证加密1.3 TLS 报文结构1.4 TLS 密钥交换1.5 TLS 数字签名1.6 TLS 密码套件1.7 TLS 网络攻防 更多文章: 前言 前篇博客:图解HTTP中谈到,HTTP/1.1 协议默认是以明文方

详解Web应用安全系列(6)安全配置错误

Web攻击中的安全配置错误漏洞是一个重要的安全问题,它涉及到对应用程序、框架、应用程序服务器、Web服务器、数据库服务器等组件的安全配置不当。这类漏洞往往由于配置过程中的疏忽或错误,使得攻击者能够未经授权地访问系统数据或执行系统功能。 安全配置错误类漏洞是指在对Web应用及相关组件进行安全配置时,由

详解Web应用安全系列(8)不足的日志记录和监控

在Web安全领域,不足的日志记录和监控是一个重要的安全隐患,它可能导致攻击者能够更隐蔽地进行攻击,同时增加了攻击被检测和响应的难度。以下是对Web攻击中不足的日志记录和监控漏洞的详细介绍。 一、日志记录不足的问题 日志缺失或不完整 关键操作未记录:如用户登录、敏感数据访问、系统管理员操作等关键操作未