初心者向けエクスプロイトでChess.comをハックした方法
(skii.dev)Chess.comでのXSS発見
- チェスを趣味として楽しみつつ技術で遊んでいるうちに、Chess.comでXSS脆弱性を発見した。
- Chess.comは1億人以上の会員を抱える、インターネット上で最大級のチェスサイトである。
概要
- 2023年初頭にChess.comで頻繁に遊び始めた。
- 友人をサイトに登録させ、友だち機能を使ってすぐに友だちになった。
- MySpaceワームのような方法で自動友だち追加が可能か気になった。
- 新しいアカウントを作成し、開発者ツールのネットワークタブを確認して自動友だち追加URLを発見した。
中盤
- TinyMCEリッチテキストエディタを使ってXSSを試した。
- Burpプロキシを使い、
About説明に直接HTMLコードを挿入した。 - TinyMCEの設定を確認し、
background-imageスタイル属性を使ってXSSペイロードを作成した。 - 複数の記号をテストし、XSSを実行する方法を突き止めた。
- 最終的にCookieとJavaScriptオブジェクトを抽出できる方法を開発した。
終盤
- XSSを完全に実行するために取り組んだ。
srcset属性を使って、より広いJS構文を使える新しい方法を見つけた。- Base64エンコードを使ってXSSペイロードを直接実行した。
- TinyMCEエディタはサイト全体で使われており、影響は大きい。
分析
- 脆弱性の根本原因は画像の再アップロード機能である。
- Chess.comのドメイン名を含めることで、画像ホスティング検査を回避できる。
- リッチテキストエディタはさまざまなHTML要素を許可しているため、XSSを達成するのに適している。
- TinyMCEは最新の状態だったが、最終HTMLに対するサニタイズ処理が欠けていた。
- Chess.comはユーザーに表示される最終HTMLに対してサニタイズ処理を行うべきである。
GN⁺の意見:
- このブログ記事は、Chess.comのような大規模オンラインプラットフォームで発生しうるセキュリティ脆弱性を発見し、報告する過程を興味深く説明している。
- XSS脆弱性はWebサイトのセキュリティに深刻な脅威となりうるため、こうした脆弱性を見つけて修正することは、Webサイト利用者の個人情報保護において非常に重要である。
- この記事は、ソフトウェア開発者やセキュリティ専門家に対し、リッチテキストエディタのようなWebアプリケーション構成要素の脆弱性を認識し、それを防ぐ重要性を強調している。
1件のコメント
Hacker News のコメント
OPです。好意的なコメントを本当にありがとうございます。少し背景を説明すると、私は英国で A-Levels の準備をしている17歳の学生で、どの大学に行くかと degree apprenticeship の選択肢についてまだ考えています
GitHub プロフィールはこちらで見られます -> https://github.com/Jayy001
私は HashPals のコアメンバーの一人で、Search-That-Hash を作り、ReMarkable タブレット向け無料ソフトウェアのオープンソースリポジトリのメンテナーでもあります
もっと話したければ連絡してもらって構いません。メールはプロフィールの説明にあります
それと IT に進むなら、契約交渉とファイナンス も必ず学ぶとよいです
インターネット経験といえば Chess.com で「ボランティア司書」として毎回負けることくらいだった頃、リアルタイムの Chess.com の対局に、ぎこちなくエスケープした文字、閉じタグ、よくある制御文字列、さらには OLE オブジェクト まで注入していたことがあります
創業者の Eric がより正式な監査を丁寧に依頼してくれたのですが、11歳のスクリプトキディだと明かしたくなかったので断りました。代わりにチャットルームの検閲に必要な正規表現を説明し、非同期環境で不正行為をどう検出するかという、より大きな問題にも一緒に取り組みました
悩んだ末、可能な唯一の方法は、対局上重要な高価値の手をすべてエンジンの既知の最善手と比較し、統計的推論で実力のある人間と不正行為者を区別することだと伝えました
もちろん当時としては途方もなく実現不可能な方法で、結論もそうなりました。それでも、小学校を出たばかりの子どもが本物のウェブマスターとそんな微妙なテーマを議論したというのは、かなり良いインターネットの思い出として残っています
「この機能が2005年ごろの MySpace ワームを思い出させたなんて、私はその頃まだ生まれてもいませんでした!」という部分で、毎日年を取っているのを実感しました
ユーザーにサイトへ HTMLを入れさせる ことに固執していたのが、とんでもない問題でした。今なら HTML 入力をきちんとパースして禁止された属性やタグを取り除くでしょうが、当時は正規表現の狂気で処理していました
関係あるかは分かりませんが、Chess.com の対局で他人が 私の手を代わりに指す のを実際に見たことがあり、録画までしたことがあります。進行中の対局が私のところに表示され、本来指せないはずの状況で手を指せたこともありました
ググると関連スレッドもかなりあります。Chess.com がここ数カ月で修正したかどうかは分かりませんが、私が報告しようとしたときは聞く耳を持ってくれませんでした
これらの対局はすべて、サイトにログインしていない状態で起きました。ログイン中には経験したことはありませんが、チェスは血圧に良くないので、頻繁にはやっていません
タイトルだけ見たときは、もっと初歩的な内容だと思っていましたが、実際には複数段階の 入力検証 を巧妙な迂回で突破するエクスプロイトを作っていました。基本ドメインのように見せるためにサブドメインまで設定しています
これが通るとは予想しておらず、それ自体も興味深かったです。ドメインを正規表現でパースするのがどれほど複雑かを考えると、見落としやすそうでもあります。あるいは単に変数内で
'...'をチェックするようなものだったのかもしれませんが著者は自分の分野をよく分かっています。このレベルの技術のためにどれだけ長く掘り下げてきたのか、感心します。かなり面白いキャリアになりそうです
良い記事です、OP。ハッキングの旅も順調に続くことを願っています。もしまだ知らなければ、
alert(1)のようなペイロードで括弧がフィルタされたりエンコードされたりするときは、バッククォートを使ってalert\1`` を試せますJavaScript インジェクションを一段引き上げたいなら、Brute Logic の XSS チートシートと Gareth Heyes の Javascript for Hackers が良い資料です。クロスサイトスクリプティング を軽く見る人もいますが、今でも非常に強力で広く存在しています。特に plugin-baby が指摘したように、セッション Cookie に HttpOnly が付いていない場合はなおさらです
とても素晴らしいです。バグバウンティの分析記事、とくに XSS の記事を見るのが好きです。いつも見つけるのが簡単そうに見えますが、それは確証バイアスにすぎず、実際には成果のないテストや脇道に費やした時間が私には見えていないのでしょう
「この機能が2005年ごろの MySpace ワームを思い出させたなんて、私はその頃まだ生まれてもいませんでした!」という部分で、すぐに年を取った気分になりました
この事件について OP に聞きたいのは、どうやって知ったのかということです。Darknet Diaries でしたか、それとも別の経路でしたか?
リッチテキストエディタを「聖杯」と呼んでいた部分が面白いです。Chess.com は大きなウェブサイトですが、古いフォーラムのような場所でそういうエディタや過度に派手な機能を見るたびに、そのサイトは 穴だらけ なのではないかと思ってしまいます。いずれにせよ素晴らしい記事です
「バグバウンティ報告とレビューの最中、私が再現しようとしたところ、開発者たちがブロックを実装しようとして、次のエラーメッセージが表示された…」という部分は、バグバウンティプログラム の趣旨からは離れているように見えます