JAVA代码审计XSS及Filter动态代理过滤
本文由 创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
1.介绍
最近写了个小玩意儿,主要功能为用户信息管理,例如新增 删除 添加等。但在没写过滤之前,全是xss
所以拿出来给大家进行简单分析,后续通过动态代理进行过滤。
2.代码分析
这里就只分析用户添加的页面了,可以看到在未做任何过滤的情况触发XSS
在add.jsp页面发现了Servlet
之后跟进该Servlet,通过获取用户输入进行发送到Service,Service在发送到Dao进行处理
Dao层用的是JDBCtemplate实现,经过测试发现如果使用PreparedStatement连接数据库的话,PreparedStatement会过滤掉常见的XSS代码
<script>alert(xss)</script>
<img src=x onerror=alert(1) />...
但是PreparedStatement过滤一般常用的确实可以,但是鸡肋一点的话,就很轻松绕过了。
<input onmouseover=alert(1)>//鸡肋点的语句...
在AddServlet可以看到,最后进行了重定向,而ListUser就是首页
resp.sendRedirect("/Students/ListUser");
跟进AddServlet之后,可以发现该Servlet执行了findALL(),该方法其实就是service层-->Dao层的查询全部用户信息。并存储到了list中。之后设置setAttribute之后进行了请求转发到list.jsp
跟进list.jsp之后,可以发现将用户的信息使用JSTL遍历出并显示。全程毫无过滤。
3.Filter动态代理过滤
这里本人简单写了一下过滤。只过滤了< >标签。后续可以根据自己需求进行改进。
写的很简单,就不多说了。
@WebFilter("/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ServletRequest servlet = (ServletRequest)Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("getParameter")){ String value = (String)method.invoke(servletRequest,args);//获取输入的value value = value.replaceAll(">","*");//将值替换 value = value.replaceAll("<","*"); return value; }else{ System.out.println("没有匹配成功"); } return method.invoke(servletRequest,args); } }); filterChain.doFilter(servlet,servletResponse); } @Override public void destroy() { } }
之后可以发现过滤成功
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录