[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-$$变量覆盖 | 1 |
[题目考点]:
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。
经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数等.
[Flag格式]:
SangFor{yIMTJpEwJghjSgd5}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2009
[题目writeup]:
1、实验主页
2、源码分析
<?php
error_reporting(0);
include "flag.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die();
}
eval("var_dump($$args);");
}
else{
"yyds";
}
?>
分析代码逻辑,首先检测变量是否设置,然后是一个正则匹配传入的值。
/^\w+$/
两个//表示开始和结束
^表示开始字符串
$表示结束字符串
\w表示包含[a-z,A-Z, _ , 0-9]
+表示一个或者多个\w
总体意义就是限定一个任意长字符串全部由字母数字组成,前面中间后面都不能有空格、标点等非\w字符。
如果args的值是只由大小写字母数字和下划线,则执行eval("var_dump($$args)")。
通过提示"flag在变量里",想能不能通过打印所有变量的值来获得flag。
这里介绍一个超全局变量$GLOBALS,它可以引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键),与所有其他超全局变量不同。我们尝试输入"?args=GLOBALS"获得flag
http://localhost/?args=GLOBALS