From 37c56c748dace2789ce46364f6b5dd97b4761649 Mon Sep 17 00:00:00 2001 From: "sherif.fathy" Date: Thu, 28 Dec 2006 16:59:02 +0000 Subject: [PATCH] modified CSRF to add an actual attack git-svn-id: http://webgoat.googlecode.com/svn/trunk@49 4033779f-a91e-0410-96ef-6bf7bf53c507 --- .../org/owasp/webgoat/lessons/CSRF.java | 272 +++++++++++++++--- .../WebContent/images/header/header.jpg | Bin 83149 -> 27421 bytes 2 files changed, 228 insertions(+), 44 deletions(-) diff --git a/ webgoat/main/project/JavaSource/org/owasp/webgoat/lessons/CSRF.java b/ webgoat/main/project/JavaSource/org/owasp/webgoat/lessons/CSRF.java index 25832dd8d..87c461bdd 100644 --- a/ webgoat/main/project/JavaSource/org/owasp/webgoat/lessons/CSRF.java +++ b/ webgoat/main/project/JavaSource/org/owasp/webgoat/lessons/CSRF.java @@ -1,77 +1,251 @@ package org.owasp.webgoat.lessons; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; import org.apache.ecs.Element; import org.apache.ecs.ElementContainer; import org.apache.ecs.StringElement; +import org.apache.ecs.html.A; +import org.apache.ecs.html.B; +import org.apache.ecs.html.H1; +import org.apache.ecs.html.HR; import org.apache.ecs.html.Input; import org.apache.ecs.html.P; import org.apache.ecs.html.TD; import org.apache.ecs.html.TR; import org.apache.ecs.html.Table; import org.apache.ecs.html.TextArea; +import org.owasp.webgoat.session.DatabaseUtilities; import org.owasp.webgoat.session.ECSFactory; import org.owasp.webgoat.session.WebSession; +import org.owasp.webgoat.util.HtmlEncoder; public class CSRF extends LessonAdapter { private final static String MESSAGE = "message"; + private final static int MESSAGE_COL = 3; + private final static String NUMBER = "Num"; + private final static int NUM_COL = 1; + private final static String STANDARD_QUERY = "SELECT * FROM messages"; private final static String TITLE = "title"; + private final static int TITLE_COL = 2; + private static Connection connection = null; + private static int count = 1; + private final static int USER_COL = 4; // Added by Chuck Willis - used to show user who posted message + + /** + * Adds a feature to the Message attribute of the MessageBoardScreen object + * + * @param s The feature to be added to the Message attribute + */ + protected void addMessage( WebSession s ) + { + try + { + String title = HtmlEncoder.encode( s.getParser().getRawParameter( TITLE, "" ) ); + String message = s.getParser().getRawParameter( MESSAGE, "" ); + + if ( connection == null ) + { + connection = DatabaseUtilities.makeConnection( s ); + } + + String query = "INSERT INTO messages VALUES (?, ?, ?, ? )"; + + PreparedStatement statement = connection.prepareStatement( query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); + statement.setInt(1, count++); + statement.setString(2, title); + statement.setString(3, message); + statement.setString(4, s.getUserName()); + statement.executeQuery(); + } + catch ( Exception e ) + { + // ignore the empty resultset on the insert. There are a few more SQL Injection errors + // that could be trapped here but we will let them try. One error would be something + // like "Characters found after end of SQL statement." + if ( e.getMessage().indexOf("No ResultSet was produced") == -1 ) + { + s.setMessage( "Could not add message to database" ); + } + } + } @Override protected Element createContent(WebSession s) { ElementContainer ec = new ElementContainer(); - String emailBody = null; - try{ - Table t = new Table( 0 ).setCellSpacing( 0 ).setCellPadding( 0 ).setBorder( 0 ); - TR row1 = new TR(); - TR row2 = new TR(); - row1.addElement( new TD( new StringElement( "Title: " ) ) ); - - Input inputTitle = new Input( Input.TEXT, TITLE, "" ); - row1.addElement( new TD( inputTitle ) ); - - TD item1 = new TD(); - item1.setVAlign( "TOP" ); - item1.addElement( new StringElement( "Message: " ) ); - row2.addElement( item1 ); - - TD item2 = new TD(); - TextArea ta = new TextArea( MESSAGE, 5, 60 ); - item2.addElement( ta ); - row2.addElement( item2 ); - t.addElement( row1 ); - t.addElement( row2 ); - - Element b = ECSFactory.makeButton( "Submit" ); - ec = new ElementContainer(); - ec.addElement( t ); - ec.addElement( new P().addElement( b ) ); - - emailBody = new String( s.getParser().getRawParameter( MESSAGE, "" ) ); - - } - catch (Exception e) - { - s.setMessage( "Error generating " + this.getClass().getName() ); - e.printStackTrace(); - } - - if (emailBody.length() != 0 && - emailBody.indexOf( "=0 && - emailBody.indexOf( "src=") > 0 && - emailBody.indexOf( "height=\"1\"" ) > 0 && - emailBody.indexOf( "width=\"1\"" ) > 0) - { - makeSuccess( s ); - } + addMessage( s ); + ec.addElement( makeInput( s ) ); + ec.addElement( new HR() ); + ec.addElement( makeCurrent( s ) ); + ec.addElement( new HR() ); + ec.addElement( makeList( s ) ); return ec; } + /** + * Description of the Method + * + * @param s Description of the Parameter + * @return Description of the Return Value + */ + protected Element makeInput( WebSession s ) + { + Table t = new Table( 0 ).setCellSpacing( 0 ).setCellPadding( 0 ).setBorder( 0 ); + TR row1 = new TR(); + TR row2 = new TR(); + row1.addElement( new TD( new StringElement( "Title: " ) ) ); + + Input inputTitle = new Input( Input.TEXT, TITLE, "" ); + row1.addElement( new TD( inputTitle ) ); + + TD item1 = new TD(); + item1.setVAlign( "TOP" ); + item1.addElement( new StringElement( "Message: " ) ); + row2.addElement( item1 ); + + TD item2 = new TD(); + TextArea ta = new TextArea( MESSAGE, 5, 60 ); + item2.addElement( ta ); + row2.addElement( item2 ); + t.addElement( row1 ); + t.addElement( row2 ); + + Element b = ECSFactory.makeButton( "Submit" ); + ElementContainer ec = new ElementContainer(); + ec.addElement( t ); + ec.addElement( new P().addElement( b ) ); + + return ( ec ); + } + + /** + * Description of the Method + * + * @param s Description of the Parameter + * @return Description of the Return Value + */ + public static Element makeList( WebSession s ) + { + Table t = new Table( 0 ).setCellSpacing( 0 ).setCellPadding( 0 ).setBorder( 0 ); + + try + { + if ( connection == null ) + { + connection = DatabaseUtilities.makeConnection( s ); + } + + Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); + + ResultSet results = statement.executeQuery( STANDARD_QUERY + " WHERE user_name LIKE '" + getNameroot( s.getUserName() ) + "%'" ); + + if ( ( results != null ) && ( results.first() == true ) ) + { + results.beforeFirst(); + + for ( int i = 0; results.next(); i++ ) + { + A a = ECSFactory.makeLink( results.getString( TITLE_COL ), NUMBER, results.getInt( NUM_COL ) ); + TD td = new TD().addElement( a ); + TR tr = new TR().addElement( td ); + t.addElement( tr ); + } + } + } + catch ( Exception e ) + { + s.setMessage( "Error while getting message list." ); + } + + ElementContainer ec = new ElementContainer(); + ec.addElement( new H1( "Message List" ) ); + ec.addElement( t ); + + return ( ec ); + } + + /** + * Description of the Method + * + * @param s Description of the Parameter + * @return Description of the Return Value + */ + protected Element makeCurrent( WebSession s ) + { + ElementContainer ec = new ElementContainer(); + + try + { + int messageNum = s.getParser().getIntParameter( NUMBER, 0 ); + + if ( connection == null ) + { + connection = DatabaseUtilities.makeConnection( s ); + } + + + String query = "SELECT * FROM messages WHERE user_name LIKE ? and num = ?"; + PreparedStatement statement = connection.prepareStatement( query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); + statement.setString(1, getNameroot( s.getUserName() ) + "%"); + statement.setInt(2, messageNum); + ResultSet results = statement.executeQuery(); + + if ( ( results != null ) && results.first() ) + { + ec.addElement( new H1( "Message Contents For: " + results.getString( TITLE_COL )) ); + Table t = new Table( 0 ).setCellSpacing( 0 ).setCellPadding( 0 ).setBorder( 0 ); + TR row1 = new TR( new TD( new B(new StringElement( "Title:" )) ) ); + row1.addElement( new TD( new StringElement( results.getString( TITLE_COL ) ) ) ); + t.addElement( row1 ); + + String messageData = results.getString( MESSAGE_COL ); + TR row2 = new TR( new TD( new B(new StringElement( "Message:" )) ) ); + row2.addElement( new TD( new StringElement( messageData ) ) ); + t.addElement( row2 ); + + // Edited by Chuck Willis - added display of the user who posted the message, so that + // if users use a cross site request forgery or XSS to make another user post a message, + // they can see that the message is attributed to that user + + TR row3 = new TR( new TD( new StringElement( "Posted By:" ) ) ); + row3.addElement( new TD( new StringElement( results.getString( USER_COL ) ) ) ); + t.addElement( row3 ); + + ec.addElement( t ); + + // Some sanity checks that the script may be correct + + String transferFunds = s.getParser().getRawParameter("transferFunds" , ""); + if (transferFunds.length() != 0) + { + makeSuccess(s); + } + } + else + { + if ( messageNum != 0 ) + { + ec.addElement( new P().addElement( "Could not find message " + messageNum ) ); + } + } + } + catch ( Exception e ) + { + s.setMessage( "Error generating " + this.getClass().getName() ); + e.printStackTrace(); + } + + return ( ec ); + } + @Override protected Category getDefaultCategory() { return AbstractLesson.A4; @@ -105,4 +279,14 @@ public class CSRF extends LessonAdapter { return ( "How to Perform Cross Site Request Forgery (CSRF)" ); } + private static String getNameroot( String name ) + { + String nameroot = name; + if (nameroot.indexOf('-') != -1) + { + nameroot = nameroot.substring(0, nameroot.indexOf('-')); + } + return nameroot; + } + } diff --git a/ webgoat/main/project/WebContent/images/header/header.jpg b/ webgoat/main/project/WebContent/images/header/header.jpg index 84259aba45fdf5081e164b407f2b5caf98336c96..9468a467ba6c3a16a163ff079bb2fa75f51f1062 100644 GIT binary patch literal 27421 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 Y$GxB4tHH^%tDpBOAQxg(*CBNNKUm;}!vFvP literal 83149 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