【问题标题】:Cross scripting error on the Retrieved Database data检索到的数据库数据上的跨脚本错误
【发布时间】:2020-02-24 16:52:27
【问题描述】:

我在执行更新后的语句中看到了跨脚本注入错误。如何清理输出以消除交叉脚本错误.. 我有一个简单的代码 sn-p,它使用 PreparedStatement 运行选择并返回在前端 GUI 屏幕上检索到的值。

XSS 漏洞消息:“受污染的数据源自之前对 java.sql.ResultSetMetaData.getColumnName 的调用。”

Java 代码:

        Connection conn = null;
        Statement stmt = null;
        PreparedStatement pstmt = null;
        try {
            List alist= new ArrayList();
            pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            int count = rs.getMetaData().getColumnCount();
            for (int i = 1; i <= count; i++) {
                 alist.add(rs.getMetaData().getColumnName(i))   //Flaw seems to point to this.
            }

        }catch(Exception e){
        //close connections
        }
        return alist;

完整的 Veracode 缺陷: 攻击向量: javax.servlet.jsp.JspWriter.print

模块数受影响:1

描述: 对 javax.servlet.jsp.JspWriter.print() 的调用包含跨站点脚本 (XSS) 缺陷。该应用程序使用不受信任的输入填充 HTTP 响应,从而允许攻击者嵌入恶意内容,例如 Javascript 代码,这些内容将在受害者浏览器的上下文中执行。 XSS 漏洞通常被用来窃取或操纵 cookie、修改内容的呈现方式以及泄露机密信息,并且会定期发现新的攻击向量。 print() 的第一个参数包含来自变量 getHtml() 的污染数据。受污染的数据源自之前对 java.sql.ResultSetMetaData.getColumnName 的调用。被污染的数据被定向到 javax.servlet.jsp.JspWriter 返回的输出流中。

【问题讨论】:

  • 你能添加一个堆栈跟踪或其他一些关于错误的信息吗?结果集的元数据上不能有任何关于 XSS 的错误。 XSS 不会有问题,因为您使用的是用于防止 XSS 的准备好的语句。所以错误必须是我认为的其他东西......
  • 不幸的是,这不是错误,而是交叉脚本缺陷,因此没有堆栈跟踪。

标签: java xss veracode


【解决方案1】:

我不知道为什么ResultSetMetaData 对象会调用 servlet 方法,但如果我理解正确,它会用于在 servlet 中打印某些内容。但是因为ResultSetMetaData 中的所有数据都来自数据库的元数据(不可能包括 javascript 代码或其他 XSS 风险),所以在这种情况下应该保存。

ResultSetMetaData 是一个常用的类(并且使用了很长时间的 sinze)所以我真的不认为这是当前 java 版本的问题。

所以我不知道如何解决这个问题,但我很确定这不是问题,因为不可能在数据库的元数据中添加任何恶意软件代码(javascript 或 sql 注入代码)。

【讨论】:

    【解决方案2】:

    所以,我终于能够找出问题所在。

    我的查询是:

    SELECT COLUMN_A, COLUMN_A||'-'||COLUMN_B FROM SOME_TABLE WHERE COLUMN_C IS NULL;
    

    我做了一些事情......

    1) 为我的列添加别名并使用rs.getMetaData().getcolumnlabel(i) 而不是rs.getMetaData().getColumnName(i)。这样可以确保从输出结果集名称中消除管道或连字符。

    2) 使用 OWASP 的 ESAPI.encoder().encodeForHTML(unsafeString) 而不是在传递给准备好的语句的变量上使用 Encode.forHtml(escapeHtml)StringEscapeUtils.escapeHtml(escapeHtml)

    || 的输出行为和 - 当通过各种转义函数传递它们时。 输入:String unsafeString ="&lt;'HELLO'-||&gt;";

    输出:

    Encode.forHtml(unsafeString)&amp;lt;&amp;#39;HELLO&amp;#39;-||&amp;gt; StringEscapeUtils.escapeHtml(unsafeString)&amp;lt;'HELLO'-||&amp;gt; ESAPI.encoder().encodeForHTML(unsafeString)&amp;lt;&amp;#x27;HELLO&amp;#x27;-&amp;#x7c;&amp;#x7c;&amp;gt; ESAPI.encoder().decodeForHTML(safeString from above line)is &lt;'HELLO'-||&gt;

    如果将输出发送到 jsp 以在 html 上重新呈现,那么您不必执行 decodeStep..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多