点击"仙网攻城狮”关注我们哦~

不当想研发的渗透人不是好运维

让我们每天进步一点点

简介

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

php反序列化常用函数:

  serialize和unserialize
#当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
  json_encode 和 json_decode
#使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
#JSON格式是可读的。
#JSON格式比serialize返回数据结果小。
#JSON格式是开放的、可移植的。其他语言也可以使用它。
  var_export 和 eval
#var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。
  wddx_serialize_value 和 wddx deserialize
#wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。

实战

PHP反序列化漏洞

1.实战中使用serialize和unserialize来演示一下反序列化漏洞的现象,前提需要了解这两个函数的作用。

序列化serialize()

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象: 

 class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化
    序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表对象名字长度为一个字符
        S:对象的名称
        1:代表对象里面有一个变量
        s:数据类型
        4:变量名称的长度
        test:变量名称
        s:数据类型
        7:变量值的长度
        pikachu:变量值

           反序列化unserialize() 

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

  $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
   echo $u->test; //得到的结果为pikachu   

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

  常见的几个魔法函数:
        __construct()当一个对象创建时被调用
        __destruct()当一个对象销毁时被调用
        __toString()当一个对象被当作一个字符串使用
        __sleep() 在对象在被序列化之前运行
        __wakeup将在序列化之后立即被调用

2.一般反序列化漏洞都是通过代码审计而发现,一般的黑盒测试是很难发现的。查看一下后台代码。

3.根据上面的处理逻辑我们自己写一个php页面来尝试生成一个payload。

4.访问一下刚刚的php页面可以弹窗。

5.确认后点击鼠标右键,查看页面源代码获取payload。

6.把O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}源代码直接复制发送给api。

7.总结:想要挖掘反序列化漏洞一定要对序列化和反序列化函数特别熟悉,最起码得知道序列化后是什么,反序列化后是什么,才能挖的顺利。

往期内容

XXE 外部实体注入漏洞

BurpSuite进阶篇--自动化挖掘越权漏洞

不安全的文件下载,小心服务器变成黑客后花园!!!

RCE漏洞,黑客如何远程控制你的服务器

Android渗透工具drozer安装与使用

更多资讯长按二维码 关注我们

   专业的信息安全团队,给你最安全的保障。定期推送黑客知识和网络安全知识文章,让各位了解黑客的世界,学习黑客知识,普及安全知识,提高安全意识。

觉得不错点个“赞”呗      

更多推荐