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等关键字替换为空。这样就会破坏掉反序列化的结构。