处理PathVariable中的xss
背景
有天安全组说我们的网站有个xss的漏洞,并做了演示,攻击地址为:http://xxx.com/detail/430/%22onmouseover='alert(9187)'bad=%22
当鼠标移动到菜单上的时候,会出来一个弹窗,如下图:
分析
首先想这个攻击在请求地址上,怎么会执行脚本了,之前了解的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的攻击了。
也可以关注我的公众号:程序之声
关注公众号,领取更多资源。
本文为博主原创文章,未经博主允许不得转载。