1、原理

在程序编写的时候,往往需要序列化一些运行时数据,所谓序列化就是按照一定的格式将运行时数据写入本地文件。这样做可以对数据进行本地保存,用的时候直接读文件就可以把运行时产生的数据读出。php中就是serialize和unserialize函数了。

能够注入的原理就是在反序列化的时候,引入了污染数据造成的,比如:

$obj = unserialize($_GET[‘injection’]) ;

通过这个语句,我们可以自己按照序列化数据的格式进行构造,得到我们想要的对象$obj。

有人就要问了,你仅仅得到这个对象$obj有啥用?先看看下面的实例。

2、情景

该情景也是来源于译文中的demo,这里还原一下:

. $this->filename ; return file_get_contents($this->filename) ; } } // Main User class class User { // Class data public $age = 0; public $name = ''; // 允许对象作为一个字符串输出上面的data public function __toString() { return 'User ' . $this->name . ' is ' . $this->age . ' years old. '; } } // 用户可控 $obj = unserialize($_GET['usr_serialized']); // 输出 __toString var_dump($obj) ; echo $obj; ?> 上面的代码是从用户可控的数据获取一个序列化数据,然后调用unserialize方法对$_GET['usr_serialized']进行反序列化,那么这个$obj就可以被我们控制了。

正常的方式是提交:

http://127.0.0.1.2881064151/code/objin.php?usr_serialized=O:4:User:2:{s:3:age;i:20;s:4:name;s:4:John;}

上面的序列化数据是一个User类的对象,其中$age=20, $name=John。

这时,echo $obj ;直接echo对象,就能调用魔术方法__toString,在User类中已经对这个魔术方法进行了重载,即输出一段字符串,运行效果如下:

上面的代码是从用户可控的数据获取一个序列化数据,然后调用unserialize方法对$_GET['usr_serialized']进行反序列化,那么这个$obj就可以被我们控制了。

正常的方式是提交:

http://127.0.0.1/code/objin.php?usr_serialized=O:4:User:2:{s:3:age;i:20;s:4:name;s:4:John;}

上面的序列化数据是一个User类的对象,其中$age=20, $name=John。

这时,echo $obj ;直接echo对象,就能调用魔术方法__toString,在User类中已经对这个魔术方法进行了重载,即输出一段字符串,运行效果如下:

3、漏洞挖掘

这类漏洞相当隐蔽,但是一旦出现效果很到位。挖掘主要是找找unserialize函数中的参数是否是污染数据。找到相应的控制位置,再看看哪个类可以利用起来完成我们的攻击,比如本情景中的FileClass类。

unserialize函数中的参数是否是污染数据的更多相关文章

  1. (转)Java程序利用main函数中args参数实现参数的传递

    Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,J ...

  2. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  3. 问题:C#控制台程序参数;结果:设置与读取C#控制台应用程序Main函数中的参数args

    设置与读取C#控制台应用程序Main函数中的参数args 在项目属性面版->调试->命令行参数设置.空格分隔.读取:string[] str = Environment.GetComman ...

  4. Main函数中的参数argc,argv的使用简单解析

    本篇文章是对Main函数中的参数argc,argv的使用进行了简单的分析介绍,需要的朋友参考下: C/C++语言中的main函数,经常带有参数argc,argv,如下:  int main(int a ...

  5. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置

    vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...

  6. python函数中的参数类型

    python函数中的参数 动态获取函数的参数 python的函数类型详解

  7. Python函数中的参数(二)

    当使用混合特定的参数匹配模型时,Python将会遵循以下有关顺序的法则: 1.在函数调用中,参数必须以这样的顺序出现:任何位置参数(Value).任何关键字参数(name = Value)和*sequ ...

  8. Python函数中的参数(一)

    函数传递参数时的简要关键点: 1.参数的传递是通过自动将对象赋值给本地变量名来实现的.函数参数在实际中只是Python赋值的一个实例.因为引用是以指针的形式实现的,所有的参数实际上都是通过指针进行传递 ...

  9. PHP函数中默认参数的的写法

    函数可以定义 C++ 风格的标量参数默认值,如下所示: Example #3 在函数中使用默认参数 <?php function makecoffee($type = "cappucc ...

随机推荐

  1. win平台检查内存泄露

    int main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetBre ...

  2. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...

  3. HDU1130 卡特兰数

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. JDK1.7 HashMap 源码分析

    概述 HashMap是Java里基本的存储Key.Value的一个数据类型,了解它的内部实现,可以帮我们编写出更高效的Java代码. 本文主要分析JDK1.7中HashMap实现,JDK1.8中的Ha ...

  5. ASP.Net核心对象HttpRequest

    描述context. Request["username"]; 通过这种方式,能够得到一个HttpRequest对象.HttpRequest对象描述了,关于请求的相关信息,我们可以 ...

  6. linux常见问题集锦-1

    http://www.cnblogs.com/itech/archive/2011/02/12/1952857.html 感谢作者分享 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 . ...

  7. PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例

    网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了.研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向. http://blog.csdn.net/cqcre/arti ...

  8. jquery easy ui 1.3.4 数据表格(DataGrid)(8)

    8.1.创建DataGrid html代码 <table id="dg"></table> $("#dg").datagrid({ // ...

  9. js 使用json.js处理json对象

    使用参考代码: <script src="json/json2.js"></script> <script type="text/javas ...

  10. Java hour5

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为4 Hour,请各位不吝赐教. Hour5 神一样 ...