[ 
https://issues.apache.org/jira/browse/WW-5756?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gouri Sankar A updated WW-5756:
-------------------------------
    Description: 
<s:a> builds its href attribute by neutralizing a literal quote (the href= 
attribute, via
ensureAttributeSafelyNotEscaped) or blocking a literal "<script" substring (the 
value= attribute, via
DefaultUrlHelper.buildUrl -- a check that appears to date back to 
S2-002/CVE-2008-6682, WW-2427, based
on an exact symptom match with that historical ticket). Neither stops the value 
itself from naming an
executable scheme: javascript:alert(1) needs no quote or <script substring to 
run once the link is
activated.

Reproduced on main (7.5.0-SNAPSHOT) and confirmed the same vulnerable code is 
present unchanged in
6.11.0, 7.3.0 and 7.4.0. Tested with embedded Tomcat 10.1.34, stock 
struts-default, one
@StrutsParameter-bound action property named q, set to 
javascript:alert(document.cookie), bound through
the documented tag-attribute pattern. Binding that property to the href 
attribute renders
href="javascript:alert(document.cookie)". Binding the same property to the 
value attribute instead
renders the same unescaped href="javascript:alert(document.cookie)". Binding it 
to the anchor attribute
is safe: the payload lands as a URL fragment and is inert.

Also confirmed vulnerable before a fix: case variation such as JaVaScRiPt 
instead of javascript, an
embedded tab or newline inside the scheme (a browser's own URL parser strips 
these before reading the
scheme, per the WHATWG URL spec, so a filter that simply checks whether the 
value starts with the text
javascript followed by a colon would miss them), and a leading space or NUL 
character.

Proposed fix (patch available): a new allowlist-based check (http, https, 
mailto, tel), applied before
the existing quote and script-substring checks, with the same WHATWG-style 
normalization so the
tab/newline-split variant is still caught. I have a patch with regression tests 
ready and will open a PR
referencing this ticket.

  was:
<s:a> builds its href attribute by neutralizing a literal quote (the href= 
attribute, via
ensureAttributeSafelyNotEscaped) or blocking a literal "<script" substring (the 
value= attribute, via
DefaultUrlHelper.buildUrl -- a check that appears to date back to 
S2-002/CVE-2008-6682, WW-2427, based
on an exact symptom match with that historical ticket). Neither stops the value 
itself from naming an
executable scheme: javascript:alert(1) needs no quote or <script substring to 
run once the link is
activated.

Reproduced on main (7.5.0-SNAPSHOT) and confirmed the same vulnerable code is 
present unchanged in
6.11.0, 7.3.0 and 7.4.0. Tested with embedded Tomcat 10.1.34, stock 
struts-default, one
@StrutsParameter-bound action property q (the documented tag-attribute pattern):

  s:a href="%{q}"     with q=javascript:alert(document.cookie)   renders  
href="javascript:alert(...)"
  s:a value="%{q}"    with q=javascript:alert(document.cookie)   renders  
href="javascript:alert(...)"
  s:a anchor="%{q}"   with q=javascript:alert(document.cookie)   renders as a 
URL fragment, inert, safe

Also confirmed vulnerable before a fix: case variation such as JaVaScRiPt 
instead of javascript, an
embedded tab or newline inside the scheme (a browser's own URL parser strips 
these before reading the
scheme, per the WHATWG URL spec, so a filter that simply checks whether the 
value starts with the text
javascript followed by a colon would miss them), and a leading space or NUL 
character.

Proposed fix (patch available): a new allowlist-based check (http, https, 
mailto, tel), applied before
the existing quote and script-substring checks, with the same WHATWG-style 
normalization so the
tab/newline-split variant is still caught. I have a patch with regression tests 
ready and will open a PR
referencing this ticket.


> Reject javascript:/vbscript:/data: schemes in <s:a> href values
> ---------------------------------------------------------------
>
>                 Key: WW-5756
>                 URL: https://issues.apache.org/jira/browse/WW-5756
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 6.11.0, 7.3.0, 7.4.0
>            Reporter: Gouri Sankar A
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> <s:a> builds its href attribute by neutralizing a literal quote (the href= 
> attribute, via
> ensureAttributeSafelyNotEscaped) or blocking a literal "<script" substring 
> (the value= attribute, via
> DefaultUrlHelper.buildUrl -- a check that appears to date back to 
> S2-002/CVE-2008-6682, WW-2427, based
> on an exact symptom match with that historical ticket). Neither stops the 
> value itself from naming an
> executable scheme: javascript:alert(1) needs no quote or <script substring to 
> run once the link is
> activated.
> Reproduced on main (7.5.0-SNAPSHOT) and confirmed the same vulnerable code is 
> present unchanged in
> 6.11.0, 7.3.0 and 7.4.0. Tested with embedded Tomcat 10.1.34, stock 
> struts-default, one
> @StrutsParameter-bound action property named q, set to 
> javascript:alert(document.cookie), bound through
> the documented tag-attribute pattern. Binding that property to the href 
> attribute renders
> href="javascript:alert(document.cookie)". Binding the same property to the 
> value attribute instead
> renders the same unescaped href="javascript:alert(document.cookie)". Binding 
> it to the anchor attribute
> is safe: the payload lands as a URL fragment and is inert.
> Also confirmed vulnerable before a fix: case variation such as JaVaScRiPt 
> instead of javascript, an
> embedded tab or newline inside the scheme (a browser's own URL parser strips 
> these before reading the
> scheme, per the WHATWG URL spec, so a filter that simply checks whether the 
> value starts with the text
> javascript followed by a colon would miss them), and a leading space or NUL 
> character.
> Proposed fix (patch available): a new allowlist-based check (http, https, 
> mailto, tel), applied before
> the existing quote and script-substring checks, with the same WHATWG-style 
> normalization so the
> tab/newline-split variant is still caught. I have a patch with regression 
> tests ready and will open a PR
> referencing this ticket.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to