当前位置: 首页 > 知识库问答 >
问题:

Checkmarx Postgres查询形成错误SQL注入错误SQL二阶注入错误Java Springboot

姜卜霸
2023-03-14

我有一些执行数据库操作API。每当我将代码上传到checkmarx时,我会得到以下错误,并将其标记为高漏洞错误,有人能帮助我吗?

应用程序的CreateDatabaseAndMapToDomain方法使用executeQuery执行SQL查询,位于daas-springboot-checkmarxintegration\src\main\java\com\it\daas\apis\service\PostgresConnectionServiceImpl.java的第717行。应用程序通过将不受信任的字符串嵌入到查询中而不进行适当的清理来构造此SQL查询。串联的字符串被提交到数据库,在数据库中进行相应的解析和执行。

攻击者可以将任意数据写入数据库,然后由应用程序在getDomains方法中使用executeQuery检索这些数据,该方法位于daas-springboot-checkMarxIntegration\src\main\java\com\it\daas\apis\service\PostgresConnectionServiceImpl.java的第678行。然后,这些数据流过代码,直到它不经处理直接在SQL查询中使用,然后提交给数据库服务器执行

这是我的功能

    @Override
public String getDomains() throws SQLException {

    String domainquery = "SELECT id,domain FROM domain";
    Connection con = null;
    PreparedStatement st = null;
    ResultSet result = null;
    try
    {
        con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
        con.setSchema(this.schema);
        st = con.prepareStatement(domainquery);
        result = st.executeQuery();

        ArrayList<DatabaseDomainBean> list = new ArrayList<DatabaseDomainBean>();
        while (result.next()) {
            list.add(new DatabaseDomainBean(result.getString("domain"), result.getString("id")));
        }
        return new JSONObject().put("domainlist", list).toString();


    }
    catch(Exception e)
    {

        e.printStackTrace();
        return null;
    }
    finally{

        result.close();
        st.close();
        con.close();

    }


}

@Override
public String CreateDatabaseAndMapToDomain(String database, String[] domainIds, String password)
        throws SQLException {

    if (!this.apibuilderPassword.equals(password)) {
        return null;
    }
    else if(database==null || domainIds==null || password ==null)
    {
        return "Failure";
    }


    Connection con =null;
    PreparedStatement st =null;
    ResultSet ispresent =null;
    PreparedStatement mapquerystmnt =null;
    ResultSet resultMapping = null;

    try
    {
        con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
        con.setSchema(this.schema);

        for (int i = 0; i < domainIds.length; i++) {

            con.setSchema(this.schema);

            String IfExists = MessageFormat.format(
                    "SELECT databasename,domainid FROM Databases WHERE databasename IN (?) AND domainid IN (?)",
                    Utilitymethods.ConvertToMessageFormatCompatibleForm(database),
                    Utilitymethods.ConvertToMessageFormatCompatibleForm(domainIds[i]));

            st = con.prepareStatement(IfExists);
            st.setString(1, database);
            st.setInt(2, Integer.parseInt(domainIds[i]));
            ispresent = st.executeQuery();

            if (!ispresent.next()) {
                // INSERT INTO Databases (databasename,domainid) VALUES ('Teradata','1')
                String mapquery = MessageFormat.format(
                        "INSERT INTO Databases (databasename,domainid) VALUES (?,?) returning Id",
                        Utilitymethods.ConvertToMessageFormatCompatibleForm(database),
                        Utilitymethods.ConvertToMessageFormatCompatibleForm(domainIds[i]));
                 mapquerystmnt = con.prepareStatement(mapquery);
                 mapquerystmnt.setString(1, database);
                 mapquerystmnt.setInt(2, Integer.parseInt(domainIds[i]));
                 resultMapping =  mapquerystmnt.executeQuery();
            }

        }

        return "Success";

    }
    catch(Exception e)
    {
        e.printStackTrace();
        return "Failure";

    }
    finally
    {

        ispresent.close();
        st.close();
        resultMapping.close();
        mapquerystmnt.close();
        con.close();
    }





}


@Override
public String getDomains() throws SQLException {

    String domainquery = "SELECT id,domain FROM domain";
    Connection con = null;
    PreparedStatement st = null;
    ResultSet result = null;
    try
    {
        con = ConnectToPostgresapibuilderDatabase(apibuilderConnectionString, apibuilderUserName,apibuilderPassword);
        con.setSchema(this.schema);
        st = con.prepareStatement(domainquery);
        result = st.executeQuery();

        ArrayList<DatabaseDomainBean> list = new ArrayList<DatabaseDomainBean>();
        while (result.next()) {
            list.add(new DatabaseDomainBean(result.getString("domain"), result.getString("id")));
        }
        return new JSONObject().put("domainlist", list).toString();


    }
    catch(Exception e)
    {

        e.printStackTrace();
        return null;
    }
    finally{

        result.close();
        st.close();
        con.close();

    }


}

共有1个答案

严锐
2023-03-14

直接使用st=con.prepareStatement(“select id,domain FROM domain”)尝试。由于字符串domainquery=“select id,domain FROM domain”语句和sql注入的可能性,checkmarx看起来很困惑。

 类似资料:
  • 问题内容: 插入数据库时​​出现错误。 代码: 忽略dbquery,与mysql_query完全一样。 我收到的错误是: 不知道为什么会引发此错误! 问题答案: 教一个人如何钓鱼。 如果查询失败,那么您应该做的第一件事就是回显您要发送的查询: 通常,最终查询到底出了什么问题,这是很明显的。要特别注意查询中的动态内容,通常要注意MySQL抱怨的区域。 如果看起来还可以,那么您会寻找可能需要转义的单词

  • 请查看与您的MySQL server版本相对应的手册,以便在

  • 我正在做一些webpenting练习,有一个任务说我需要通过使用SQL注入来创建一个具有这个名称和这个密码的新帐户。在网页上有一个文本输入用户名和另一个文本输入“密码”。我可以在用户名文本输入中输入任何我想要的字符,但在密码文本输入中,我需要键入一个特定的注入。 我知道我需要注入insert查询,但问题是我不知道表名。为了插入一个新用户,我需要知道表名,所以我想知道如何才能使web显示一个带有ta

  • 我正在用注入一个依赖于ViewModel中的的类,该模块安装在中,作用域为activity,每当我尝试编译时,它都会向我抛出一个错误。供您参考,我还有其他模块,其中ActivityRetainedComponent和SingletonComponent注入了@ApplicationContext。 现在我想弄清楚这个错误是什么意思。 代码在这里(我不认为这里有什么问题) 编辑2:我得出的结论是不可

  • 我想提高对可能存在的SQL注入攻击的了解。我知道参数化完全避免了SQL注入风险,因此应该在任何地方应用。然而,当有人问我如何利用它时,我想得到一个答案。 我知道基本的SQL注入攻击是如何工作的。例如,一个网站有一个页面<代码>网站。com/users/{id}其中id是用户的主键。如果我们完全信任输入,只需将id参数传递给正在执行的查询,这可能会产生可怕的后果。如果是网站。com/users/1查