dedecms5.7的tags xxs 跨站 漏洞修复

2016-09-16 来源:apizl.com 点击:163

常见的cms不可避免的会遇到各种bug和漏洞,当然等待官方也可以.当然发现漏洞后肯定想立刻修复!、

xxs的风险 首先会使用alert简单的脚本测试是否能运行,接着可以插入获取cookie 模拟用户的登陆状态或管理员的登陆状态。。。

以免招到入侵拿站的可能。

接下来详解dedecms5.7 tags的xxs漏洞

首先发现一个很奇怪的url

QQ截图20160916080219.png

 
在url里面插入js来者不善这是运行一个alert 来测试是否有运行js的可能。

接着dedecms的page生成函数果然中招

QQ截图20160916073544.png

当然显示红色的alert是浏览器发现了跨站脚本 变红了。为什么会这样样子呢?

我们一步步分析。

首先文章和列表都没有出现这种情况是因为使用了伪静态!

我们来看看伪静态的规则:

RewriteEngine On 
RewriteRule ^category/list-([0-9]+)\.html$ /list.php?tid=$1 
RewriteRule ^category/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /list.php?tid=$1&totalresult=$2&PageNo=$3 
RewriteRule ^archives/view-([0-9]+)-1\.html$ /view.php?arcID=$1 
RewriteRule ^archives/view-([0-9]+)-([0-9]+)\.html$ /view.php?aid=$1&pageno=$2 
RewriteRule ^plus/view-([0-9]+)-1\.html$ /view.php?arcID=$1 
RewriteRule ^plus/view-([0-9]+)-([0-9]+)\.html$ /view.php?aid=$1&pageno=$2

首先伪静态使用了正则只取数字其他的传进来只是去404报错页面,所以不存在xxs!

接着我们打开根目录下的tags

QQ截图20160916074340.png

tags一开始有过滤

/**
 *  过滤用于搜索的字符串
 *
 * @param     string  $keyword  关键词
 * @return    string
 */
if ( ! function_exists('FilterSearch'))
{
    function FilterSearch($keyword)
    {
        global $cfg_soft_lang;
        if($cfg_soft_lang=='utf-8')
        {
            $keyword = preg_replace("/[\"\r\n\t\$\\><']/", '', $keyword);
            if($keyword != stripslashes($keyword))
            {
                return '';
            }
            else
            {
                return $keyword;
            }
        }
        else
        {
            $restr = '';
            for($i=0;isset($keyword[$i]);$i++)
            {
                if(ord($keyword[$i]) > 0x80)
                {
                    if(isset($keyword[$i+1]) && ord($keyword[$i+1]) > 0x40)
                    {
                        $restr .= $keyword[$i].$keyword[$i+1];
                        $i++;
                    }
                    else
                    {
                        $restr .= ' ';
                    }
                }
                else
                {
                    if(preg_match("/[^0-9a-z@#\.]/",$keyword[$i]))
                    {
                        $restr .= ' ';
                    }
                    else
                    {
                        $restr .= $keyword[$i];
                    }
                }
            }
        }
        return $restr;
    }
}

然后接着看模板 应该就出现page的处理中

QQ截图20160916075143.png

我们去找相关的生成类 arc.taglist.class.php

QQ截图20160916075242.png

看到一个获取url?

QQ截图20160916075340.png

结果发现这个getcurlurl什么处理都没有了。。。!!!

那就只能自己手动加上了。!

QQ截图20160916075428.png

去除标签转移HTML当然用官方的之前过滤方法也可以,当然也可以伪静态处理。屏蔽tag的直接访问。

这个时候分页终于是正常状态了:

QQ截图20160916075642.png

当然更完美就是直接把官方的过滤复制过来:

    /**
     *  获得当前的页面文件的url
     *
     * @access    private
     * @return    string
     */
    function GetCurUrl()
    {
        if(!empty($_SERVER["REQUEST_URI"]))
        {
            $nowurl = $_SERVER["REQUEST_URI"];
            $nowurls = explode("?",$nowurl);
            $nowurl = $nowurls[0];
        }
        else
        {
            $nowurl = $_SERVER["PHP_SELF"];
        }
        $nowurl=  $this->FilterSearch($nowurl);
        $nowurl=  strip_tags($nowurl);
        $nowurl = htmlspecialchars($nowurl);
        return $nowurl;
    }
    function FilterSearch($keyword)
    {
        global $cfg_soft_lang;
        if($cfg_soft_lang=='utf-8')
        {
            $keyword = preg_replace("/[\"\r\n\t\$\\><']/", '', $keyword);
            if($keyword != stripslashes($keyword))
            {
                return '';
            }
            else
            {
                return $keyword;
            }
        }
        else
        {
            $restr = '';
            for($i=0;isset($keyword[$i]);$i++)
            {
                if(ord($keyword[$i]) > 0x80)
                {
                    if(isset($keyword[$i+1]) && ord($keyword[$i+1]) > 0x40)
                    {
                        $restr .= $keyword[$i].$keyword[$i+1];
                        $i++;
                    }
                    else
                    {
                        $restr .= ' ';
                    }
                }
                else
                {
                    if(preg_match("/[^0-9a-z@#\.]/",$keyword[$i]))
                    {
                        $restr .= ' ';
                    }
                    else
                    {
                        $restr .= $keyword[$i];
                    }
                }
            }
        }
        return $restr;
    }


文章由爱资料原创 来源:http://www.apizl.com/archives/view-132839-1.html,欢迎分享本文,转载请保留出处!
分享: