### 简要描述:
包括多个存储型XSS,越权
### 详细说明:
1.首先来看存储型XSS漏洞,这个漏洞的根源在于mao10cms对于富文本的过滤函数不完善,我们来看mao10cms的过滤策略。
```
function mc_remove_html($text, $type = 'html') {
if($type=='all') {
$text = nl2br($text);
$text = real_strip_tags($text);
$text = addslashes($text);
$text = trim($text);
} else {
// 无标签格式
$text_tags = '';
//只保留链接
$link_tags = '<a>';
//只保留图片
$image_tags = '<img>';
//只存在字体样式
$font_tags = '<i><b><u><s><em><strong><font><big><small><sup><sub><bdo><h1><h2><h3><h4><h5><h6>';
//标题摘要基本格式
$base_tags = $font_tags . '<p>
<hr><a><img><map><area><pre><code><q><blockquote><acronym><cite><ins><del><center><strike>';
//兼容Form格式
$form_tags = $base_tags . '<form><input><textarea><button><select><optgroup><option><label><fieldset><legend>';
//内容等允许HTML的格式
$html_tags = $base_tags . '<ul><ol><li><dl><dd><dt><table><caption><td><th><tr><thead><tbody><tfoot><col><colgroup><div><span><object><embed><param>';
//专题等全HTML格式
$all_tags = $form_tags . $html_tags . '<!DOCTYPE><meta><html><head><title><body><base><basefont><script><noscript><applet><object><param><style><frame><frameset><noframes><iframe>';
//过滤标签
$text = real_strip_tags($text, ${$type . '_tags'});
// 过滤攻击代码
if ($type != 'all') {
// 过滤危险的属性,如:过滤on事件lang js
while (preg_match('/(<[^><]+)(ondblclick|onclick|onload|onerror|unload|onmouseover|onmouseup|onmouseout|onmousedown|onkeydown|onkeypress|onkeyup|onblur|onchange|onfocus|action|background|codebase|dynsrc|lowsrc)([^><]*)/i', $text, $mat)) {
$text = str_ireplace($mat[0], $mat[1] . $mat[3], $text);
}
while (preg_match('/(<[^><]+)(window\.|javascript:|js:|about:|file:|document\.|vbs:|cookie)([^><]*)/i', $text, $mat)) {
$text = str_ireplace($mat[0], $mat[1] . $mat[3], $text);
}
}
}
return $text;
};
```
2.可以看出mao10cms过滤了很多危险的标签,事件等。但是对标签和事件的过滤还是不完整,可以用embed和object标签进行绕过。以互动社区----新建话题为例,同样的问题多处存在
[<img src="https://images.seebug.org/upload/201510/13120624060705668e143d38ecc732635181c2b7.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201510/13120624060705668e143d38ecc732635181c2b7.png)
新建话题的过程中,进行抓包。修改其中的content字段为
```
%3Cobject%20data%3D%22data%3Atext%2fhtml%3Bbase64%2CPHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ%2b%22%3E%3C%2fobject%3E
```
该段payload,是对object标签进行urlencode编码之后的结果。
[<img src="https://images.seebug.org/upload/201510/131207492a2ab71cdd71fb3635fb421417a0763d.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201510/131207492a2ab71cdd71fb3635fb421417a0763d.png)
3.然后可以看到添加的话题
[<img src="https://images.seebug.org/upload/201510/13120823c8a07d844eb5a9708a9dc48c5d498dbe.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201510/13120823c8a07d844eb5a9708a9dc48c5d498dbe.png)
4.再来越权漏洞,定位到文件
do/cart_delete.php文件
```
<?php
require 'functions.php';
if(mc_user_id()) :
if($_POST['id']>0 && $_POST['url']) :
$db->where('id',$_POST['id']);
$cart = $db->getOne('rank_to_pro');
if($cart['id']>0) :
if($cart['package']>0) :
$db->where('package',$cart['package']);
else :
$db->where('id',$cart['id']);
endif;
if($db->delete('rank_to_pro')) :
mc_update_stock($cart['pro_id'],$cart['parameter'],1);
$url = $_POST['url'].'&showcart=1&done=删除成功';
else :
$url = $_POST['url'].'&showcart=1&done=删除失败';
endif;
else :
$url = mc_option('site_url').'?done=操作参数有误&showcart=1';
endif;
else :
$url = mc_option('site_url').'?done=操作参数有误&showcart=1';
endif;
else :
$url = mc_option('site_url').'?m=user&a=login&done=请先登录';
endif;
Header("Location:$url");
?>
```
可以看出这里mao10cms只是验证了是否登录,而没有验证cart是否属于该用于,没有对所有权进行验证。这就有越权删除他人cart的漏洞
5.同样的越权漏洞还有,do/comment_delete.php
```
<?php
require 'functions.php';
if(mc_user_id()>0) :
if($_GET['id']>0) :
$db->where('id',$_GET['id']);
$comment = $db->getOne('comments');
if($comment['id']>0) :
$db->where('id',$_GET['id']);
if($db->delete('comments')) :
$url = mc_option('site_url').'?m=shop&a=topic&id='.$comment['topic_id'].'&done=删除成功';
else :
$url = mc_option('site_url').'?m=shop&a=topic&id='.$comment['topic_id'].'&done=删除失败';
endif;
else :
$url = mc_option('site_url').'?done=参数错误';
endif;
else :
$url = mc_option('site_url').'?done=参数错误';
endif;
else :
$url = mc_option('site_url').'?m=user&a=login&done=请先登录';
endif;
Header("Location:$url");
?>
```
和上面一样,可以越权删除他人的comment。
### 漏洞证明:
[<img src="https://images.seebug.org/upload/201510/13120823c8a07d844eb5a9708a9dc48c5d498dbe.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201510/13120823c8a07d844eb5a9708a9dc48c5d498dbe.png)
越权的就不截图的,相信程序员懂得。截图的话不好比较,麻烦
暂无评论