PHP反序列化逃逸总结

题目

<?php

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

extract($_POST);

if(!$_GET['cmd']){
    $_SESSION['cmd'] = base64_encode('echo "don\'t touch me";');
}else{
    $_SESSION['cmd'] = sha1(base64_encode($_GET['cmd']));
}


$serialize_by_short = filter_short(serialize($_SESSION));
$userinfo = unserialize($serialize_by_short);
//$serialize_by_long = filter_long(serialize($_SESSION));
//$userinfo = unserialize($serialize_by_long);
@eval(base64_decode($userinfo['cmd']));
// $target_payload = 'system("cat /flag");';

分析

我们的目标是要得到这样的一个Array,才会实现执行。其序列化数据为:

array(1) {
  ["cmd"]=>
  string(20) "system("cat /flag");"
}
//a:1:{s:3:"cmd";s:20:"system("cat /flag");";}

而题目中的cmd我们是不可控的。但我们可以利用变量覆盖,来控制$_SESSION的其它数据。

内容缩短

也是是题干中的filter_short函数。将php/flag等关键字替换为空。这样就会破坏掉反序列化的结构。

posted @ 2020-07-29 22:02  新崔斯特姆的营地  阅读(171)  评论(0编辑  收藏  举报