【问题标题】:I am getting Cross-Site Scripting: Poor Validation on Struts call to a bean class我收到跨站点脚本:Struts 对 bean 类的调用验证不佳
【发布时间】:2017-03-20 17:47:53
【问题描述】:

我在 HP Fortify 中扫描了我的应用程序并遇到了问题 Cross-Site Scripting: Poor Validation。我正在使用 ESAPI 库。我在一个 Struts 应用程序上得到了这个发现。

<%@ taglib prefix="s" uri="/struts-tags" %>
<form method='post' name='<s:property value='tableBean.formName'/>' action='Notification.action'>
public String printApplications() throws IOException, ServletException {
    request.setAttribute(TableDisplayBean.TABLE_BEAN, tableBean);
}

使用 ESAPI 编码tableBean.formName 的正确语法是什么?

【问题讨论】:

  • 为什么在表单中设置动态name
  • 我没有对原始实现进行编码。这是继承的遗留代码。我的工作是在不改变整体实施的情况下修复 Fortify 的发现。
  • 问题:“formName”是用户可控制的吗?如果不是,那么这个甚至我推荐的 esapi 版本都没有实际意义,这可以被标记为误报。

标签: jsp struts2 xss fortify esapi


【解决方案1】:

之前:

<html lang="${myVar}">

适当的语法如下所示:

<%@ taglib uri="/WEB-INF/tld/esapi.tld" prefix="esapi" %>
<html lang="<esapi:encodeForHTMLAttribute>${myvar}</esapi:encodeForHTMLAttribute>">

在您的情况下,请使用HTMLAttribute,因为您动态获取的值被插入到标签的“名称”属性中。如果要说,在 p-tag 中,你会使用esapi:encodeForHTML

<p>
<esapi:encodeForHTML>${myVal}</esapi:encodeForHTML>
</p>

此外,如果 javascript 函数在渲染时接收该值,esapi:encodeForJavaScript

编码总是有一个合适的上下文,上下文由“什么样的解释器会首先接收到这个数据?”这个问题来回答。

==============================================

我不够明确。我提供的示例只会在听起来像是作为原始 HTML 存放时才转义 HTML 属性。上面的一般示例已经过修改。

使用您的示例,尝试:

<form method='post' name='<s:property value=<esapi:encodeForHTMLAttribute>'tableBean.formName'<esapi:encodeForHTMLAttribute>/>' action='Notification.action'>

我已经习惯了 JSTL 语法,所以我不能 100% 确定在这里包装变量的最佳方式。你必须玩它。或者,您可以向tableBean 添加一个方法,例如tableBean.attributeEscapedFormName,如下所示:

public class TableBean{
    String formName;
    public String htmlAttributeEscapedFormName(){
        return ESAPI.encoder().escapeForHTMLAttribute( formName );
    }
}

【讨论】:

  • 我尝试了这种方法,现在 Fortify 将其标记为“反映了严重的 XSS 脚本”而不是“中型 XSS 脚本验证不良”
  • @RichardSandoz 那是因为我原来的例子不完整。但是如果问题仍然存在,我会尝试我的第二个建议并在 bean 级别处理转义。我很抱歉没有更好地了解 struts 视图语法!
【解决方案2】:

您应该阅读property tag 参考以更好地了解如何使用它。

用于获取一个值的属性,默认会在顶部 如果没有指定堆栈。参数

允许的动态属性:false

默认 值属性为null时使用的值

  • escapeCsv false false false Boolean 是否转义 CSV(用于转义列的值)
  • escapeHtml false true false Boolean 是否转义 HTML
  • escapeJavaScript false false false Boolean 是否转义Javascript
  • escapeXml false false false Boolean 是否转义 XML
  • value false false 要显示的对象值

例子:

 <s:push value="myBean">

 <!-- Example 1: -->
 <s:property value="myBeanProperty" />

 <!-- Example 2: -->TextUtils
 <s:property value="myBeanProperty" default="a default value" /> 
</s:push> 

示例 1 打印 myBeangetMyBeanProperty() 的结果 方法。 示例 2 打印 myBeangetMyBeanProperty() 的结果 方法,如果是null,则打印'a default value'。

【讨论】:

  • 我没有对原始实现进行编码。这种模式实际上出现在我们遗留代码库的数百个地方。它实际上正在工作。我的工作是将出现的 '' 替换为诸如 '${tableBean.formName}' 之类的东西,这将通过 Fortify 集合.在这个例子中,问题没有解决,但实际上从中等到严重,所以我不能使用它。
  • 而且,是的,我确实尝试了 struts taglib 上的各种转义属性,但无法解决我的主要问题,即修复 Fortify 的发现。我什至在 nutshellsoftware.org 上找到了一个关于自定义部分 struts 的指南,由于升级支持等原因,我们无法对 3rd 方库执行此操作。
  • @RichardSandoz 是的,升级需要支持,但是 struts 团队并没有产生太多需要重写的弃用内容。通常升级后的应用程序停止工作,如果没有人回答问题的原因,您必须挖掘文档和源代码。由于缺乏对框架功能的了解或涉及的其他软件导致错误的结果,某些第 3 方工具可能会产生不正确的结果。如果您想检查 Struts 如何以最大的安全性转义内容,我建议您使用所有属性。
猜你喜欢
  • 2013-01-30
  • 2016-05-23
  • 1970-01-01
  • 2016-08-28
  • 2021-06-15
  • 2021-12-14
  • 1970-01-01
  • 2020-12-26
  • 2015-08-15
相关资源
最近更新 更多