
CVE-2024-57521の静的コード監査。RuoYi-Vueのジェネレータモジュールにおける認証済みSQLインジェクションで、ソースからシンクへの分析と%0bフィルタバイパスPoCを含む。
本リポジトリはセキュリティ研究および教育目的でのみ使用されます。本文書の技術を未授权の攻撃行為に利用しないでください。すべてのテストはローカルの静的コード監査環境で完了しています。
ruoyi-generator モジュール)ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java重要コード:
@PostMapping("/createTable")
public AjaxResult createTableSave(@RequestParam("sql") String sql, @RequestParam("tplWebType") String tplWebType)
{
try
{
SqlUtil.filterKeyword(sql); // 在进入业务前调用过滤器
分析:バックエンド管理者はHTTP POSTリクエストのsqlパラメータを通じて任意のデータベーステーブル作成文を渡すことができます。入口点ではユーザー入力に対する十分な制限が行われておらず、直接後続のフィルター処理に渡されます。
スクリーンショット証拠:

· ファイル位置:ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
核心欠陥コード:
// 第16行:黑名单定义,注意关键词带有【尾随空格】
public static String SQL_REGEX = "\u0008|%0A|and |extractvalue|updatexml|sleep|information_schema|exec...";
// 第61-66行:过滤逻辑
String normalizedValue = value.replaceAll("\\p{Z}|\\s", ""); // 先清空了输入里的所有空格
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(normalizedValue, sqlKeyword) > -1)
{
throw new UtilException("请求参数包含敏感关键词" + sqlKeyword + ",可能存在安全风险");
}
}
欠陥分析:フィルターはまず replaceAll("\p{Z}|\s", "") を実行し、入力内のすべての空白文字を削除します。しかし、ブラックリスト SQL_REGEX 内のキーワード(例:"and "、"select ")には末尾にスペースが付いています。これによりマッチングが必然的に失敗し、攻撃者がキーワードの後に %0b(垂直タブ)をスペースの代わりに使用するだけで、ブラックリストチェックを完全にバイパスできます。
スクリーンショット証拠:
· ファイル位置:ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
重要コード:
<update id="createTable">
${sql}
</update>
分析:MyBatis の ${} は安全なプリコンパイル #{} ではなく、文字列を直接連結します。これにより、フィルターをバイパスした悪意のあるSQLがデータベースに送られ実行されます。これは典型的な「ブラックリストフィルタリング + 安全でない連結」の組み合わせ脆弱性です。
スクリーンショット証拠:
· 方法:攻撃者は %0b(MySQL の垂直タブ、\s のマッチング範囲に含まれる)を SQL 文内のスペースの代わりに使用します。
· 検出原理:IF(<条件>, 1, 1/0) をブラインドSQLインジェクションの検出器として使用します。 · 条件が偽:ゼロ除算エラーが発生し、サーバーは HTTP 500 を返します。 · 条件が真:正常でエラーなし。 · 抽出方法:二分法を使用してデータベースデータをビット単位で推測できます。
この脆弱性は、典型的な「不完全な修正」によるバイパスです。開発者は以前の同種のSQLインジェクションを修正する際にブラックリスト機構を導入しましたが、ブラックリストがスペースに依存していることを見落とし、スペースを削除する前処理ロジックがブラックリストのマッチング条件を破壊し、最終的に新たなバイパス(CVE-2024-57521)を引き起こしました。
· ブラックリスト機構の廃止:ブラックリストに依存せず、ホワイトリスト機構こそが安全の基盤です。 · プリコンパイルの使用:MyBatis の ${sql} を #{} プリコンパイル方式に変更します。動的にSQLを渡す必要がある場合(テーブル作成、Order Byなど)、厳格な抽象構文木(AST)解析または厳格なパラメータ検証を使用すべきです。 · フィルターの改善:ブラックリストを使用する必要がある場合、ブラックリストキーワードの末尾スペースを除去し、比較前に統一的な正規化(小文字への統一、%0b などをスペースに置換)を行う必要があります。
· NVD - CVE-2024-57521 · RuoYi-Vue Gitee リポジトリ