0%

CTF-PHP序列化安全

PHP序列化安全

序列化和反序列化

1
2
序列化 将复杂的数据结构转换为适合传输和保存的字节类型。(存储)
反序列化 将字节类型转换为复杂的数据结构(程序使用)
  • 序列化和反序列化并非php独有,php,ruby,java都具有该技术。

PHP序列化操作

https://www.php.net/manual/zh/function.serialize.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Site{
public $name='ctf';
public function get_name()
{
echo $name;
echo md5('admin');
}
}
$a=new site();
$b=serialize($a);
echo $b;
$c=unserialize($b);
$c->get_name();
?>

通过反序列化操作将序列化对象 转换为 对象类型,调用其中的get_name方法。如果用户可自定义提交序列化字符串,那么此时反序列化后,就可以控制程序执行的代码,造成安全威胁。

一般不会直接调用方法,而是通过一些魔术方法调用其中的函数。

PHP反序列化CTF案例

1
unserialize()会检查是否存在一个_wakeup()方法,如果存在,则先调用_wakeup方法,预先准备对象需要的资源。

实验代码

1
2
3
4
5
6
7
8
9
<?php
$data=file_get_contents("php://input");
class Site{
public $name='ctf';
public function __wakeup(){
echo 'flag{xxx}';
}
}
$obj =unserialize($data);

1、序列化字符串

1
O:4:"Site":1:{s:4:"name";s:3:"ctf";}

2、发送字符串

1
2
通过burp
post提交字符串

PHP反序列化识别与利用

1
反序列化识别根本 在于发现HTTP请求是否存在序列化字符串

反序列化识别

1
burp 可自动识别HTTP请求中的序列化字符串

1、burp代理截断,截获http请求数据包。

2、burp target扫描请求

1
2
在HTTP中,右键鼠标,进行扫描。
可发现漏洞。

如果要求post提交,需要将get改成post,右键选中change request method。

PHP序列化特殊点介绍

1
在定义类时,对应的属性可设置访问限制。通过public、protected、private进行设置权限。对于序列化对象中的数字是否可以有符号问题。	 

对象中的属性修饰符

定义user类,并且设置属性具有protected和private属性

1
2
3
4
5
6
7
8
<?php
class user{
protected $name='admin';
private $admin='true';
}
$user=new user();
echo serialize($user);
?>

直接查看浏览器无法识别符号,可使用python输出。

1
2
1、protected 修饰的属性在序列化之后,修改为 \x00*\x00属性名
2、private 修饰的属性在序列化之后,修改为 \x00类名\x00属性名

序列化字符串中的+号

1
在序列化字符串中的数字前可使用+号表示正数,不影响反序列化的结果。

可绕过数字过滤,在需要进行URL编码%2b

PHP序列化 - 魔术方法

1
魔术方法 是定义类过程中 以双下划线开头、PHP语言定义好的方法。
1
2
3
4
__construct():类的析造函数
__destruct():类的析构函数
__wakeup():执行unserialize()时,先会调用这个函数
__tostring():类被当作字符串回应的方法。
  • flag被注释的时候,执行命令查看flag时,可用type flag。
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道