簡體   English   中英

Java中的SQL注入攻擊

[英]SQL injection Attack in Java

我正在嘗試使用 java 代碼實現其中一種場景。 我正在編寫一些糟糕的代碼來通過聲納分析它。

我試圖從https://rules.sonarsource.com/java/tag/SonarSecurity/RSPEC-3649測試“SQL 查詢不應受到注入攻擊”。 下面是我試圖分析的代碼,

package group;
import java.util.*;
import java.io.PrintStream;
import java.nio.file.*;
import javax.naming.directory.*;
import javax.naming.ldap.*;
import javax.naming.*;

public class SonarDemo {

    public static void main(String[] args) {
        PrintStream o = System.out; //NOSONAR

        String pass = args[0];//request.getParameter("pass");
        String user = args[1];
        String query = "SELECT * FROM users WHERE user = '" + user + "' AND pass = '" + pass + "'"; // Unsafe
        Properties connectionProps = new Properties();
        connectionProps.put("user", user);
        connectionProps.put("password", pass);
        java.sql.Connection connection = null;
        try {
            connection = java.sql.DriverManager.getConnection("jdbc:localhost:sql1;create=true",connectionProps);
            java.sql.Statement statement = connection.createStatement();
            java.sql.ResultSet resultSet = statement.executeQuery(query);
            Files.exists(Paths.get("/home/", user));

            String filter = "(&(uid=" + user + ")(userPassword=" + pass + "))"; // Unsafe

            LdapContext ctx = new InitialLdapContext();
            NamingEnumeration<SearchResult> results = ctx.search("ou=system", filter, new SearchControls());

        } catch (Exception e){
            o.println("Exception");
        }

    }

}

但是代碼中存在一些問題,其中 sonarqube 無法獲取此代碼並顯示注入攻擊存在問題。

如何修改此代碼以創建一些 SQL 注入攻擊,以便我的 sonarqube 能夠在儀表板上顯示此錯誤?

簡而言之-修改上面的代碼以創建這里提到的注入攻擊https://rules.sonarsource.com/java/tag/SonarSecurity/RSPEC-3649

用戶提供的數據(例如 URL 參數)應始終被視為不受信任和受污染。

AFAIK 運行時參數不被識別為來自用戶的輸入。 要重現該問題,請嘗試獲取用戶並從請求的 URL 參數中傳遞

public boolean authenticate(javax.servlet.http.HttpServletRequest request, java.sql.Connection connection) throws SQLException {
  String user = request.getParameter("user");
  String pass = request.getParameter("pass");
}

在這個特定的行中

String query = "SELECT * FROM users WHERE user = '" + user + "' AND pass = '" + pass + "'"; // Unsafe

而不是使用+來連接字符串,使用StringBuilder及其 append 方法來連接字符串,這將避免 SQL 注入攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM