Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add files via upload #9

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* This file is part of WebGoat, an Open Web Application Security Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2002 - 2019 Bruce Mayhew
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if
* not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Getting Source ==============
*
* Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software projects.
*/

package org.owasp.webgoat.lessons.sqlinjection.advanced;

import lombok.extern.slf4j.Slf4j;
import org.owasp.webgoat.container.LessonDataSource;
import org.owasp.webgoat.container.assignments.AssignmentEndpoint;
import org.owasp.webgoat.container.assignments.AssignmentHints;
import org.owasp.webgoat.container.assignments.AttackResult;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.*;

/**
* @author nbaars
* @since 4/8/17.
*/
@RestController
@AssignmentHints(value = {"SqlInjectionChallenge1", "SqlInjectionChallenge2", "SqlInjectionChallenge3"})
@Slf4j
public class SqlInjectionChallenge extends AssignmentEndpoint {

private final LessonDataSource dataSource;

public SqlInjectionChallenge(LessonDataSource dataSource) {
this.dataSource = dataSource;
}

@PutMapping("/SqlInjectionAdvanced/challenge")
//assignment path is bounded to class so we use different http method :-)
@ResponseBody
public AttackResult registerNewUser(@RequestParam String username_reg, @RequestParam String email_reg, @RequestParam String password_reg) throws Exception {
AttackResult attackResult = checkArguments(username_reg, email_reg, password_reg);

if (attackResult == null) {


try (Connection connection = dataSource.getConnection()) {
String checkUserQuery = "select userid from sql_challenge_users where userid = '" + username_reg + "'";
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

User data flows into this manually-constructed SQL string. User data can be safely inserted into SQL strings using prepared statements or an object-relational mapper (ORM). Manually-constructed SQL strings is a possible indicator of SQL injection, which could let an attacker steal or manipulate data from the database. Instead, use prepared statements (connection.PreparedStatement) or a safe library.

View Dataflow Graph
flowchart LR
    classDef invis fill:white, stroke: none
    classDef default fill:#e7f5ff, color:#1c7fd6, stroke: none

    subgraph File0["<b>src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java</b>"]
        direction LR
        %% Source

        subgraph Source
            direction LR

            v0("<b>[Line: 56]</b> username_reg")
        end
        %% Intermediate

        subgraph Traces0[Traces]
            direction TB

            v2("<b>[Line: 56]</b> username_reg")
        end
        %% Sink

        subgraph Sink
            direction LR

            v1("<b>[Line: 63]</b> #quot;select userid from sql_challenge_users where userid = #apos;#quot; + username_reg + #quot;#apos;#quot;")
        end
    end
    %% Class Assignment
    Source:::invis
    Sink:::invis

    Traces0:::invis
    File0:::invis

    %% Connections

    Source --> Traces0
    Traces0 --> Sink

    %% Clickable

    click v0 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L56" "View in source" _blank
    click v1 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L63" "View in source" _blank
    click v2 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L56" "View in source" _blank
Loading
Ignore this finding from tainted-sql-string.

Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(checkUserQuery);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Detected a formatted string in a SQL statement. This could lead to SQL injection if variables in the SQL statement are not properly sanitized. Use a prepared statements (java.sql.PreparedStatement) instead. You can obtain a PreparedStatement using 'connection.prepareStatement'.

View Dataflow Graph
flowchart LR
    classDef invis fill:white, stroke: none
    classDef default fill:#e7f5ff, color:#1c7fd6, stroke: none

    subgraph File0["<b>src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java</b>"]
        direction LR
        %% Source

        subgraph Source
            direction LR

            v0("<b>[Line: 63]</b> username_reg")
        end
        %% Intermediate

        subgraph Traces0[Traces]
            direction TB

            v2("<b>[Line: 63]</b> checkUserQuery")
        end
        %% Sink

        subgraph Sink
            direction LR

            v1("<b>[Line: 65]</b> statement.executeQuery(checkUserQuery)")
        end
    end
    %% Class Assignment
    Source:::invis
    Sink:::invis

    Traces0:::invis
    File0:::invis

    %% Connections

    Source --> Traces0
    Traces0 --> Sink

    %% Clickable

    click v0 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L63" "View in source" _blank
    click v1 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L65" "View in source" _blank
    click v2 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L63" "View in source" _blank
Loading
Ignore this finding from formatted-sql-string.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Untrusted input might be used to build a database query, which can lead to a SQL injection vulnerability. An attacker can execute malicious SQL statements and gain unauthorized access to sensitive data, modify, delete data, or execute arbitrary system commands. To prevent this vulnerability, use prepared statements that do not concatenate user-controllable strings and use parameterized queries where SQL commands and user data are strictly separated. Also, consider using an object-relational (ORM) framework to operate with safer abstractions. To build SQL queries safely in Java, it is possible to adopt prepared statements by using the java.sql.PreparedStatement class with bind variables.

View Dataflow Graph
flowchart LR
    classDef invis fill:white, stroke: none
    classDef default fill:#e7f5ff, color:#1c7fd6, stroke: none

    subgraph File0["<b>src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java</b>"]
        direction LR
        %% Source

        subgraph Source
            direction LR

            v0("<b>[Line: 56]</b> username_reg")
        end
        %% Intermediate

        subgraph Traces0[Traces]
            direction TB

            v2("<b>[Line: 56]</b> username_reg")

            v3("<b>[Line: 63]</b> checkUserQuery")
        end
            v2 --> v3
        %% Sink

        subgraph Sink
            direction LR

            v1("<b>[Line: 65]</b> statement.executeQuery(checkUserQuery)")
        end
    end
    %% Class Assignment
    Source:::invis
    Sink:::invis

    Traces0:::invis
    File0:::invis

    %% Connections

    Source --> Traces0
    Traces0 --> Sink

    %% Clickable

    click v0 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L56" "View in source" _blank
    click v1 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L65" "View in source" _blank
    click v2 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L56" "View in source" _blank
    click v3 href "https://github.com/sinat101/WebGoat/blob/cf59bb29fc11993c328a08599acae47537e7af8d/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/test_SqlInjectionChallenge.java#L63" "View in source" _blank
Loading
Ignore this finding from formatted-sql-string-deepsemgrep.


if (resultSet.next()) {
if (username_reg.contains("tom'")) {
attackResult = success(this).feedback("user.exists").build();
} else {
attackResult = failed(this).feedback("user.exists").feedbackArgs(username_reg).build();
}
} else {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO sql_challenge_users VALUES (?, ?, ?)");
preparedStatement.setString(1, username_reg);
preparedStatement.setString(2, email_reg);
preparedStatement.setString(3, password_reg);
preparedStatement.execute();
attackResult = success(this).feedback("user.created").feedbackArgs(username_reg).build();
}
} catch (SQLException e) {
attackResult = failed(this).output("Something went wrong").build();
}
}
return attackResult;
}

private AttackResult checkArguments(String username_reg, String email_reg, String password_reg) {
if (StringUtils.isEmpty(username_reg) || StringUtils.isEmpty(email_reg) || StringUtils.isEmpty(password_reg)) {
return failed(this).feedback("input.invalid").build();
}
if (username_reg.length() > 250 || email_reg.length() > 30 || password_reg.length() > 30) {
return failed(this).feedback("input.invalid").build();
}
return null;
}
}