PHP序列化安全
序列化和反序列化
1 | 序列化 将复杂的数据结构转换为适合传输和保存的字节类型。(存储) |
- 序列化和反序列化并非php独有,php,ruby,java都具有该技术。
PHP序列化操作
https://www.php.net/manual/zh/function.serialize.php
1 | <?php |
通过反序列化操作将序列化对象 转换为 对象类型,调用其中的get_name方法。如果用户可自定义提交序列化字符串,那么此时反序列化后,就可以控制程序执行的代码,造成安全威胁。
一般不会直接调用方法,而是通过一些魔术方法调用其中的函数。
PHP反序列化CTF案例
1 | unserialize()会检查是否存在一个_wakeup()方法,如果存在,则先调用_wakeup方法,预先准备对象需要的资源。 |
实验代码
1 | <?php |
1、序列化字符串
1 | O:4:"Site":1:{s:4:"name";s:3:"ctf";} |
2、发送字符串
1 | 通过burp |
PHP反序列化识别与利用
1 | 反序列化识别根本 在于发现HTTP请求是否存在序列化字符串 |
反序列化识别
1 | burp 可自动识别HTTP请求中的序列化字符串 |
1、burp代理截断,截获http请求数据包。
2、burp target扫描请求
1 | 在HTTP中,右键鼠标,进行扫描。 |
如果要求post提交,需要将get改成post,右键选中change request method。
PHP序列化特殊点介绍
1 | 在定义类时,对应的属性可设置访问限制。通过public、protected、private进行设置权限。对于序列化对象中的数字是否可以有符号问题。 |
对象中的属性修饰符
定义user类,并且设置属性具有protected和private属性
1 | <?php |
直接查看浏览器无法识别符号,可使用python输出。
1 | 1、protected 修饰的属性在序列化之后,修改为 \x00*\x00属性名 |
序列化字符串中的+号
1 | 在序列化字符串中的数字前可使用+号表示正数,不影响反序列化的结果。 |
可绕过数字过滤,在需要进行URL编码%2b
PHP序列化 - 魔术方法
1 | 魔术方法 是定义类过程中 以双下划线开头、PHP语言定义好的方法。 |
1 | __construct():类的析造函数 |
- flag被注释的时候,执行命令查看flag时,可用type flag。