变量漏洞覆盖介绍
变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞。通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成的危害可能是无法估量的。例如购买商品的支付系统若存在变量覆盖漏洞,就可能存在0元支付下单的情况。
漏洞产生的原因:
extract()
parse_str()
import_request_variables()
$$(可变变量)
register_globals=On (PHP5.4之后正式移除此功能)
由$$变量赋值引发的覆盖
$$典型的变量覆盖代码
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
在配置文件common.inc.php
中存在以下代码
全局搜索哪个文件包含了该配置文件
访问index.php
加载的是templates
中的index.html
页面。
我们在index.php中定义如下变量:这个变量一定要定义在加载templates模板之前才能将变量输出。
在index.html输出上面的变量
打开浏览器访问index.php页面
由于index.php
包含了common.inc.php
,并且common.inc.php
中存在变量覆盖的代码可以接收get
、post
、cookie
的传参即:
我们访问http://127.0.0.1/MetInfo5.1.4/index.php?test=12312312312
就可以覆盖原有test变量的值
结合文件包含
由上面引发思路,如果一个存在文件包含漏洞的文件也包含了common.inc.php
配置文件,那么我们是不是就可以以传参的方式来控制被包含的文件了呢???
假如index.php
如下:
<?php
include("common.inc.php")
$file = "a.php"
include($file)
// /index.php?file=1.txt 即可改变原有的$file值
?>
全局搜索文件包含关键字require_once
,变量可控。
这里我们看到文件包含的参数是$module
,如果我们结合前面的变量覆盖就可以实现文件包含了,但前提是在这个文件中要包含common.inc.php
这个配置文件,我们才能以传参的方式覆盖变量。
查看../include/module.php
是否包含common.inc.php
也就是说我们访问/about/index.php
也会执行common.inc.php
中的代码
接下来查看$model
变量是如何被赋值的
$fmodel
控制$model
的值
目的是覆盖原有的变量,源$fmodule=1;
访问:http://127.0.0.1/MetInfo5.1.4/about/index.php?fmodule=7&module=1.txt