非常に多くのWeb開発者は、このハッキング方法の存在を忘れており、一部のWeb開発者はそれを知らないことさえあります。
残念ながら、このような脆弱性は、HabraHabrのような大規模システムでも見られます。
それがすべて始まった方法
それはすべて、私の意見では完全に正常なコメントのために、私のカルマがすぐに-16ユニットにリークされたという事実から始まりました。 私はこのリソースに登録して、誰もが興味のあるトピックを書いたので気分が悪くなりましたが、今はできません。
私はテープに目を通し、トピックに目を通し、すぐに評価を得て栄光の光を放つ作者にとってそれがどれほど良いかについて考えました。 希望なしに、私は矢印に突っついてトピックにプラス記号を付けました。 推測するのは難しいことではないので、「あなたのカルマは投票するのに十分ではありません」というようなエラーを受け取りました。
脆弱性を探す
ページが更新されていないことにすぐに気付きました。つまり、AJAXが使用されています。
あまり知られていないCSRF、またはXSRFの脆弱性とも呼ばれるCSRFをすぐに思い出しました。
リクエストが送信される場所と方法をFireBugで確認し始めました。 まず第一に、成績(賛成または反対)、記録のタイプ(トピック)、およびIDのみが送信されたことは恥ずかしかったです。 ハッシュやトークンなどの追加フィールドは渡されませんでした。
それほど単純ではない
せっかちな読者は、私がすべての穴に明白な初歩的なものを見つけたとすでに決めているのでしょうか? どんなに! リクエストを偽造しようとする私の試みはすべて、同じことをもたらしました。
最初は、どこかで間違えたと思いました。 しかし、いいえ、正しいアドレスにリクエストを送信し、すべてのパラメーターを正しい方法で渡しました。 しかし、HabraHabrスクリプトがこれを行うと、応答ステータス200を受け取り、私は404でした。
私はHTTPヘッダーを注意深くチェックし始めましたが、ここで目に留まりました。
私のリクエストになかったこの奇妙なタイトルは何ですか?
少しグーグルで、AJAX'e、およびフォームから要求された場合、それ自体では送信されない場合、このヘッダーはデフォルトで送信されることがわかりました。
AJAXリクエストを作成できませんでした。 Habrは他のドメインにあり、ブラウザは私をそこに入れません。 そして、私はずっと前に放棄したFlashPlayerについて思い出しました。 すばやくグーグルで、私は歓声を上げました !
はい、多くの人に愛されているこのブラウザアドオンは、次の場合に任意のドメインにリクエストを送信できます。このドメインのルートに有効なcrossdomain.xmlファイルがある場合。
あなたは運命を信じますか? しません。 しかし、HabrHabrのルートでこの大切なファイルを見つけたときはショックを受けました。これにより、どのドメインからでも 80番目のポートにリクエストを送信できました。
エクスプロイトを作成します
ActionScriptバージョン2を選択した理由は、最初によく知っていたからです。2番目に、古いFlashPlayerのユーザーを同行することができるためです(バージョン7以降)。
var req:LoadVars = new LoadVars(); req.addRequestHeader("X-Requested-With","XMLHttpRequest"); req.addRequestHeader("Referer","http://habrahabr.ru/"); // req.decode("ti=666&tt=2&v=1"); // 666 id req.send("http://habrahabr.ru/json/vote/", "_blank", "POST");
エクスプロイトをどうするか?
すべて、今では小さなものです。 独自のWebサイトがある場合は、ためらうことなくそこにコードをアップロードし、iframeに入れます。
ウェブサイトを持っていない場合、Profitとの契約を考えると、大規模なVKアプリケーションの所有者に同意し、そのコードを記入します。 ユーザーの50%のカバレッジが保証されます。
これで、ユーザーがトピックに以前に投票しなかった場合、知らないうちに+になります。
さらに、トピックだけでなく、コメント、質問、カルマにも投票できます!
記念品として
サイトの破壊はあまり良くありません。 このため、彼らは後部座席でata-ta-taを行うことができます。
この脆弱性の場合、私はすぐにサポートサービスに手紙を書き、脆弱性は閉じられました(crossdomain.xmlを修正)。