java中的xss
发布日期:2021-05-08 23:08:50 浏览次数:29 分类:精选文章

本文共 4751 字,大约阅读时间需要 15 分钟。

0x01、XSS漏洞

总所周知,xss分为三类,反射型,存储型xss,dom型xss。那xss还能有不一样吗?不,都一样。

那么我们就不细细讲解了,毕竟大家看的懂php,那么java和php的漏洞原理都是一致的

0x02、反射型xss

<%=request.getParameter("id")%>

就这么短短一句话,也就是说,用户输入的参数没有进行过滤,就会进行反射型xss

0x02、存储型xss

test.jsp 代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page import="java.text.SimpleDateFormat" %><%@ page import="java.util.*" %><%    String username = request.getParameter("username");    String content = request.getParameter("content");    String guestBookKey = "GUEST_BOOK";    List
> comments = new ArrayList
>(); if (content != null) { Object obj = application.getAttribute(guestBookKey); if (obj != null) { comments = (List
>) obj; } Map
comment = new HashMap
(); String ip = request.getHeader("x-real-ip"); if (ip == null) { ip = request.getRemoteAddr(); } comment.put("username", username); comment.put("content", content); comment.put("ip", ip); comment.put("date", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); comments.add(comment); application.setAttribute(guestBookKey, comments); }%>
留言板

在线留言板

<% Object obj = application.getAttribute(guestBookKey); if (obj instanceof List) { comments = (List
>) obj; for (Map
comment : comments) { %>

<%=comment.get("username")%> [<%=comment.get("ip")%>] 于 <%=comment.get("date")%> 发表回复:

<%=comment.get("content")%>

<% } } %>
昵称:

我们断点慢慢走,不急,首先content是留言板的内容,然后username是昵称。这边判断留言板内容不为空;然后走了进去,获取域对象的这个guestBookKey的值。然后再判断是否为空

判断为空之后继续往下走

然后这边继续存到hashmap当中。comments是个ArrayList类型的,他存储的类型是map类型,同时两边都是字符串;然后再四个参数为一个comments。最后再设置到域对象当中

那么话不多说都知道,最后打印出来。重点就来了,我们知道xss语句一般是插入数据库当中,然后再读取出来。而java,则可以存储到数据库,也可以存储到域对象当中。但是当Tomcat重启之后,数据就会重置为空。

0x03、xss防御

4.1 htmlspecialchars

在PHP中通常会使用函数会将一些可能有攻击威胁的字符串转义为html实体编码,这样可以有效的避免XSS攻击。

示例 - htmlspecialchars 转义:

在Java中虽然没有内置如此简单方便的函数,但是我们可以通过字符串替换的方式实现类似htmlspecialchars函数的功能。

/** * 实现htmlSpecialChars函数把一些预定义的字符转换为HTML实体编码 * * @param content 输入的字符串内容 * @return HTML实体化转义后的字符串 */public static String htmlSpecialChars(String content) {  if (content == null) {    return null;  }  char[]        charArray = content.toCharArray();  StringBuilder sb        = new StringBuilder();  for (char c : charArray) {    switch (c) {      case '&':        sb.append("&");        break;      case '"':        sb.append(""");        break;      case '\'':        sb.append("'");        break;      case '<':        sb.append("<");        break;      case '>':        sb.append(">");        break;      default:        sb.append(c);        break;    }  }  return sb.toString();}

在存储或者输出请求参数的时候使用该方法过滤即可实现XSS防御。

4.2 全局的XSSFilter

package com.anbai.sec.vuls.filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.IOException;public class XSSFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) {    }    @Override    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) req;        // 创建HttpServletRequestWrapper,包装原HttpServletRequest对象,示例程序只重写了getParameter方法,        // 应当考虑如何过滤:getParameter、getParameterValues、getParameterMap、getInputStream、getReader        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {            public String getParameter(String name) {                // 获取参数值                String value = super.getParameter(name);                // 简单转义参数值中的特殊字符                return value.replace("&", "&").replace("<", "<").replace("'", "'");            }        };        chain.doFilter(requestWrapper, resp);    }    @Override    public void destroy() {    }}

web.xml添加XSSFilter过滤器:

XSSFilter
com.anbai.sec.vuls.filter.XSSFilter
XSSFilter
/*

请求XSS示例程序:

经过全局过滤器转义后的参数就不会再带有XSS攻击能力了。

4.3 RASP XSS攻击防御

RASP可以实现类似于全局XSSFilter的请求参数过滤功能,比较稳定的一种方式是Hook到javax.servlet.ServletRequest接口的实现类的getParameter/getParameterValues/getParameterMap等核心方法,在该方法return之后插入RASP的检测代码。这种实现方案虽然麻烦,但是可以避免触发Http请求参数解析问题(Web应用无法获取getInputStream和乱码等问题)。

示例 - RASP对getParameter返回值Hook示例:

反射型的XSS防御相对来说比较简单,直接禁止GET参数中出现<>标签,只要出现就理解拦截,如:

http://localhost:8000/modules/servlet/xss.jsp?input=

过滤或拦截掉<>input参数就不再具有攻击性了。

但是POST请求的XSS参数就没有那么容易过滤了,为了兼顾业务,不能简单的使用htmlSpecialChars的方式直接转义特殊字符,因为很多时候应用程序是必须支持HTML标签的(如:<img>、<h1>等)。RASP在防御XSS攻击的时候应当尽可能的保证用户的正常业务不受影响,否则可能导致用户无法业务流程阻塞或崩溃。

为了支持一些常用的HTML标签和HTML标签属性,RASP可以通过词法解析的方式,将传入的字符串参数值解析成HTML片段,然后分析其中的标签和属性是否合法即可。

0x04、总结

我们要挖掘xss的漏洞同时,我们也需要知道它的过滤方式。比如某cms利用Filter进行过滤xss。那么我们就可以去看看filter是否存在过滤xss,如果存在的话,我们就可以快速判断是否存在xss。不然直接白盒可能没看到过滤点,但是就是无法弹窗。其实这也是代码审计中,最常见的一种方式,那就是看配置文件

上一篇:php中的数组
下一篇:java之SQL注入

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月19日 03时56分23秒