Web_Bugku_WriteUp | 变量1
题目
分析
<?php
error_reporting(0); // 不显示报错信息
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){ // get传入的args值非空
$args = $_GET['args']; // 将传入的值赋给args
if(!preg_match("/^\w+$/",$args)){ // 如果args从开头到结尾匹配到非字母或非数字或非下划线
die("args error!"); // 输出"args error!"并退出脚本
}
eval("var_dump($$args);"); // 将与arge值同名变量的相关信息作为php代码执行
}
?>
根据代码内容能够获得的信息主要有:
- 传入 args 的字符串参数只能包含字母数字下划线。
- 以 args 值为变量名的变量被格式化后将作为 php 代码被执行后输出。
显然我们需要向 arge 传入一个已经存在的变量以获得变量内容。
先尝试输入 “flag” 但没有输出 flag 内容,遂 WP 解法:BugKu 变量1-雨落洛-博客园
了解到 php 存在九大全局变量,分别是 $_POST
$_GET
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
SERVER
$GLOBALS
和 $_ENV
。其中 $GLOBALS
是一个包含了全部变量的全局组合数组,通过向 args 传入 GLOBALS 即可获得包括 flag 的所有变量的名称及内容。payload:?args=GLOBALS
:
输出 flag 的变量名为 ZFkwe3。