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)"

From OWASP
Jump to: navigation, search
(Created page with "{{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)|pr...")
 
Line 3: Line 3:
 
====die Überschriften kommen z.T noch von den Templates der englischen Top 10, Tbd!!====
 
====die Überschriften kommen z.T noch von den Templates der englischen Top 10, Tbd!!====
 
----
 
----
== A5 Cross-Site Request Forgery (CSRF)==  
+
== A5 Cross-Site Request Forgery (CSRF) (untergeschobene Requests) ==  
  
 
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate}}
 
{{Top_10_2010_Developer_Edition_De:SummaryTableHeaderBeginTemplate}}
Line 11: Line 11:
 
{{Top_10_2010:SummaryTableValue-2-Template|Auiswirkung|MITTEL}}
 
{{Top_10_2010:SummaryTableValue-2-Template|Auiswirkung|MITTEL}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
 
{{Top_10_2010:SummaryTableHeaderEndTemplate}}
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Jeder, der einem Nutzer einer Webanwen-dung 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>
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Durch Image-Tags, XSS oder andere Techniken löst das Opfer unbeabsichtigt einen gefälschten HTTP-Request für eine Anwendung aus. <u>Falls der Nutzer authentifiziert ist</u>, wird dieser Angriff Erfolg haben.</td>
+
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Durch Image-Tags, XSS oder andere Techniken löst das Opfer unbeabsichtigt einen gefälschten HTTP-Request für eine Anwendung aus. <u>Falls der Nutzer authentisiert ist</u>, wird dieser Angriff Erfolg haben.</td>
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>[[CSRF]] zielt auf Anwendungen, die es dem An-greifer erlauben, alle Details eines Requests für eine bestimmte Aktion vorherzusagen.
+
     <td colspan=2  {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>[[CSRF]] zielt auf Anwendungen, die es dem Angreifer erlauben, alle Details eines Requests für eine bestimmte Aktion vorherzusagen.
  
Da Browser Informationen zum Session-Ma-nagement automatisch mitsenden, kann ein Angreifer gefälschte Requests auf bösartigen Websites hinterlegen, die von legitimen Requests nicht unterschieden werden können.  
+
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.</td>
 
CSRF-Schwächen sind leicht durch Penetrationstests oder Quellcode-Analysen auffindbar.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
 
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Betrachten Sie den Geschäftswert der be-troffenen Daten oder Funktionen. Es bleibt die Unsicherheit, ob der Nutzer die Aktion ausführen wollte.
+
     <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>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.</td>
 
Bedenken Sie mögliche Auswirkungen auf Ihre Reputation.</td>
 
{{Top_10_2010:SummaryTableEndTemplate}}
 
{{Top_10_2010:SummaryTableEndTemplate}}
  
----
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=5}}
----
+
Die Anwendung erlaubt es einem Benutzer, einen '''zustandsändernden Request''' auszulösen, der kein geheimes Token beinhaltet, wie z.B.:
... tbd ...
 
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=1|risk=5}}
+
: '''<nowiki>http://example.com/app/transferFunds?amount=1500&amp;destinationAccount=4673243243</nowiki>'''
Die Anwendung erlaubt es einem Benutzer, einen zustands-ändernden Request auszulösen, der kein geheimes Token beinhaltet, wie z.B.: {{Top_10_2010:ExampleBeginTemplate}}<nowiki>http://example.com/app/transferFunds?amount=1500 &destinationAccount=4673243243</nowiki>
 
  
 
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.  
 
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.  
  
{{Top_10_2010:ExampleBeginTemplate}}<span style="color: red;"><nowiki><img src="http://example.com/app/transferFunds? amount=1500&destinationAccount=attackersAcct#width="0" height="0" /></nowiki></span> <!--- ''' ... ''' --->
+
: '''<nowiki>&lt;img src=&quot;http://example.com/app/transferFunds?</nowiki><span style="color: red;"><nowiki>amount=1500&amp;destinationAccount=attackersAcct#&quot; width=&quot;0&quot; height=&quot;0&quot; /&gt;</nowiki>'''</span>
 
 
Wenn das Opfer eine präparierte Seite besucht, während es bereits auf example.com authentifiziert ist, werden sämtliche dieser unter-geschobenen Requests gültige Session-Informationen mit versenden und somit unbeabsichtigt autorisiert sein.
 
  
 +
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}}  
 
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.
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.
+
# 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 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>
+
</td></tr>
 
<tr><td>
 
<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=1}}
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=3|risk=5}}
====Prepared Statements (Parameterized Queries) [nur für SQL]====
+
====Tbd!!====
  
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate}}Tbd
 
String custname = request.getParameter("customerName"); // This should REALLY be validated too<br>
 
String custname = request.getParameter("customerName"); // This should REALLY be validated too<br>
 
// perform input validation to detect attacks<br>
 
// perform input validation to detect attacks<br>
Line 58: Line 58:
 
{{Top_10_2010:ExampleEndTemplate}}  
 
{{Top_10_2010:ExampleEndTemplate}}  
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=1}}
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=4|risk=5}}
====Stored Procedures [nur für SQL]====
+
====Tbd!!====
{{Top_10_2010:ExampleBeginTemplate}}
+
{{Top_10_2010:ExampleBeginTemplate}}Tbd!!
 
String custname = request.getParameter("customerName"); // This should REALLY be validated<br>
 
String custname = request.getParameter("customerName"); // This should REALLY be validated<br>
 
try {<br>
 
try {<br>
Line 72: Line 72:
 
{{Top_10_2010:ExampleEndTemplate}}
 
{{Top_10_2010:ExampleEndTemplate}}
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=5|risk=1}}
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=7|risk=5}}
====Benutzereingaben sorgfältig prüfen und entschärfen (Escaping All User Supplied Input)====
+
====Tbd!!====
Diese Technik sollte bei SQL nur als Zusatzmaßnahme, oder als Notlösung für alte Software in Betracht gezogen werden, für die anderen Typen ist sie die einzige, bekannte Maßnahme. Die Metazeichen sind je Backend-Typ und meist auch je Backend-Hersteller unterschiedlich (z.B. Datenbank-Hersteller), vgl [[OWASP’s ESAPI]].
+
Z.B. Bookmarks
{{Top_10_2010:ExampleBeginTemplate}}
 
Codec ORACLE_CODEC = new OracleCodec(); //added<br>
 
String query = "SELECT user_id FROM user_data WHERE user_name = '" +<br>
 
: <span style="color: green;">'''ESAPI.encoder().encodeForSQL( ORACLE_CODEC, //added'''</span><br>
 
: <span style="color: green;">'''req.getParameter("userID") )'''</span> + "' and user_password = '" +<br>
 
: <span style="color: green;">'''ESAPI.encoder().encodeForSQL( ORACLE_CODEC, //added'''</span><br>
 
: <span style="color: green;">'''req.getParameter("pwd") )'''</span> +"'";
 
{{Top_10_2010:ExampleEndTemplate}}
 
  
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=1}}
+
{{Top_10_2010_Developer_Edition_De:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|number=8|risk=5}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
 
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}}
* [[SQL_Injection_Prevention_Cheat_Sheet | OWASP SQL Injection Prevention Cheat Sheet]]
+
*[[CSRF | OWASP CSRF Article]]
* [[Command_Injection | OWASP Injection Flaws Article]]
+
*[[Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet | OWASP CSRF Prevention Cheat Sheet]]
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html ESAPI Encoder API]
+
*[[CSRFGuard | OWASP CSRFGuard - CSRF Defense Tool]]
* [http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Validator.html ESAPI Input Validation API]
+
*[[ESAPI | ESAPI Project Home Page]]
* [http://www.owasp.org/index.php/ASVS#tab=Downloads ASVS: Output Encoding/Escaping Requirements (V6)]
+
*[http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/HTTPUtilities.html ESAPI HTTPUtilities Class with AntiCSRF Tokens]
* [[Testing_for_SQL_Injection_(OWASP-DV-005) | OWASP Testing Guide: Chapter on SQL Injection Testing]]
+
*[[Testing_for_CSRF_(OWASP-SM-005) | OWASP Testing Guide: Chapter on CSRF Testing]]
* [[Reviewing_Code_for_SQL_Injection | OWASP Code Review Guide: Chapter on SQL Injection]]
+
*[[CSRFTester | OWASP CSRFTester - CSRF Testing Tool]]
* [[Reviewing_Code_for_OS_Injection | OWASP Code Review Guide: Command Injection]]
 
 
{{Top_10_2010:SubSubsectionExternalReferencesTemplate}}
 
{{Top_10_2010:SubSubsectionExternalReferencesTemplate}}
* [http://cwe.mitre.org/data/definitions/77.html CWE Entry 77 on Command Injection]
+
*[http://cwe.mitre.org/data/definitions/352.html CWE Entry 352 on CSRF]
* [http://cwe.mitre.org/data/definitions/89.html CWE Entry 89 on SQL Injection]
+
 
{{Top_10_2010_Developer_Edition_De:BottomAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|usenext=NextLink_Germany_Projekte|next=Top_10_fuer_Entwickler/A2_Cross-Site_Scripting_(XSS)|useprev=PrevLink_Germany_Projekte|prev=Top_10_fuer_Entwickler}}
+
{{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 14:15, 6 February 2013

← Top_10_fuer_Entwickler/Risiken
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

Top_10_fuer_Entwickler/A2_Cross-Site_Scripting_(XSS) →

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)

Threat Agents
Attack Vectors
Security Weakness
Technical Impacts
Business Impacts
______ 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.:

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.

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.

  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.

JAVA



... tbd ...

Example Attack Scenarios

Tbd!!

Tbd

String custname = request.getParameter("customerName"); // This should REALLY be validated too
// perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, custname);

ResultSet results = pstmt.executeQuery( );

References

Tbd!!

Tbd!!

String custname = request.getParameter("customerName"); // This should REALLY be validated
try {

CallableStatement cs = connection.prepareCall
("{call sp_getAccountBalance(?)}");
cs.setString(1, custname);ResultSet results = cs.executeQuery();
// … result set handling

} catch (SQLException se) {

// … logging and error handling

}

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

Tbd!!

Z.B. Bookmarks

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

OWASP

External

← Top_10_fuer_Entwickler/A4_Insecure_Direct_Object_References
Top 10 fuer Entwickler-2013: Inhaltsverzeichnis

Die Top-10-Risiken

Top_10_fuer_Entwickler/A6_Security_Misconfiguration →

© 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