doc
java
resources
scripts
tomcatconf
webapp
META-INF
WEB-INF
css
database
images
javascript
lesson_plans
lesson_solutions
AccessControlMatrix_files
BackDoors_files
BasicAuthentication_files
BlindSqlInjection_files
BypassHtmlFieldRestrictions_files
CSRF_files
ClientSideFiltering_files
ClientSideValidation_files
CommandInjection_files
ConcurrencyCart_files
CsrfPromptByPass_files
CsrfTokenByPass_files
DOMInjection_files
DOMXSS_files
DOS_Login_files
FailOpenAuthentication_files
ForcedBrowsing_files
ForgotPassword_files
HiddenFieldTampering_files
HtmlClues_files
HttpBasics_files
HttpOnly_files
HttpSplitting_files
InsecureLogin_files
JSONInjection_files
JavaScriptValidation_files
Lab Access Control
Lab SQL Injection
Lab Numeric SQL Injection.html
Lab Parameterized Query #1.html
Lab Parameterized Query #2.html
Lab String SQL Injection.html
Lab XSS
LogSpoofing_files
MaliciousFileExecution_files
MultiLevelLogin1_files
MultiLevelLogin2_files
PasswordStrength_files
PathBasedAccessControl_files
Phishing_files
ReflectedXSS_files
RemoteAdminFlaw_files
SessionFixation_files
SilentTransactions_files
SoapRequest_files
SqlAddData_files
SqlModifyData_files
SqlNumericInjection_files
SqlStringInjection_files
StoredXSS_files
ThreadSafetyProblem_files
TraceXSS_files
UncheckedEmail_files
WSDLScanning_files
WeakAuthenticationCookie_files
WeakSessionID_files
WeakSessionID_filesBAK
WsSAXInjection_files
WsSqlInjection_files
XMLInjection_files
XPATHInjection_files
AccessControlMatrix.html
BackDoors.html
BasicAuthentication.html
BlindNumericSqlInjection.html
BlindStringSqlInjection.html
BypassHtmlFieldRestrictions.html
CSRF.html
ClientSideFiltering.html
ClientSideValidation.html
CommandInjection.html
ConcurrencyCart.html
CsrfPromptByPass.html
CsrfTokenByPass.html
DOMInjection.html
DOMXSS.html
DOS_Login.html
DangerousEval.html
Encoding.html
FailOpenAuthentication.html
ForcedBrowsing.html
ForgotPassword.html
HiddenFieldTampering.html
HtmlClues.html
HttpBasics.html
HttpOnly.html
HttpSplitting.html
InsecureLogin.html
JSONInjection.html
JavaScriptValidation.html
LogSpoofing.html
MaliciousFileExecution.html
MultiLevelLogin1.html
MultiLevelLogin2.html
OffByOne.html
PasswordStrength.html
PathBasedAccessControl.html
Phishing.html
ReflectedXSS.html
RemoteAdminFlaw.html
SameOriginPolicyProtection.html
SessionFixation.html
SilentTransactions.html
SoapRequest.html
SqlAddData.html
SqlModifyData.html
SqlNumericInjection.html
SqlStringInjection.html
StoredXss.html
ThreadSafetyProblem.html
TraceXSS.html
UncheckedEmail.html
WSDLScanning.html
WeakAuthenticationCookie.html
WeakSessionID.html
WeakSessionID.htmlBAK
WsSAXInjection.html
WsSqlInjection.html
XMLInjection.html
XPATHInjection.html
formate.css
lessons
users
main.jsp
reportBug.jsp
sideWindow.jsp
webgoat.jsp
webgoat_challenge.jsp
.gitignore
README.txt
build.xml
pom.xml
webgoat for SQL Server.bat
webgoat.bat
webgoat.sh
webgoat_8080.bat
webscarab.bat
git-svn-id: http://webgoat.googlecode.com/svn/branches/webgoat-6.0@485 4033779f-a91e-0410-96ef-6bf7bf53c507
87 lines
3.4 KiB
HTML
87 lines
3.4 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
<title>Solution Lab SQL Injection Stage2</title>
|
|
<link rel="stylesheet" type="text/css"
|
|
href="lesson_solutions/formate.css">
|
|
</head>
|
|
<body>
|
|
<p><b>Lesson Plan Title:</b> How to Perform a SQLInjection</p>
|
|
|
|
<p><b>Concept / Topic To Teach:</b><br />
|
|
SQL injection attacks represent a serious threat to any database-driven
|
|
site. The methods behind an attack are easy to learn and the damage
|
|
caused can range from considerable to complete system compromise.
|
|
Despite these risks, an incredible number of systems on the internet are
|
|
susceptible to this form of attack.</p>
|
|
|
|
<p>Not only is it a threat easily instigated, it is also a threat
|
|
that, with a little common-sense and forethought, can easily be
|
|
prevented.</p>
|
|
|
|
<p>It is always good practice to sanitize all input data, especially
|
|
data that will used in OS command, scripts, and database queiries, even
|
|
if the threat of SQL injection has been prevented in some other manner.
|
|
</p>
|
|
|
|
<p><b>General Goal(s):</b><br />
|
|
For this exercise, you will perform SQLInjection attacks. You will also
|
|
implement code changes in the web application to defeat these attacks.</p>
|
|
|
|
<b>Solution:</b><br />
|
|
To prevent a SQLInjection you can use "Parametreized Queries". This kind of
|
|
query makes it possible to use every input of an user as a parameter.
|
|
In this lesson you have to change org.owasp.webgoat.lessons.SQLInjection.Login.java
|
|
The query execution in the method login looks like this:<pre><code>
|
|
String query = "SELECT * FROM employee WHERE userid = " + userId + " and password = '" + password + "'";
|
|
// System.out.println("Query:" + query);
|
|
try
|
|
{
|
|
Statement answer_statement = WebSession.getConnection(s)
|
|
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
|
|
ResultSet answer_results = answer_statement.executeQuery(query);
|
|
etc...
|
|
</code></pre>
|
|
<p>
|
|
To paramerize the Query you have to replace the userinput with questionmarks:<br/>
|
|
<code>String query = "SELECT * FROM employee WHERE userid = ? and password = ?";</code><br/>
|
|
</p>
|
|
<p>
|
|
Now follows the try block with the getConnection method:<br/>
|
|
<code>
|
|
try <br/>
|
|
{<br/>
|
|
Connection connection = WebSession.getConnections(s);
|
|
</code></p>
|
|
<p>
|
|
The next step is to do a so called "PrepareStatement":<br/>
|
|
<code>PreparedStatement statement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
|
|
</code><br/></p>
|
|
<p>
|
|
Now that the query is prepared we have to add the parameters to the query:<br/>
|
|
<code>
|
|
statement.setString(1, userId);<br/>
|
|
statement.setString(2, password);<br>
|
|
</code>
|
|
</p>
|
|
<p>
|
|
We are ready to execute the query!<br/>
|
|
<code>
|
|
ResultSet answer_results = statement.executeQuery();</code>
|
|
</p>
|
|
<p>Putting everything together results in:<br/>
|
|
<pre><code>
|
|
String query = "SELECT * FROM employee WHERE userid = ? and password = ?";
|
|
try
|
|
{
|
|
Connection connection = WebSession.getConnections(s);
|
|
PreparedStatement statement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
|
|
statement.setString(1, userId);
|
|
statement.setString(2, password);
|
|
ResultSet answer_results = statement.executeQuery();
|
|
etc...
|
|
</code></pre>
|
|
|
|
</body>
|
|
</html> |