### 简要描述: 不搞论坛了,换个姿势继续x,最新版也受到影响 ### 详细说明: 存在xss的地方在商品评论的用户名处 [<img src="https://images.seebug.org/upload/201407/25142842e2a2e710b23cc3c55491ededcad104b6.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/25142842e2a2e710b23cc3c55491ededcad104b6.jpg) 直接给出xss语句,360脚本拦截html实体编码,所以需要使用\uxxxx编码。语句如下: ``` <input onfocus=onfocus=\u0061lert(1) autofocus> ``` 漏洞的成因主要是因为正则没写好,并且碰巧用户名处没去除html标签导致的。我们一步一步看: 首先我们输入的数据会来到uploads\lib\default\comment_act.php的第8行: ``` function add_action() { if(front::post('submit') &&front::post('aid')) { if(config::get('verifycode')) { if(front::post('verify')<>session::get('verify')) { alertinfo('验证码错误。', front::$from); //front::redirect(front::$from); } } if(!front::post('username')) { /*front::flash(lang('请留下你的名字!')); front::redirect(front::$from);*/ alertinfo('请留下你的名字!', front::$from); } if(!front::post('content')) { /*front::flash(lang('请填写评论内容!')); front::redirect(front::$from);*/ alertinfo('请填写评论内容!',...
### 简要描述: 不搞论坛了,换个姿势继续x,最新版也受到影响 ### 详细说明: 存在xss的地方在商品评论的用户名处 [<img src="https://images.seebug.org/upload/201407/25142842e2a2e710b23cc3c55491ededcad104b6.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/25142842e2a2e710b23cc3c55491ededcad104b6.jpg) 直接给出xss语句,360脚本拦截html实体编码,所以需要使用\uxxxx编码。语句如下: ``` <input onfocus=onfocus=\u0061lert(1) autofocus> ``` 漏洞的成因主要是因为正则没写好,并且碰巧用户名处没去除html标签导致的。我们一步一步看: 首先我们输入的数据会来到uploads\lib\default\comment_act.php的第8行: ``` function add_action() { if(front::post('submit') &&front::post('aid')) { if(config::get('verifycode')) { if(front::post('verify')<>session::get('verify')) { alertinfo('验证码错误。', front::$from); //front::redirect(front::$from); } } if(!front::post('username')) { /*front::flash(lang('请留下你的名字!')); front::redirect(front::$from);*/ alertinfo('请留下你的名字!', front::$from); } if(!front::post('content')) { /*front::flash(lang('请填写评论内容!')); front::redirect(front::$from);*/ alertinfo('请填写评论内容!', front::$from); } $this->manage->filter(); //********此处跟进filter $comment=new comment(); $archive=new archive(); front::$post['state'] = '0'; front::$post['adddate']=date('Y-m-d H:i:s'); $comment->rec_insert(front::$post); $archive->rec_update('comment=comment+1',front::post('aid')); //front::flash(lang('提交成功!')); alertinfo('评论提交成功。', front::$from); ``` 跟进filter来到\uploads\lib\table\table_mode.php第9行: ``` function filter() { foreach(front::$post as $key =>$value) { if(is_string($value)) front::$post[$key]=tool::filterXss($Exc ?$value : tool::removehtml($value)); //******继续跟进removehtml } } ``` 继续跟进removehtml,可以看到removehtml的定义如下: ``` static function removehtml($str) { $farr=array( "/<(\/?)(script|i?frame|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU", "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", ); $tarr=array( "<\1\2\3>", "\1\2", ); $str=preg_replace($farr,$tarr,$str); return $str; } ``` 其中存在问题的正则是 ``` /(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU ``` 并且按照"\1\2"的分组来替换,如果我们输入的是 ``` <input onfocus=onfocus=\u0061lert(1) autofocus> ``` 看看会替换成什么样:  可以看到分组1和2刚好拼凑成了`<input onfocus=\u0061lert(1) autofocus>` 最后看输出,输出在#comment_js.php,可以看到content使用了strip_tags去掉html标签,而username却直接输出到页面。一系列的巧合导致了漏洞发生。  成功执行xss  ### 漏洞证明: 成功执行xss 