Java中的SQL注入攻击

时间:2018-07-17 14:35:45

标签: java sonarqube sql-injection

我正在尝试使用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");
        }

    }

}

但是代码中存在一些问题,因此声纳尔无法获取该代码并表明注入攻击存在问题。

如何修改此代码以创建一些SQL注入攻击,以便我的声纳能够在仪表板上显示此错误?

简而言之,如此处https://rules.sonarsource.com/java/tag/SonarSecurity/RSPEC-3649

所述,修改以上代码以创建注入攻击

2 个答案:

答案 0 :(得分:1)

  

应始终考虑用户提供的数据(例如URL参数)   不受信任和污染。

AFAIK运行时参数不被识别为来自用户的输入。要重现该问题,请尝试从请求的URL参数中获取 user pass

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

答案 1 :(得分:-2)

在这一行

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

与其使用+来连接字符串,而不是使用StringBuilder及其附加方法来连接字符串,这样可以避免SQL注入攻击。