Mejor regex para capturar XSS (Cross-site Scripting) ataque (en Java)?


Jeff publicó sobre esto en Sanitize HTML . Pero su ejemplo está en C# y en realidad estoy más interesado en una versión Java. ¿Alguien tiene una mejor versión para Java? ¿Es su ejemplo lo suficientemente bueno para convertir directamente de C# a Java?

[Update] He puesto una recompensa por esta pregunta porque no era tan popular cuando hice la pregunta como lo es hoy (*). En cuanto a cualquier cosa relacionada con la seguridad, ¡cuanta más gente lo investigue, mejor será!

(*) En de hecho, creo que todavía estaba en beta cerrada

Author: Jonathan Leffler, 2008-08-24

8 answers

No haga esto con expresiones regulares. Recuerde, no está protegiendo solo contra HTML válido; está protegiendo contra el DOM que crean los navegadores web. Los navegadores pueden ser engañados para producir DOM válido desde HTML no válido con bastante facilidad.

Por ejemplo, vea esta lista de ataques XSS ofuscados. ¿Está preparado para adaptar una expresión regular para evitar este ataque del mundo real en Yahoo y Hotmail en IE6/7/8?

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
</BODY></HTML>

¿Qué tal este ataque que funciona en IE6?

<TABLE BACKGROUND="javascript:alert('XSS')">

¿Qué hay de los ataques que no aparecen en este sitio? El problema con el enfoque de Jeff es que no es una lista blanca, como se afirma. Como alguien en esa página señala hábilmente:

El problema con él, es que el html debe estar limpio. Hay casos en los que puede pasar en html hackeado, y se no coincidirá, en cuyo caso devuelve la cadena html hackeada como no coincidirá con nada para reemplazar. Este no está estrictamente en la lista blanca.

I sugeriría una herramienta especialmente diseñada como AntiSamy. Funciona al analizar el HTML, y luego atravesar el DOM y eliminar cualquier cosa que no esté en la lista blanca configurable. La principal diferencia es la capacidad de manejar correctamente HTML mal formado.

La mejor parte es que en realidad las pruebas unitarias para todos los ataques XSS en el sitio anterior. Además, lo que podría ser más fácil que esta llamada API:

public String toSafeHtml(String html) throws ScanException, PolicyException {

    Policy policy = Policy.getInstance(POLICY_FILE);
    AntiSamy antiSamy = new AntiSamy();
    CleanResults cleanResults = antiSamy.scan(html, policy);
    return cleanResults.getCleanHTML().trim();
}
 60
Author: Chase Seibert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 01:32:02
 10
Author: Einar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 18:56:21

No estoy convencido de que usar una expresión regular sea la mejor manera de encontrar todo el código sospechoso. Las expresiones regulares son bastante fáciles de engañar, especialmente cuando se trata de HTML roto. Por ejemplo, la expresión regular listada en el enlace HTML de Sanitize no eliminará todos los elementos 'a' que tengan un atributo entre el nombre del elemento y el atributo 'href':

Una forma más robusta de eliminar maliciosos el código se basa en un analizador XML que puede manejar todo tipo de documentos HTML (Tidy, TagSoup, etc.) y seleccionar los elementos a eliminar con una expresión XPath. Una vez que el documento HTML se analiza en un documento DOM, los elementos de revome se pueden encontrar de manera fácil y segura. Esto es incluso fácil de hacer con XSLT.

 4
Author: potyl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-10 21:35:48

He extraído de NoScript mejor complemento Anti-XSS, aquí está su expresión regular: Trabajo impecable:

<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*=

Prueba: http://regex101.com/r/rV7zK8

Creo que bloquea 99% XSS porque es parte de NoScript, un complemento que se actualiza regularmente

 3
Author: user3709489,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-07 07:12:52
^(\s|\w|\d|<br>)*?$ 

Esto validará caracteres, dígitos, espacios en blanco y también la etiqueta <br>. Si quieres más riesgo puedes añadir más etiquetas como

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-01 23:17:10

El mayor problema al usar código jeffs es el @ que actualmente no está disponible.

Probablemente solo tomaría la expresión regular " raw " del código jeffs si la necesitara y la pegaría en

Http://www.cis.upenn.edu / ~matuszek/General/RegexTester/regex-tester.html

Y ver las cosas que necesitan escape se escapan y luego usarlo.


Teniendo en cuenta el uso de esta expresión regular, personalmente me aseguraría de entender exactamente lo que estaba haciendo, por qué y ¿qué consecuencias serían si no tuviera éxito, antes de copiar / pegar nada, como las otras respuestas tratan de ayudarle con.

(Eso es propbably bastante buen consejo para cualquier copia / pegar)

 0
Author: svrist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-26 10:25:15

[\s\w\.]*. Si no coincide, tienes XSS. Posiblemente. Tenga en cuenta que esta expresión solo permite letras, números y puntos. Evita todos los símbolos, incluso los útiles, por miedo a XSS. Una vez que permites &, tienes preocupaciones. Y simplemente reemplazar todas las instancias de & con &amp; no es suficiente. Demasiado complicado para confiar: P. Obviamente esto no permitirá una gran cantidad de texto legítimo (Solo puede reemplazar todos los caracteres no coincidentes con a ! o algo así), pero creo que matará XSS.

La idea de simplemente analizarlo como html y generar nuevo html es probablemente mejor.

 0
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 19:30:40

Un hilo antiguo, pero tal vez esto sea útil para otros usuarios. Existe una herramienta de capa de seguridad mantenida para php: https://github.com/PHPIDS / Se basa en un conjunto de expresiones regulares que puedes encontrar aquí:

Https://github.com/PHPIDS/PHPIDS/blob/master/lib/IDS/default_filter.xml

 0
Author: KIC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-09 13:25:58