提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目介绍:
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
题目分析:
-
if(isset($_GET['c'])){
:检查GET请求中是否存在参数c
。 -
$c = $_GET['c'];
:如果存在,将参数c
的值赋给变量$c
。 -
使用正则表达式检查变量
$c
中是否不包含一系列特定的字符。这个正则表达式尝试排除一些可能用于代码注入的特殊字符和一些常见符号。 -
eval($c);
:如果$c
变量中不包含上述正则表达式定义的任何字符,则使用eval
函数执行$c
中的PHP代码。这是一个非常危险的操作,因为eval
会执行任何传入的PHP代码,这可能包括恶意代码。 -
}else{
:如果GET请求中没有参数c
,则执行else
块中的代码。 -
highlight_file(__FILE__);
:如果没有参数c
,这个函数会高亮显示当前文件的内容。这通常用于调试目的,但在生产环境中使用可能会暴露敏感信息。 -
}
:结束if-else
语句。
payload:
?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
payload解释:
这段代码尝试通过GET请求利用PHP的eval
函数执行恶意代码。下面是对这段代码的分析:
?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
:这是一个GET请求的参数c
,其值是一个PHP表达式。
echo
:PHP中的输出函数,用于输出字符串或表达式的结果。highlight_file
:PHP中的函数,用于高亮显示PHP文件的内容。next
:PHP中的函数,用于将内部指针向前移动到下一个元素。array_reverse
:PHP中的函数,用于反转数组元素的顺序。scandir
:PHP中的函数,用于列出目录中的文件和子目录。pos
:PHP中的函数,返回数组中当前元素的键名。localeconv()
:PHP中的函数,返回本地化的数字和货币格式信息。
具体来说,这段代码的执行流程如下:
localeconv()
:获取本地化的数字和货币格式信息。pos(localeconv())
:获取localeconv()
返回数组的键名。scandir(pos(localeconv()))
:列出pos(localeconv())
指向的目录中的文件和子目录。array_reverse(scandir(pos(localeconv())))
:反转这些文件和子目录的顺序。next(array_reverse(scandir(pos(localeconv()))))
:将内部指针移动到下一个元素,即下一个文件或子目录。highlight_file(next(array_reverse(scandir(pos(localeconv())))))
:高亮显示这个文件的内容。echo
:输出这个高亮显示的内容。
payload2:
?c=eval(next(reset(get_defined_vars())));&1=;system("tac%20flag.php");
payload2解释:
-
?c=eval(next(reset(get_defined_vars())));
:这是GET请求的一部分,其中c
参数的值是一个PHP表达式。get_defined_vars()
:这个函数返回当前所有已定义变量的数组,包括局部变量和全局变量。reset()
:这个函数将数组内部指针指向第一个元素,并返回该元素的值。next()
:这个函数将数组内部指针向前移动一位,并返回当前指针处的元素值。eval()
:这个函数执行字符串作为PHP代码。
这段代码的目的是尝试执行
get_defined_vars()
返回的第一个元素的下一个元素的值作为PHP代码。 -
&1=;system("tac%20flag.php");
:这是GET请求的另一部分,尝试通过URL参数执行系统命令。system()
:这个函数执行一个shell命令,并将完整的输出返回。"tac%20flag.php"
:这里的命令是tac flag.php
,tac
是反向输出文件内容的Unix命令,%20
是URL编码的空格。
这段代码的目的是尝试执行
flag.php
文件的反向内容。
flag
flag=“ctfshow{96c8b1e3-29aa-4010-8f8f-c2437ccb6502}”