使用 url 编码输入的 XSS 缓解

XSS mitigation with url encoded input

提问人:NAVOZ 提问时间:10/3/2023 最后编辑:NAVOZ 更新时间:10/3/2023 访问量:107

问:

在我的一个应用程序中,我使用OWASP的Encoder for html来缓解XSS攻击,但不幸的是,这还不够。

渗透测试人员发现了一个反射的跨站点脚本威胁,其中输入字段内容或有效负载是 URL 编码的,XSS 编码/过滤器不对数据进行编码并允许输入传递给 Javascript 函数。

输入为:%3Cscript%3Ealert%285%29%3C%2Fscript%3E 或 39848%3balert(1)%2f%2f920

我也尝试过 Jsoup en html sanitize。他们都只过滤 html 的输出/输入,但这已经是编码形式。

    function set() {
var span = window.parent.document.all.<%=Encode.forHtml(request.getParameter("address"))%>;
var action = '<%=Encode.forHtml(request.getParameter("action"))%>';

<logic:present name="postcodeForm" property="result">
<bean:size id="resultSize" name="postcodeForm" property="result"/>
<logic:notMatch name="resultSize" value="1">
span.innerHTML = "<bean:message key='error.result'/>";
span.className = "errSpec";

</logic:notMatch>
<logic:match name="resultSize" value="1">
<logic:iterate id="adres" name="postcodeForm" property="result">
span.innerHTML = "<bean:write name='address' property='Street'/>&nbsp;"
+ <%=Integer.parseInt(Encode.forHtml(searchString.substring(searchString.indexOf(',') + 1)))%>
<logic:present parameter="houseNumber">
<%=Encode.forHtml(request.getParameter("houseNumber"))%>
</logic:present>
+ "<br/>" + "<bean:write name='address' property='postcode'/>&nbsp;<bean:write name='address' property='houseNr'/>";
span.className = "";

if (action == 'postcode') {
var streetname= "<bean:write name='address' property='streetName' filter="false"/>";

任何想法或帮助都受到高度赞赏。

提前致谢!

javascript java xss owasp html编码

评论

0赞 Heiko Theißen 10/3/2023
您的应用应该如何处理合法输入?将其解释为 HTML 代码?还是只是文本?或。。。?
0赞 NAVOZ 10/3/2023
@HeikoThei ßen 感谢您的回复!因此,在应用程序中,参数的值被拾取,然后在 javascript 函数中使用。它主要是简单的字符串/文本值。请参阅下面的代码:function set() { var span = window.parent.document.all.<%=Encode.forHtml(request.getParameter("address"))%>; var action = '<%=Encode.forHtml(request.getParameter("action"))%>';
0赞 Heiko Theißen 10/3/2023
你能举个例子来说明这个 Javascript 代码应该为合法输入做什么吗?目前看来,攻击者可以通过提供合适的输入来生成任意的 Javascript。
0赞 NAVOZ 10/3/2023
@HeikoThei ßen 它各不相同。我粘贴了这个特定jsp的代码片段:
0赞 NAVOZ 10/3/2023
@HeikoThei ßen 感谢您的支持。我有超过 100 个 JSP en 绝对比 javascript 函数更多。难道没有通用的方法可以做到吗?如果我创建一个过滤器并拦截所有请求并过滤掉,否则我必须喜欢更改 jsp/javascript 中的每个 var 或字段。

答:

0赞 Heiko Theißen 10/3/2023 #1

如果所有请求参数都是 Javascript 代码中出现的字符串值,则复杂性会大大降低。然后,您只需要确保

  • 请求参数中出现的任何字符串分隔符都会被正确转义 ( 变成 ) 和"\"
  • 反斜杠被转义(变成),因此参数本身不能包含转义序列。\\\

不需要 HTML 编码。

您当前的代码不被视为字符串值,您应该编写而不是 .这是使用以下服务器端代码生成的:addresswindow.parent.document.all["XXX"]window.parent.document.all.XXX

var span = window.parent.document.all["<%=
  request.getParameter("address")
   .replaceAll('"', '\\"')
   .replaceAll('\\', '\\\\')
%>"];
var action = "<%=
  request.getParameter("action")
   .replaceAll('"', '\\"')
   .replaceAll('\\', '\\\\')
%>";

即使攻击者设置为该值,这仍将被视为字符串:address"];alert(1)

var span = window.parent.document.all["\"];alert(1)"];

(我不明白你目前对 的处理方式,但这也必须作为一个字符串来处理。houseNumber