解题思路※

<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}同样的与31相似,需要我们绕过这个正则表达式,不让他匹配到内容
首先我们看这个匹配了什么,多了些什么
匹配了
flag
system
php
cat
sort
shell
.
空格
单引号'
`反引号
echo
;
以及左括号那么意味着,我们不能使用上述的内容,那我们此前的payload是
next(arrar_reverse(scandir(getcwd())))里面的三个左括号都用不了了
那么这次我们尝试一下使用通过参数来绕过
同样的eval()也用不了,
所以我们改用include
include 后面只需要接空格然后文件名就可以
那我们也不能直接在include里面传php过滤的代码
那么我们直接创建一个新的参数
$_GET[1]
把这个参数传输进去。
然后结尾是;
;被屏蔽了,我们就改用?>
然后我们的1参数,可以用
php://filter/convert.base64-encode/resource=flag.php 
也可以用数据伪协议,伪造一个php文档给他实现
data://text/plain,<?php phpinfo()?>