数日前、githubが報奨金プログラムを開始しました。 4時間、訪問後にこのようなURLを作成し、githubアカウントとリポジトリにアクセスしました。 方法を知りたいですか?
まず、Github OAuthをチェックアウトしました。
バグ1. /../でredirect_uri検証をバイパスする
簡単です-前のパスを上書きするために/path1/../path2を送信できます(パストラバーサル)。
バグ2.トークンを受信するとき、redirect_uri検証はありません。
最初のバグ自体の費用はかかりません。 OAuth2には、リリースされた各コードに対応するリダイレクトが存在するという保護が組み込まれています。コードをトークンと交換するときは、最初に使用したものと同じURIを指定する必要があります。 簡単に言えば、サイト/コールバックのコードが返された場合、トークンを受信するには、サイト/コールバックを送信する必要があります。
奇妙なことに、githubはチェックを誤って実装しました。 /path1/../path2のコードを発行して、/ path1で使用できます。 つまり、リファラーを介してリークされたコードは、実際のコールバックに対しても有効なままでした。 これらの2つのバグの助けを借りて、Githubを介したログイン機能を使用して、サイトのリファラーを介してコードをマージできます。 同様のバグがvk.comにありました。
バグ3。歴史上の写真。
公式のgithubクライアント-Education、Pages、Speakerdeck、Gistを見始めました。 最初の2つは実際にはOAuthを使用せず、3つ目は報奨金プログラムに参加しませんでしたが、ヒストグラムは非常に適切でした。 彼は「事前承認済み」クライアントでした。つまり、デフォルトではすべてのユーザーにインストールされます。
しかし、あなたはただ挿入することができませんでした
githubのCamoプロキシがこれをローカルURLに置き換え、リファラーがサーバーにリークしないためです。 この保護を回避するために、かなり新しいトリックを使用しました。
///host.comはRubyを含むすべてのサーバーライブラリによってパスとして解析されますが、ブラウザーはそれをホストとして解析し、 github.com /// host.comではなくhost.comを読み込みます
URLエクスプロイトは次のようになります。
github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&redirect_uri= https%3A%2F%2Fgist.github.com%2Fauth%2Fgithub%2Fcallback/../../../homakov/8820324 &response_type=code
ユーザーがこのアドレスを読み込むとすぐに、githubは自動的に私のサーバーに画像とともに私の要点にリダイレクトします:
場所: gist.github.com/auth/github/callback/../../../homakov / 8820324?code=CODE
ブラウザはgist.github.com/homakov/8820324?code=CODEをダウンロードします
そして、ここで、私たちの写真を要求するとき、彼はリファラーをマージします。
犠牲者のCODEを取得したら、 gist.github.com / auth / github / callback?code = CODEを開くことができます。 私たちは、histoで被害者としてログインし、彼のプライベートhistoにアクセスできます。
バグ4.トークンはクッキーに保存されます。
これはOAuthのアンチパターンです。トークンをブラウザに保存/表示しないことを強くお勧めしますが、要点はトークンをセッションレールに保存します。 私たちが知っているように、これは単にbase64でエンコードおよび署名されたCookieです。
ここにあります-github_token。 これで、histのサイトをバイパスして、直接リクエストを行うことができます。 しかし、トークンにはscope = gistsがあり、gist以外は何も読むことができません。 しかし...
バグ5.公式顧客のスコープの自動承認。
最後の仕上げ。 要旨はGitHubの公式クライアントであるため、「これらのスコープを承認」ダイアログは表示されず、GitHubが自動的に承認を行います。 だから私はちょうど送ることができます
github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&
redirect_uri=https%3A%2F%2Fgist.github.com%2Fauth%2Fgithub%2Fcallback/../../../homakov/8820324&
response_type=code&
scope=repo,gists,user,delete_repo,notifications
次に、マージされたCODEを使用して被害者のアカウントにログインします。Cookieを読み取り、そこからgithub_tokenを取得します。ここで、ユーザーに完全に見えないようにAPI呼び出しを行うことができます。 ステルスmodは痕跡のない一種の犯罪です。
報酬は4,000ドルでした。
一般的に、例えば、私は仕事ができます。