<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Wolves Security Team - DedeCMSV53任意变量覆盖漏洞]]></title>
	<link rel="self" href="http://bbs.wolvez.org/feed/atom/topic/80/"/>
	<updated>2009-05-27T16:58:49Z</updated>
	<generator>PunBB</generator>
	<id>http://bbs.wolvez.org/topic/80/</id>
		<entry>
			<title type="html"><![CDATA[DedeCMSV53任意变量覆盖漏洞]]></title>
			<link rel="alternate" href="http://bbs.wolvez.org/post/209/#p209"/>
			<content type="html"><![CDATA[<p>今天看到mr_xhming同学一个文章（http://hi.baidu.com/mr_xhming/blog/item/8176f00bf540f11795ca6b3f.html），发现这个老BUG还没被修补的样子，从内部论坛转一个pp出来，欢迎大家拍砖</p><p>DedeCMSV53任意变量覆盖漏洞 </p><p>BY flyh4t<br /><a href="http://www.wolvez.org">http://www.wolvez.org</a><br />2008-12-12</p><p>DedeCMSV53发布了，但是依旧没有将变量覆盖漏洞彻底修补。这个漏洞和ryat那个很相似 :)<br />看核心文件include/common.inc.php中的代码</p><div class="codebox"><pre><code>//检查和注册外部提交的变量
foreach($_REQUEST as $_k=&gt;$_v)
{
    if( strlen($_k)&gt;0 &amp;&amp; eregi(&#039;^(_|cfg_|GLOBALS)&#039;,$_k) &amp;&amp; !isset($_COOKIE[$_k]) )//程序员逻辑混乱了？
    {
        exit(&#039;Request var not allow!&#039;);
    }
}</code></pre></div><p>这个地方可以通过提交_COOKIE变量绕过cfg_等关键字的过滤<br />接着是注册变量的代码<br /></p><div class="codebox"><pre><code>foreach(Array(&#039;_GET&#039;,&#039;_POST&#039;,&#039;_COOKIE&#039;) as $_request)
{
    foreach($$_request as $_k =&gt; $_v) ${$_k} = _RunMagicQuotes($_v);
}</code></pre></div><p>然后初始化变量</p><br /><div class="codebox"><pre><code>//数据库配置文件
require_once(DEDEDATA.&#039;/common.inc.php&#039;);

//系统配置参数
require_once(DEDEDATA.&quot;/config.cache.inc.php&quot;);</code></pre></div><p>看似不能利用了，但是幸运的是在文件最后有这样一段代码<br /></p><div class="codebox"><pre><code>//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
    require_once(DEDEINC.&#039;/uploadsafe.inc.php&#039;);
}</code></pre></div><p>再看uploadsafe.inc.php给我们提供了什么<br /></p><div class="codebox"><pre><code>$keyarr = array(&#039;name&#039;,&#039;type&#039;,&#039;tmp_name&#039;,&#039;size&#039;);

foreach($_FILES as $_key=&gt;$_value)
{
    foreach($keyarr as $k)
    {
        if(!isset($_FILES[$_key][$k]))
        {
            exit(&#039;Request Error!&#039;);
        }
    }
    $$_key = $_FILES[$_key][&#039;tmp_name&#039;] = str_replace(&quot;\\\\&quot;,&quot;\\&quot;,$_FILES[$_key][&#039;tmp_name&#039;]);
             //注意这个地方，通过common.inc.php的漏洞，我们是可以控制$_FILES[$_key][&#039;tmp_name&#039;] 的</code></pre></div><p>这里通过提交类似common.inc.php?_FILES[cfg_xxxx][tmp_name] =aaaaaa&amp;……来覆盖cfg_xxxx<br />利用的时候注意给cookie赋值，同时要绕过uploadsafe.inc.php里面的一些判断</p><p>Last edited by flyh4t (2008-12-12 15:59:00)</p>]]></content>
			<author>
				<name><![CDATA[flyh4t]]></name>
				<uri>http://bbs.wolvez.org/user/10/</uri>
			</author>
			<updated>2009-05-27T16:58:49Z</updated>
			<id>http://bbs.wolvez.org/post/209/#p209</id>
		</entry>
</feed>
