变量1

开卷看题

源码审计

代码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
include "flag1.php"; // 文件包含
highlight_file(__file__); // 显示本文件代码
if(isset($_GET['args'])) { // 判断args参数是否存在
$args = $_GET['args']; // 提取args参数
// \w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'
if(!preg_match("/^\w+$/",$args)) { // 正则匹配,只能包含数字、字母、下划线
die("args error!");
}
// 执行$$agrs
eval("var_dump($$args);");
}
?>

总结:如果args参数只有数字、字母和下划线时以代码执行

由于不能存在空格之类的特殊字符,所以flag1文件中应该是定义了全局变量(页面中提示我们flag in variable)

寻找真相

PHP中预定义了一组超变量,其中就有一个$GLOBALS存储了系统全局变量,可以尝试读取此变量的值

更多信息参考:传送门

同时可以看到源码中使用了两次引用,所以最终payload为:GLOBALS

Note:PHP的$符号类似于指针引用并且做了加强,很是方便并且灵活性也很高

面壁思过

在写这篇博文时,尝试payload却总是失败,放出图片你们帮我看看是为什么

总结

知识无小事,基础很重要

温故而知新,才能更长远

好高又骛远,到头一场空