[安洵杯 2019]easy_serialize_php

前言

这我不狗一篇
之前做过16年的piapiapia
本来以为应该挺简单的,就是字符串变少了进行逃逸
但网上wp
尼玛都是直接给payload
算了算了
懂原理就完事了

这题看的我着实难受
也没构造
上来就给payload
然后根据payload来理解

无实操 单纯原理

<?php

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

function filter($img){
  $filter_arr = array('php','flag','php5','php4','fl1g');
  $filter = '/'.implode('|',$filter_arr).'/i';
  return preg_replace($filter,'',$img);
}


if($_SESSION){
  unset($_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']));
}

$serialize_info = filter(serialize($_SESSION));

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']));
}

根据源码
大致思路:
1、逃逸第一步
这里先大致了解extra

<?php

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
var_dump($_SESSION);
echo "<br/>";
extract($_POST);
var_dump($_SESSION);

这里是原本var_dump两次出来的结果
但当我们POST一个值后
就变成了
在这里插入图片描述
这就是实现该结构逃逸的第一步
2、逃逸第二步

if(!$_GET['img_path']){
  $_SESSION['img'] = base64_encode('guest_img.png');
}else{
  $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

这里对我们传入的img_path做了处理
img_path变成了后处理,并且加上了sha1签名验证
所以这里就有了思路,让img_path来顶替guest_img.png的位置

function filter($img){
  $filter_arr = array('php','flag','php5','php4','fl1g');
  $filter = '/'.implode('|',$filter_arr).'/i';
  return preg_replace($filter,'',$img);
}

这里可以看一下对filter数组进行了过滤,直接无了
payload:
GET

f=show_image

POST

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"im

2条评论

  1. 楼主为什么不可以直接POST传参 $_SESSION[‘img’]=”ZDBnM19mMWFnLnBocA==”; ,我本地试了下直接传参不受影响的呀,但是不知道为什么没出flag

    1. 你好,因为直接POST[‘img’],会对传入的参数进行base64解码并进行sha1算法处理,也就导致参数失效,所以需要逃逸到guest_img.png的位置,让参数仅进行base64处理,这样就可以拿到flag了。如果解释的不清楚,可以加下我的QQ:825514053。另外我技术很垃圾,如果仍有解释不清楚的地方,还请见谅。

发表评论

您的电子邮箱地址不会被公开。