This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Difference between revisions of "Germany/Projekte/Top 10 fuer Entwickler-2013/A8-Cross-Site Request Forgery (CSRF)"
m |
(added Examples, tbd: Links to ESAPI ; prove of example = hidden field?) |
||
Line 45: | Line 45: | ||
---- | ---- | ||
---- | ---- | ||
− | ... | + | {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=3|risk=5}} |
+ | {{Top_10_2010:ExampleBeginTemplate}} | ||
+ | '''/** (1) CSRF-Token erzeugen **/'''<br/> | ||
+ | private String csrfToken = resetCSRFToken();<br/> | ||
+ | ...<br/> | ||
+ | public String resetCSRFToken() {<br/> | ||
+ | : csrfToken = ESAPI.randomizer().getRandomString(8, DefaultEncoder.CHAR_ALPHANUMERICS);<br/> | ||
+ | : return csrfToken;<br/> | ||
+ | }<br/> | ||
− | |||
− | |||
− | {{ | + | '''/** (2) In zu schützenden FORM-Seiten, oder Urls das CSRF-Token als 'hidden field' hinzufügen, vgl [http://code.google.com/searchframe#N8fUvf0LCCY/trunk/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java ESAPI DefaultHTTPUtilities.java]**/'''<br/> |
+ | |||
+ | final static String CSRF_TOKEN_NAME = "ctoken";<br/> | ||
+ | <span style="color: green;">'''public String addCSRFToken(String href) {'''</span><br/> | ||
+ | : User user = ESAPI.authenticator().getCurrentUser();<br/> | ||
+ | : if (user.isAnonymous()) {<br/> | ||
+ | :: return href;<br/> | ||
+ | : }<br/> | ||
+ | : // if there are already parameters append with &, otherwise append with ?<br/> | ||
+ | : <span style="color: green;">'''String token = CSRF_TOKEN_NAME + "=" + user.getCSRFToken();'''</span><br/> | ||
+ | : <span style="color: green;">'''return href.indexOf( '?') != -1 ? href + "&" + token : href + "?" + token;'''</span><br/> | ||
+ | }<br/> | ||
+ | ...<br/> | ||
+ | public String getCSRFToken() {<br/> | ||
+ | : User user = ESAPI.authenticator().getCurrentUser();<br/> | ||
+ | : if (user == null) return null;<br/> | ||
+ | : return user.getCSRFToken();<br/> | ||
+ | } | ||
{{Top_10_2010:ExampleEndTemplate}} | {{Top_10_2010:ExampleEndTemplate}} | ||
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5}} | {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5}} | ||
− | + | {{Top_10_2010:ExampleBeginTemplate}} | |
− | {{Top_10_2010:ExampleBeginTemplate}} | + | '''/** (3) Beim Empfang der Daten das CSRF-Token prüfen **/'''<br/> |
− | public | + | public void verifyCSRFToken(HttpServletRequest request) throws IntrusionException {<br/> |
− | : User user = ESAPI.authenticator().getCurrentUser(); | + | : User user = ESAPI.authenticator().getCurrentUser();<br/> |
− | : if (user. | + | : // check if user authenticated with this request - no CSRF protection required<br/> |
− | :: | + | : if( request.getAttribute(user.getCSRFToken()) != null ) {<br/> |
− | : } | + | :: return;<br/> |
− | : // | + | :}<br/> |
− | : < | + | |
− | : < | + | : String token = request.getParameter(CSRF_TOKEN_NAME);<br/> |
− | :} | + | : if ( !user.getCSRFToken().equals( token ) ) {<br/> |
− | + | :: throw new IntrusionException("Authentication failed", "Possibly forged HTTP request without proper CSRF token detected");<br/> | |
+ | :}<br/> | ||
+ | }<br/> | ||
+ | |||
+ | |||
+ | '''/** (4) Beim Abmelden bzw. Timeout die Session ungültig machen **/'''<br/> | ||
+ | public void logout() {<br/> | ||
+ | : ESAPI.httpUtilities().killCookie( ESAPI.currentRequest(), ESAPI.currentResponse(), HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME );<br/> | ||
+ | : HttpSession session = ESAPI.currentRequest().getSession(false);<br/> | ||
+ | : if (session != null) {<br/> | ||
+ | :: removeSession(session);<br/> | ||
+ | :: session.invalidate();<br/> | ||
+ | :}<br/> | ||
+ | |||
+ | :ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(), ESAPI.currentResponse(), "JSESSIONID");<br/> | ||
+ | :loggedIn = false;<br/> | ||
+ | :logger.info(Logger.SECURITY_SUCCESS, "Logout successful" );<br/> | ||
+ | :ESAPI.authenticator().setCurrentUser(User.ANONYMOUS);<br/> | ||
+ | }<br/> | ||
{{Top_10_2010:ExampleEndTemplate}} | {{Top_10_2010:ExampleEndTemplate}} | ||
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5}} | {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5}} | ||
====Tbd!!==== | ====Tbd!!==== | ||
− | Z.B. Bookmarks | + | Z.B. Keine Bookmarks auf ausgefüllte Eingabe-Formulare, Suchergebnisse |
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=5}} | {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=5}} | ||
Line 87: | Line 128: | ||
{{Top_10_2010:SubSubsectionExternalReferencesTemplate}} | {{Top_10_2010:SubSubsectionExternalReferencesTemplate}} | ||
*[http://cwe.mitre.org/data/definitions/352.html CWE Entry 352 on CSRF] | *[http://cwe.mitre.org/data/definitions/352.html CWE Entry 352 on CSRF] | ||
+ | *[http://www.jtmelton.com/2010/05/16/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf John Melton's Weblog: The OWASP Top Ten and ESAPI –Part 5–] | ||
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration|useprev=PrevLink_Germany_Projekte|prev=Top_10_fuer_Entwickler/A4 Unsichere direkte Objektreferenzen}} | {{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration|useprev=PrevLink_Germany_Projekte|prev=Top_10_fuer_Entwickler/A4 Unsichere direkte Objektreferenzen}} | ||
[[Category:OWASP Top 10 fuer Entwickler]] | [[Category:OWASP Top 10 fuer Entwickler]] |
Revision as of 17:07, 18 February 2013
← Top_10_fuer_Entwickler/A4 Unsichere direkte Objektreferenzen | Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration → |
Testseite in Bearbeitung (BAUSTELLE!!)
die Überschriften kommen z.T noch von den Templates der englischen Top 10, Tbd!!
A5 Cross-Site Request Forgery (CSRF) (untergeschobene Requests)
______ | Ausnutzbarkeit DURCHSCHNITTLICH |
Verbreitung SEHR HÄUFIG |
Auffindbarkeit EINFACH |
Auiswirkung MITTEL |
Application / Business Specific |
Jeder, der einem Nutzer einer Webanwendung einen nicht beabsichtigten Request für diese Anwendung unterschieben kann. Hierfür kommt jede Website oder jede HTML-Quelle in Betracht, die der Nutzer verwendet. | Durch Image-Tags, XSS oder andere Techniken löst das Opfer unbeabsichtigt einen gefälschten HTTP-Request für eine Anwendung aus. Falls der Nutzer authentisiert ist, wird dieser Angriff Erfolg haben. | CSRF zielt auf Anwendungen, die es dem Angreifer erlauben, alle Details eines Requests für eine bestimmte Aktion vorherzusagen.
Da Browser Informationen zum Session-Management automatisch mitsenden, kann ein Angreifer gefälschte Requests auf bösartigen Websites hinterlegen, die von legitimen Requests nicht unterschieden werden können. CSRF-Schwächen sind leicht durch Penetrationstests oder Quellcode-Analysen auffindbar. |
Der Angreifer kann unbemerkt das Opfer über dessen Browser dazu veranlassen, alle Daten zu ändern oder jede Funktion auszuführen, für die das spezifische Opfer berechtigt ist. | Betrachten Sie den Geschäftswert der betroffenen Daten oder Funktionen. Es bleibt die Unsicherheit, ob der Nutzer die Aktion ausführen wollte. Bedenken Sie mögliche Auswirkungen auf Ihre Reputation. |
Am I Vulnerable To 'Cross-Site Request Forgery (CSRF)'?
Die Anwendung erlaubt es einem Benutzer, einen zustandsändernden Request auszulösen, der kein geheimes Token beinhaltet, wie z.B.:
Dadurch kann ein Angreifer einen Request erzeugen, der Geld vom Konto des Opfers auf das Konto des Angreifers transferiert. Diesen bettet er in einem Image-Tag oder einem Iframe ein und hinterlegt ihn in einer beliebigen Website.
Wenn das Opfer eine präparierte Seite besucht, während es z.B. bereits auf example.com authentisiert ist, wird der untergeschobene Request unbemerkt ausgeführt, da der Browser die aktuellen Session-Informationen automatisch mitsendet und somit unbeabsichtigt autorisiert. |
How Do I Prevent 'Cross-Site Request Forgery (CSRF)'?
Um CSRF zu verhindern, muss ein unvorhersagbarer Token im Body oder in der URL eines jeden HTTP-Requests eingebettet sein (und geprüft werden). Ein solcher Token sollte für mindestens jede Nutzer-Session, besser noch für jeden Request, einzigartig sein.
|
JAVA | |
Example Attack Scenarios
/** (1) CSRF-Token erzeugen **/
}
final static String CSRF_TOKEN_NAME = "ctoken";
} ...
} |
References
/** (3) Beim Empfang der Daten das CSRF-Token prüfen **/
}
} style="vertical-align: top; padding:5px; width: 50%; border: 3px solid
background-color:
Tbd!!Z.B. Keine Bookmarks auf ausgefüllte Eingabe-Formulare, Suchergebnisse style="vertical-align: top; padding:5px; width: 50%; border: 3px solid
background-color:
OWASP
External |
← Top_10_fuer_Entwickler/A4 Unsichere direkte Objektreferenzen | Top_10_fuer_Entwickler/A6 Sicherheitsrelevante Fehlkonfiguration → |
