Difference between revisions of "Germany/Projekte/Top 10 fuer Entwickler-2013/A8-Cross-Site Request Forgery (CSRF)"

From OWASP
Jump to: navigation, search
m (Added {{Top_10:SubsectionTableBeginTemplate}} + {{Top_10:SubsectionTableEndTemplate}})
(26 intermediate revisions by one user not shown)
Line 1: Line 1:
{{Top_10_2010_Developer_Edition_De:TopTemplate|useprev=PrevLink_Germany_Projekte|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A2_Cross-Site_Scripting_(XSS)|prev=Top_10_fuer_Entwickler/Risiken}}
+
{{Top_10_2010_Developer_Edition_De:TopTemplate
==Testseite in Bearbeitung (BAUSTELLE!!)==
+
    |useprev=PrevLink_Germany_Projekte
====die Überschriften kommen z.T noch von den Templates der englischen Top 10, Tbd!!====
+
    |usenext=NextLink_Germany_Projekte
----
+
    |prev=Top_10_fuer_Entwickler/A4_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
== A5 Cross-Site Request Forgery (CSRF) (untergeschobene Requests) ==  
+
              |4
 +
              |language=de
 +
              |year=2010}}
 +
    |next=Top_10_fuer_Entwickler/A6_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
 +
              |6
 +
              |language=de
 +
              |year=2010}}
 +
}}
 +
==Seite in Bearbeitung (BAUSTELLE!!)==
  
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate}}
+
 
 +
== A5 Cross-Site Request Forgery (CSRF, XSRF, Session Riding) ==
 +
 
 +
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate|year=2010|language=de}}
 
{{Top_10_2010:SummaryTableValue-2-Template|Ausnutzbarkeit|DURCHSCHNITTLICH}}
 
{{Top_10_2010:SummaryTableValue-2-Template|Ausnutzbarkeit|DURCHSCHNITTLICH}}
 
{{Top_10_2010:SummaryTableValue-1-Template|Verbreitung|SEHR HÄUFIG}}
 
{{Top_10_2010:SummaryTableValue-1-Template|Verbreitung|SEHR HÄUFIG}}
 
{{Top_10_2010:SummaryTableValue-1-Template|Auffindbarkeit|EINFACH}}
 
{{Top_10_2010:SummaryTableValue-1-Template|Auffindbarkeit|EINFACH}}
{{Top_10_2010:SummaryTableValue-2-Template|Auiswirkung|MITTEL}}
+
{{Top_10_2010:SummaryTableValue-2-Template|Auswirkung|MITTEL}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
Line 24: Line 35:
 
{{Top_10_2010:SummaryTableEndTemplate}}
 
{{Top_10_2010:SummaryTableEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=5}}
+
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=5|year=2010|language=de}}
 
Die Anwendung erlaubt es einem Benutzer, einen '''zustandsändernden Request''' auszulösen, der kein geheimes Token beinhaltet, wie z.B.:  
 
Die Anwendung erlaubt es einem Benutzer, einen '''zustandsändernden Request''' auszulösen, der kein geheimes Token beinhaltet, wie z.B.:  
  
Line 35: Line 46:
 
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.<!--- Text geändert --->
 
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.<!--- Text geändert --->
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5}}  
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5|year=2010|language=de}}  
 
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.
 
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.
 
# Die bevorzugte Methode, ein solches Token unterzubringen ist ein Hidden-Input-Feld. Damit wird der Token-Wert im Body des HTTP-Requests und nicht im URL übertragen. Eine Übertragung im URL kann leichter ausgespäht werden.
 
# Die bevorzugte Methode, ein solches Token unterzubringen ist ein Hidden-Input-Feld. Damit wird der Token-Wert im Body des HTTP-Requests und nicht im URL übertragen. Eine Übertragung im URL kann leichter ausgespäht werden.
 
# Ein solches Token kann auch direkt in den URL geschrieben oder als URL-Parameter übergeben werden. Jedoch birgt diese Vorgehensweise das Risiko, dass der URL dem Angreifer in die Hände fällt und somit das geheime Token kompromittiert ist. OWASPs [[CSRFGuard | CSRF Guard]] kann genutzt werden, um automatisch solche Token in Java EE, .NET oder PHP Anwendungen einzubinden. OWASPs [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/HTTPUtilities.html ESAPI] / [[OWASP’s ESAPI]] (tbd!!) beinhaltet Token-Generatoren und Validatoren, die Entwickler einsetzen können, um ihre Transaktionen zu schützen.
 
# Ein solches Token kann auch direkt in den URL geschrieben oder als URL-Parameter übergeben werden. Jedoch birgt diese Vorgehensweise das Risiko, dass der URL dem Angreifer in die Hände fällt und somit das geheime Token kompromittiert ist. OWASPs [[CSRFGuard | CSRF Guard]] kann genutzt werden, um automatisch solche Token in Java EE, .NET oder PHP Anwendungen einzubinden. OWASPs [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/HTTPUtilities.html ESAPI] / [[OWASP’s ESAPI]] (tbd!!) beinhaltet Token-Generatoren und Validatoren, die Entwickler einsetzen können, um ihre Transaktionen zu schützen.
</td></tr>
+
{{Top_10:SubsectionTableEndTemplate}}
<tr><td>
+
 
==JAVA==   
+
= '''JAVA''' =   
 
<!-- z.Z ohne Template --->
 
<!-- z.Z ohne Template --->
----
 
----
 
... tbd ...
 
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=3|risk=5}}
+
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=16|risk=5|year=2010|language=de}}
====Tbd!!====
+
{|
 +
! style="vertical-align:top; width:50%" |{{Top_10_2010:ExampleBeginTemplate}}
 +
''' /** (A) 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/>
  
{{Top_10_2010:ExampleBeginTemplate}}Tbd
+
 
String custname = request.getParameter("customerName"); // This should REALLY be validated too<br>
+
'''/** (B) In zu schützenden FORM-Seiten (B1), oder Urls (B2) 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/>
// perform input validation to detect attacks<br>
+
<!-------------------------- POST-Request und QS fehlen noch -------------------------------->
String query = "SELECT account_balance FROM user_data WHERE <span style="color: green;">'''user_name = ? ";'''</span><br>
+
 
<span style="color: green;">'''PreparedStatement pstmt = connection.prepareStatement( query );<br>pstmt.setString( 1, custname);'''</span><br>
+
'''/** (B2) das CSRF-Token als 'hidden field' in den GET-Request hinzufügen **/'''<br/>
<span style="color: green;">'''ResultSet results = pstmt.executeQuery( );'''</span>
+
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 &amp;, 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 + "&amp;" + 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}}
+
|style="vertical-align:top; width:50%" | {{Top_10_2010:ExampleBeginTemplate}}
====Tbd!!====
+
'''/** (C2) Beim Empfang der Daten das CSRF-Token prüfen (GET-Request) **/'''<br/>
{{Top_10_2010:ExampleBeginTemplate}}Tbd!!
+
public void verifyCSRFToken(HttpServletRequest request) throws IntrusionException {<br/>
String custname = request.getParameter("customerName"); // This should REALLY be validated<br>
+
: User user = ESAPI.authenticator().getCurrentUser();<br/>
try {<br>
+
: // check if user authenticated with this request - no CSRF protection required<br/>
:<span style="color: green;">'''CallableStatement cs = connection.prepareCall'''</span><br>
+
: if( request.getAttribute(user.getCSRFToken()) != null ) {<br/>
:: <span style="color: green;">'''("{call sp_getAccountBalance(?)}");'''</span><br>
+
::  return;<br/>
: <span style="color: green;">'''cs.setString(1, custname);ResultSet results = cs.executeQuery();</span><br>  
+
:}<br/>
:: <span style="color: green;">'''// … result set handling'''</span><br>
+
 
<span style="color: green;">'''} catch (SQLException se) {'''</span><br>
+
: String token = request.getParameter(CSRF_TOKEN_NAME);<br/>
: <span style="color: green;">'''// … logging and error handling'''</span><br>
+
: if ( !user.getCSRFToken().equals( token ) ) {<br/>
<span style="color: green;">'''}'''</span>
+
::  throw new IntrusionException("Authentication failed", "Possibly forged HTTP request without proper CSRF token detected");<br/>
 +
:}<br/>
 +
}<br/>
 +
 
 +
 
 +
'''/** (D) 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|year=2010|language=de}}
 
====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|year=2010|language=de}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
*[[CSRF | OWASP CSRF Article]]
 
 
*[[Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet | OWASP CSRF Prevention Cheat Sheet]]
 
*[[Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet | OWASP CSRF Prevention Cheat Sheet]]
 +
*[[CSRF | OWASP CSRF Article]]
 
*[[CSRFGuard | OWASP CSRFGuard - CSRF Defense Tool]]
 
*[[CSRFGuard | OWASP CSRFGuard - CSRF Defense Tool]]
 +
*[[CSRFGuard_3_Installation | OWASP CSRFGuard - CSRFGuard_3_Installation]] <!-- added -->
 +
*[[CSRFGuard_3_Configuration | OWASP CSRFGuard - CSRFGuard_3_Configuration]] <!-- added -->
 
*[[ESAPI | ESAPI Project Home Page]]
 
*[[ESAPI | ESAPI Project Home Page]]
 
*[http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/HTTPUtilities.html ESAPI HTTPUtilities Class with AntiCSRF Tokens]
 
*[http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/HTTPUtilities.html ESAPI HTTPUtilities Class with AntiCSRF Tokens]
 +
*[http://code.google.com/p/owasp-esapi-java/wiki/Welcome ESAPI-Java-Wiki] <!-- added -->
 
*[[Testing_for_CSRF_(OWASP-SM-005) | OWASP Testing Guide: Chapter on CSRF Testing]]
 
*[[Testing_for_CSRF_(OWASP-SM-005) | OWASP Testing Guide: Chapter on CSRF Testing]]
 
*[[CSRFTester | OWASP CSRFTester - CSRF Testing Tool]]
 
*[[CSRFTester | OWASP CSRFTester - CSRF Testing Tool]]
{{Top_10_2010:SubSubsectionExternalReferencesTemplate}}
+
{{Top_10_2010_Developer_Edition_De:SubSubsectionExternalReferencesTemplate|language=de}}
 
*[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:SubsectionTableEndTemplate}}
 +
 +
= '''Test''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}}{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5|year=2010|language=de}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5|year=2010|language=de}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5|year=2010|language=de}}
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5|year=2010|language=de}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5|year=2010|language=de}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5|year=2010|language=de}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
 +
= '''Test LanguageFile 2010 en''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5|year=2010|language=en}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5|year=2010|language=en}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5|year=2010|language=en}}
 +
tbd
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5|year=2010|language=en}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5|year=2010|language=en}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5|year=2010|language=en}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5|year=2010|language=en}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
 +
= '''Test LanguageFile 2010 us''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5|year=2010|language=us}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5|year=2010|language=us}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5|year=2010|language=us}}
 +
tbd
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5|year=2010|language=us}}
 +
Text
 +
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5|year=2010|language=us}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5|year=2010|language=us}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5|year=2010|language=us}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
 +
= '''Test LanguageFile 2010 Default''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5|year=2010}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5|year=2010}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5|year=2010}}
 +
tbd
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5|year=2010}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5|year=2010}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5|year=2010}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5|year=2010}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
 +
= '''Test LanguageFile 2013 Default''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5|year=2013}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5|year=2013}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5|year=2013}}
 +
tbd
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5|year=2013}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5|year=2013}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5|year=2013}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5|year=2013}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
 +
= '''Test LanguageFile Default''' =
 +
<!-- weitere Programmiersprachen oder evtl Anti-Beispiele --->
 +
{{Top_10:SubsectionTableBeginTemplate}} {{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=11|risk=5}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5}}
 +
{{Top_10_2010:ExampleBeginTemplate}}
 +
tbd
 +
Text
 +
{{Top_10_2010:ExampleEndTemplate}}
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=6|risk=5}}
 +
tbd
 +
(ganze Breite)
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=2|risk=5}}
 +
Text
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=12|risk=5}}
 +
Text
 +
 +
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=9|risk=5}}
 +
{{Top_10:SubsectionTableEndTemplate}}
 +
<headertabs />
 +
 +
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate
 +
    |type=0
 +
    |useprev=PrevLink_Germany_Projekte
 +
    |usenext=NextLink_Germany_Projekte
 +
    |prev=Top_10_fuer_Entwickler/A4_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
 +
              |4
 +
              |language=de
 +
              |year=2010}}
 +
    |next=Top_10_fuer_Entwickler/A6_{{Top_10_2010_Developer_Edition_De:ByTheNumbers
 +
              |6
 +
              |language=de
 +
              |year=2010}}
 +
}}
  
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A6_Security_Misconfiguration|useprev=PrevLink_Germany_Projekte|prev=Top_10_fuer_Entwickler/A4_Insecure_Direct_Object_References}}
 
  
 
[[Category:OWASP Top 10 fuer Entwickler]]
 
[[Category:OWASP Top 10 fuer Entwickler]]

Revision as of 07:30, 1 April 2013

← Top_10_fuer_Entwickler/A4_Unsichere direkte Objektreferenzen
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

Top_10_fuer_Entwickler/A6_Sicherheitsrelevante Fehlkonfiguration →

Seite in Bearbeitung (BAUSTELLE!!)

A5 Cross-Site Request Forgery (CSRF, XSRF, Session Riding)

Bedrohungsquelle
Angriffsvektor
Schwachstellen
Technische Auswirkung
Auswirkung auf das Unternehmen
______ Ausnutzbarkeit
DURCHSCHNITTLICH
Verbreitung
SEHR HÄUFIG
Auffindbarkeit
EINFACH
Auswirkung
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.
Bin ich durch 'Cross-Site Request Forgery (CSRF)' verwundbar?

Die Anwendung erlaubt es einem Benutzer, einen zustandsändernden Request auszulösen, der kein geheimes Token beinhaltet, wie z.B.:

http://example.com/app/transferFunds?amount=1500&destinationAccount=4673243243

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.

<img src="http://example.com/app/transferFunds?amount=1500&destinationAccount=attackersAcct#" width="0" height="0" />

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.

Wie kann ich 'Cross-Site Request Forgery (CSRF)' verhindern?

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.

  1. Die bevorzugte Methode, ein solches Token unterzubringen ist ein Hidden-Input-Feld. Damit wird der Token-Wert im Body des HTTP-Requests und nicht im URL übertragen. Eine Übertragung im URL kann leichter ausgespäht werden.
  2. Ein solches Token kann auch direkt in den URL geschrieben oder als URL-Parameter übergeben werden. Jedoch birgt diese Vorgehensweise das Risiko, dass der URL dem Angreifer in die Hände fällt und somit das geheime Token kompromittiert ist. OWASPs CSRF Guard kann genutzt werden, um automatisch solche Token in Java EE, .NET oder PHP Anwendungen einzubinden. OWASPs ESAPI / OWASP’s ESAPI (tbd!!) beinhaltet Token-Generatoren und Validatoren, die Entwickler einsetzen können, um ihre Transaktionen zu schützen.
[edit]

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

/** (A) CSRF-Token erzeugen **/
private String csrfToken = resetCSRFToken();
...
public String resetCSRFToken() {

csrfToken = ESAPI.randomizer().getRandomString(8, DefaultEncoder.CHAR_ALPHANUMERICS);
return csrfToken;

}


/** (B) In zu schützenden FORM-Seiten (B1), oder Urls (B2) das CSRF-Token als 'hidden field' hinzufügen, vgl ESAPI DefaultHTTPUtilities.java**/

/** (B2) das CSRF-Token als 'hidden field' in den GET-Request hinzufügen **/
final static String CSRF_TOKEN_NAME = "ctoken";
public String addCSRFToken(String href) {

User user = ESAPI.authenticator().getCurrentUser();
if (user.isAnonymous()) {
return href;
}
// if there are already parameters append with &, otherwise append with ?
String token = CSRF_TOKEN_NAME + "=" + user.getCSRFToken();
return href.indexOf( '?') != -1 ? href + "&" + token : href + "?" + token;

}

...
public String getCSRFToken() {

User user = ESAPI.authenticator().getCurrentUser();
if (user == null) return null;
return user.getCSRFToken();

}

/** (C2) Beim Empfang der Daten das CSRF-Token prüfen (GET-Request) **/
public void verifyCSRFToken(HttpServletRequest request) throws IntrusionException {

User user = ESAPI.authenticator().getCurrentUser();
// check if user authenticated with this request - no CSRF protection required
if( request.getAttribute(user.getCSRFToken()) != null ) {
return;
}
String token = request.getParameter(CSRF_TOKEN_NAME);
if ( !user.getCSRFToken().equals( token ) ) {
throw new IntrusionException("Authentication failed", "Possibly forged HTTP request without proper CSRF token detected");
}

}


/** (D) Beim Abmelden bzw. Timeout die Session ungültig machen **/
public void logout() {

ESAPI.httpUtilities().killCookie( ESAPI.currentRequest(), ESAPI.currentResponse(), HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME );
HttpSession session = ESAPI.currentRequest().getSession(false);
if (session != null) {
removeSession(session);
session.invalidate();
}
ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(), ESAPI.currentResponse(), "JSESSIONID");
loggedIn = false;
logger.info(Logger.SECURITY_SUCCESS, "Logout successful" );
ESAPI.authenticator().setCurrentUser(User.ANONYMOUS);

}

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Tbd!!

Z.B. Keine Bookmarks auf ausgefüllte Eingabe-Formulare, Suchergebnisse

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

OWASP

Andere

</td></tr></table>

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
Referenzen

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

(ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

</td></tr></table>

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
References

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd (ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

</td> 
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
How Do I Prevent 'Cross-Site Request Forgery (CSRF)'?

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

</td></tr></table>

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
References

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd (ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text


style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

</td> 
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
How Do I Prevent 'Cross-Site Request Forgery (CSRF)'?

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

</td></tr></table>

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
References

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd (ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

</td> 
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
How Do I Prevent 'Cross-Site Request Forgery (CSRF)'?

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

</td></tr></table>

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">
References

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">

tbd (ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">

Text

</td> 
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">
How Do I Prevent 'Security Misconfiguration'?

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4d953d;
          background-color: 
  1. F8FFF8;">

</td></tr></table>

 style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd Text

</td>
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
References

tbd Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

tbd (ganze Breite) Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

</td> 
                  <td
   style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">
How Do I Prevent 'Cross-Site Request Forgery (CSRF)'?

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

Text

style="vertical-align: top; padding:5px; width: 50%;
          border: 3px solid 
  1. 4F81BD;
          background-color: 
  1. F2F2F2;">

</td></tr></table>


← Top_10_fuer_Entwickler/A4_Unsichere direkte Objektreferenzen
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

Top_10_fuer_Entwickler/A6_Sicherheitsrelevante Fehlkonfiguration →

© 2002-2013 OWASP Foundation This document is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. Some rights reserved. CC-by-sa-3 0-88x31.png