【PHP代码审计】变量覆盖结合文件包含组合拳


变量漏洞覆盖介绍

变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞。通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成的危害可能是无法估量的。例如购买商品的支付系统若存在变量覆盖漏洞,就可能存在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中存在变量覆盖的代码可以接收getpostcookie的传参即:

我们访问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

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44032232/article/details/114068704
今日推荐