常见的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; }