处理PathVariable中的xss

  |   0 评论   |   0 浏览

背景

有天安全组说我们的网站有个xss的漏洞,并做了演示,攻击地址为:http://xxx.com/detail/430/%22onmouseover='alert(9187)'bad=%22
当鼠标移动到菜单上的时候,会出来一个弹窗,如下图:
image.png

分析

首先想这个攻击在请求地址上,怎么会执行脚本了,之前了解的xss攻击都是通过表单等形式提交的,带着疑问去查看了相应的代码,发现项目中确实没有处理xss的攻击,还有这个项目是使用freemaker的,在前端代码中看到了如下的代码
<li><a href="/xxx/list/${menuCode!''}">我是菜单</a></li>这个menuCode就是请求地址后面的参数,到这里才解释了为什么请求地址也会存在xss攻击。为了解决这个问题,先加上了XssFilter过滤器,在测试环境试了下,发现还是没有解决,打了断点看了下,发现XssFilter只会过滤表单的提交,对PathVariable这种没办法拦截到,发现spring mvc中是用UrlPathHelper来处理请求中的变量,那么就需要重写这个方法。

解决

自定义XssUrlPathHelper

public class XssHandlerMappingPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
        if(bean instanceof AbstractHandlerMapping){
            AbstractHandlerMapping ahm = (AbstractHandlerMapping) bean;
            ahm.setUrlPathHelper(new XssUrlPathHelper());
        }
        return bean;
    }

    static class XssUrlPathHelper extends UrlPathHelper {
        @Override
        public Map<String, String> decodePathVariables(HttpServletRequest request, Map<String, String> vars){
            Map<String, String> result = super.decodePathVariables(request, vars);
            if(!CollectionUtils.isEmpty(result)){
                for(String key : result.keySet()){
                    result.put(key, cleanXSS(result.get(key)));
                }
            }
            return result;
        }

        @Override
        public MultiValueMap<String, String> decodeMatrixVariables(HttpServletRequest request, MultiValueMap<String, String> vars){
            MultiValueMap<String, String> mvm = super.decodeMatrixVariables(request, vars);
            if(!CollectionUtils.isEmpty(mvm)){
                for(String key : mvm.keySet()){
                    List<String> value = mvm.get(key);
                    for(int i = 0; i < value.size(); i++){
                        value.set(i, cleanXSS(value.get(i)));
                    }
                }
            }

            return mvm;
        }

        private String cleanXSS(String value){
            return HtmlUtils.htmlEscape(value,"UTF-8");
        }

    }
}
<!-- 处理PathVariable中xss攻击 -->
<bean class="com.xxx.xss.XssHandlerMappingPostProcessor"/>

这样就解决了请求中xss的攻击了。

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。