Najlepsze wyrażenia regularne, aby złapać atak XSS (Cross-Site Scripting) (w Javie)?

Jeff napisał o tym w dezynfekcja HTML . Ale jego przykład jest w C# i bardziej interesuje mnie wersja Java. Czy ktoś ma lepszą wersję dla Javy? Czy jego przykład jest na tyle dobry, aby po prostu konwertować bezpośrednio z C# na Javę?

[Update] postawiłem nagrodę za to pytanie, ponieważ SO nie było tak popularne, gdy zadałem pytanie, jak dziś (*). Jeśli chodzi o cokolwiek związanego z bezpieczeństwem, im więcej osób się temu przygląda, tym lepiej!

(*) W fakt, myślę, że to jeszcze w zamkniętej becie

Author: Jonathan Leffler, 2008-08-24

8 answers

Nie rób tego z wyrażeniami regularnymi. Pamiętaj, że nie chronisz tylko przed poprawnym HTML; chronisz przed DOM, który tworzą przeglądarki internetowe. Przeglądarki można łatwo oszukać w tworzeniu poprawnego DOM z nieprawidłowego HTML.

Na przykład, zobacz listę zamaskowanych ataków XSS . Czy jesteś gotowy dostosować regex, aby zapobiec temu prawdziwemu atakowi na Yahoo i Hotmail na 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>

A co z tym atakiem, który działa na IE6?

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

A co z atakami, których nie ma na tej stronie? Problem z podejściem Jeffa polega na tym, że nie jest to biała lista, jak twierdził. Jak ktoś na tej stronie adeptycznie zauważa:

Problem polega na tym, że html musi być czysty. Są przypadki, w których można przekazać w zhakowanym html, a to nie będzie pasować, w takim przypadku będzie zwraca zhakowany łańcuch html jako nie pasuje do niczego, co można zastąpić. To nie jest ściśle Biała.

I sugerowałby narzędzie skonstruowane specjalnie, takie jak AntiSamy . Działa poprzez parsowanie HTML, a następnie przechodzenie przez DOM i usuwanie wszystkiego, co nie znajduje się w konfigurowalnej białej liście. Główną różnicą jest zdolność do wdzięcznej obsługi zniekształconego HTML.

Najlepsze jest to, że faktycznie testy jednostkowe dla wszystkich ataków XSS na powyższej stronie. Poza tym, co może być łatwiejsze niż to wywołanie 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/doraprojects.net/template/agent.layouts/content.php on line 54
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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 18:56:21

Nie jestem przekonany, że użycie wyrażenia regularnego jest najlepszym sposobem na znalezienie całego podejrzanego kodu. Wyrażenia regularne są dość łatwe do oszukania, szczególnie w przypadku zepsutego HTML. Na przykład wyrażenie regularne wymienione w linku Sanitize HTML nie usunie wszystkich elementów "a", które mają atrybut między nazwą elementu a atrybutem "href":

Solidniejszy sposób usuwania złośliwych kod ma polegać na Parserze XML, który może obsługiwać wszystkie rodzaje dokumentów HTML (Tidy, TagSoup, itp.) i wybierać elementy do usunięcia za pomocą wyrażenia XPath. Po przetworzeniu dokumentu HTML do dokumentu DOM elementy do revome można łatwo i bezpiecznie znaleźć. Jest to nawet łatwe do zrobienia z 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 21:35:48

Wyodrębniłem z NoScript best Anti - XSS addon, oto jego Regex: Praca bez zarzutu:

<[^\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]*=

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

Myślę, że blokuje 99% XSS, ponieważ jest częścią NoScript, dodatku, który jest regularnie aktualizowany

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-07 07:12:52
^(\s|\w|\d|<br>)*?$ 

Spowoduje walidację znaków, cyfr, spacji, a także znacznika <br>. Jeśli chcesz więcej ryzyka, możesz dodać więcej tagów, takich jak

^(\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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-01 23:17:10

Największym problemem przy użyciu kodu jeffsa jest@, który obecnie nie jest dostępny.

Prawdopodobnie po prostu wziąłbym" raw " regexp z kodu Jeffa, gdybym go potrzebował i wkleił do

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

I zobaczyć rzeczy, które potrzebują ucieczki, uciekają, a następnie ich użyć.


Biorąc pod uwagę użycie tego wyrażenia regularnego, osobiście upewniłbym się, że dokładnie zrozumiałem, co robię, dlaczego i jakie będą konsekwencje, jeśli nie uda mi się, przed skopiowaniem/wklejeniem czegokolwiek, podobnie jak inne odpowiedzi starają się pomóc.

(to propbably pretty sound advice for any copy / paste)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-26 10:25:15

[\s\w\.]*. Jeśli nie pasuje, masz XSS. Może. Zwróć uwagę, że to wyrażenie zezwala tylko na litery, cyfry i kropki. Unika wszystkich symboli, nawet użytecznych, ze strachu przed XSS. Gdy pozwolisz &, masz obawy. Samo zastąpienie wszystkich instancji & &amp; nie jest wystarczające. Zbyt skomplikowane, by zaufać :P. Oczywiście to uniemożliwi dużo legalnego tekstu (można po prostu zastąpić wszystkie niematerialne znaki! czy coś), ale myślę, że zabije XSS.

Pomysł, aby po prostu przeanalizować go jako html i wygenerować nowy html jest prawdopodobnie lepszy.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-11 19:30:40

Stary wątek, ale może się przyda innym użytkownikom. Dla php jest utrzymywane narzędzie warstwy bezpieczeństwa: https://github.com/PHPIDS/ opiera się na zbiorze regex, który można znaleźć tutaj:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 13:25:58