常见的cms不可避免的会遇到各种bug和漏洞,当然等待官方也可以.当然发现漏洞后肯定想立刻修复!、
xxs的风险 首先会使用alert简单的脚本测试是否能运行,接着可以插入获取cookie 模拟用户的登陆状态或管理员的登陆状态。。。
以免招到入侵拿站的可能。
接下来详解dedecms5.7 tags的xxs漏洞
首先发现一个很奇怪的url

在url里面插入js来者不善这是运行一个alert 来测试是否有运行js的可能。
接着dedecms的page生成函数果然中招

当然显示红色的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

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的处理中

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

看到一个获取url?

结果发现这个getcurlurl什么处理都没有了。。。!!!
那就只能自己手动加上了。!

去除标签转移HTML当然用官方的之前过滤方法也可以,当然也可以伪静态处理。屏蔽tag的直接访问。
这个时候分页终于是正常状态了:

当然更完美就是直接把官方的过滤复制过来:
/**
* 获得当前的页面文件的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;
}
