题目介绍:
<?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__);
}
题目分析:
这段代码是一个 PHP 脚本的一部分,是用于执行用户输入的代码片段。不过,它包含了一些安全漏洞,以下是对代码的分析和潜在问题:
-
错误报告关闭:
error_reporting(0);
这一行关闭了错误报告,这会隐藏可能的错误信息,使得调试和发现问题变得更加困难。
-
用户输入处理:
if(isset($_GET['c'])){
检查是否接收到了c
参数。$c = $_GET['c'];
获取c
参数的值。
-
正则表达式过滤:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\
|echo|;|(/i", $c)){` 使用正则表达式过滤一些关键词,防止执行一些危险的命令。然而,这个正则表达式并不完全有效,因为它没有考虑到一些其他的潜在危险字符或命令。
-
代码执行:
eval($c);
执行传入的 PHP 代码。这是非常危险的,因为它可以执行任何 PHP 代码,包括恶意代码。
-
默认行为:
else{ highlight_file(__FILE__); }
如果没有接收到c
参数,脚本会显示当前文件的内容。
潜在问题:
- 代码注入:由于使用了
eval()
,任何有效的 PHP 代码都可以被执行。这可能导致严重的安全问题,如远程代码执行。 - 过滤不充分:正则表达式过滤可能不够全面,无法阻止所有恶意输入。
- 错误隐藏:关闭错误报告可能会隐藏一些关键的错误信息,使得问题更难被发现和解决。
payload:
?c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>
payload解释:
这段代码尝试通过 URL 参数传递恶意代码来绕过原始 PHP 脚本中的安全检查。让我们逐步分析:
-
参数传递:
?c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>
- 这里使用了
include
语句,尝试将$_GET[1]
作为文件名来包含。
-
原始脚本的正则表达式过滤:
- 原始脚本中的正则表达式尝试过滤掉一些关键词,但存在漏洞。它没有过滤掉
include
这样的关键词。
- 原始脚本中的正则表达式尝试过滤掉一些关键词,但存在漏洞。它没有过滤掉
-
eval 执行:
- 如果正则表达式匹配失败(即没有匹配到禁止的关键词),则执行
eval($c)
。
- 如果正则表达式匹配失败(即没有匹配到禁止的关键词),则执行
分析:
- 原始脚本的正则表达式过滤没有考虑到
include
语句的使用,这使得攻击者可以通过构造特定的参数来绕过过滤。 - 通过构造
?c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>
,攻击者尝试执行include
语句,从而绕过eval
函数的限制。
具体步骤:
-
参数解析:
$_GET['c']
被设置为include$_GET[1]?>
$_GET[1]
被设置为data://text/plain,<?php system("tac flag.php")?>
-
执行:
- 脚本首先尝试执行
eval($_GET['c'])
,但由于include
语句不在正则表达式的过滤范围内,它将执行include $_GET[1]
。
- 脚本首先尝试执行
-
文件包含:
include $_GET[1]
将包含data://text/plain,<?php system("tac flag.php")?>
,这实际上是一个数据 URI,包含 PHP 代码。
-
系统命令执行:
- 包含的代码执行
system("tac flag.php")
,这将执行系统命令tac flag.php
,可能会泄露或修改文件内容。
- 包含的代码执行
flag:
flag=“ctfshow{eeeb78d3-831d-4a1b-bc6d-ff8d2d617768}”
行远自迩,登高自卑。