一、题目:
flag In the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
二、答案:
1.输入全局变量:?args=GLOBALS
2.输入args对应的键值对:?args=ZFkwe3
三、代码逐行分析:
1.
error_reporting(0);
-
作用:关闭所有错误报告。
-
风险:这会让代码中的错误(如语法错误、未定义变量等)不会显示出来,不利于调试。对于开发者来说,关闭错误报告会隐藏潜在问题。
-
建议:在开发阶段,应开启错误报告(如
error_reporting(E_ALL);
),以便及时发现并修复问题。
2.
include "flag1.php";
-
作用:引入当前目录下的
flag1.php
文件。 -
关键点:
flag1.php
可能包含敏感信息(如数据库密码、API密钥等),但具体内容未知。如果flag1.php
中有敏感数据,直接暴露文件路径可能导致安全风险。 -
风险:如果攻击者能访问该文件,可能获取敏感信息。
3.
highlight_file(__file__);
-
作用:高亮显示当前文件(即这段代码本身)的内容。
-
关键点:这会直接将PHP代码以高亮形式输出到网页上,可能暴露服务器路径信息(如文件路径中的敏感目录)。
-
风险:泄露服务器路径信息,攻击者可能利用此信息进行进一步攻击。
4.
if(isset($_GET['args']))
-
作用:检查URL中是否存在名为
args
的GET参数。 -
示例:如果访问URL是
http://example.com/script.php?args=test
,则$_GET['args']
的值为test
。
5.
$args = $_GET['args'];
-
作用:将URL中的
args
参数值赋给变量$args
。 -
关键点:用户输入直接赋值给变量,需严格验证输入内容。
6.
if(!preg_match("/^\w+$/",$args))
-
作用:使用正则表达式验证
$args
是否仅包含字母、数字和下划线(\w+
)。 -
正则解释:
-
^
:匹配字符串开头。 -
\w+
:匹配一个或多个字母、数字或下划线。 -
$
:匹配字符串结尾。
-
-
示例:
-
args=abc123
:合法。 -
args=abc-123
:非法(包含连字符-
)。
-
-
风险:虽然过滤了部分特殊字符,但仍可能绕过(如利用PHP变量特性)。
7. eval("var_dump($$args);");
-
作用:执行动态生成的PHP代码
-
关键点:$$args将$args的值作为变量名来访问
-
风险:eval函数会直接执行用户输入的代码,可能导致代码注入攻击。即使输入经过正则验证,攻击者仍可能通过构造特殊输入绕过限制
-
潜在的安全漏洞:代码注入漏洞——通过eval函数,攻击者可以执行任意PHP代码,如果args=GLOBALS,args等价于$GLOBALS,攻击者可能访问全局变量。