============================================
摘要:
本文將分析瀏覽器與丁丁小站之間HTTP通訊協定的互動,並且嘗試提出如何
最精簡的透過程式(機器人)來模擬瀏覽器的行為以達到自動登入的功能。
本文有四個段落
1.前言
2.如何登入YAHOO
3.如何登入WRETCH (雅虎字典:可恥的人)
4.心得與結論
============================================
1.前言
上次寫有關HTTP的CODE已經是兩年前
那時是為了要寫專題
要登入中華電信的網頁去寄簡訊.............
而這次會想要研究怎麼寫機器人登入丁丁
動機之一是不爽某丁丁大站要停止讓使用者使用網誌備份的功能
動機之二是前一陣子在學JAVA,想說就用JAVA寫點程式看看好了
不然只是看書而不去實做,似乎永遠學不會JAVA
(事實證明,寫了這隻程式,我還是不會寫JAVA.......)
2.如何登入YAHOO
首先我要聲明,我沒有很討厭雅虎
雖然我覺得他的蒐尋引擎很不順手........(但是知識家真的還不錯用)
對於如何登入雅虎,我的想法其實很簡單:
a.先分析瀏覽器與雅虎的互動
b.用程式模擬
在a.這一步所會遭遇到的最大問題是工具的選用
最直覺的首選當然是赫赫有名的WIRESHARK
不過我們必須考慮到一個嚴重的問題
那就是[現在的網站早就改用HTTPS了!!!]
也就是說,即便用WIRESHARK可以抓到瀏覽器的封包也看不懂裡面的內容
這個時候,可以考慮的工具直覺想的到的只剩下瀏覽器的外掛
因此我毫不猶豫的選擇了FF當作瀏覽器的平台
並且在其ADD-ONS的搜尋頁面輸入關鍵字HTTP
找到了許多不錯的套件:
Live HTTP Headers
HttpFox
接下來需要做的事情就是就是封包的捕捉
首先把該關的頁面都關一關
然後開始抓封包
-->連到雅虎首頁
-->點選登入
-->在瀏覽器裡面輸入帳號密碼按下ENTER
-->最後瀏覽器會呈現雅虎的首頁
其實我們如果在雅虎的首頁將滑鼠移到[登入]這個超連結上方
我們可以在瀏覽器的下方看到一串網址
而點選了這個超連結後,其實也是經過一連串的跳轉才連到登入的頁面
而登入的頁面常常會長得像下面那樣,在問號後帶有許多其實可以省略的參數
https://login.yahoo.com/config/login?.intl=tw&.pd.........
透過上述的觀察
我們可以試著簡化上面的步驟,程式可以這樣寫:
a.GET這一個PAGE (https://login.yahoo.com/config/login)
b.POST帳號密碼到上面那一個PAGE,取得具有登入權限的COOKIE
在步驟a.當中,我們會遇到兩個程式上的問題
第一個是如何建立SSL的連線
第二個是如何發送HTTP GET的封包
我的寫法如下:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Socket socket = SSLSocketFactory.getDefault().createSocket(TARGET_HTTPS_SERVER, TARGET_HTTPS_PORT);
Writer out = new OutputStreamWriter(socket.getOutputStream(), "ASCII");
out.write("GET /config/login HTTP/1.1\r\n");
out.write("Host: " + TARGET_HTTPS_SERVER + "\r\n");
out.write("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)\r\n");
out.write("\r\n");
out.flush();
//這裡要放CODE抓COOKIE
out.close();
socket.close();
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我使用javax.net.ssl.SSLSocketFactory提供的函式來建立SSL的SOCKET
而在JAVA裡面SOCKET已經夠簡單了
所以我並沒有採用HTTP相關的寫法
(事實上,在此就算要用HTTP相關的寫法也要使用有支援SSL才行)
我們可以注意到兩件事情:
HTTP GET的封包必須填入的參數其實只要有
User-Agent: Mozilla/5.0.... 就足夠了
另外,我們可以在SERVER回應的HTTP HEADER裡面
發現有一個欄位是Set-Cookie: B=ooxx....
我們必須將它存取下來,至於其他的Cookie都可以不要理會
在步驟b.當中,我們必須發送出HTTP POST的封包
裡面必須包含了:
(i) 剛剛存放的COOKIE B
(ii) 我們要送出的POST的內容
前者必須放在[Cookie的欄位];後者透過瀏覽器的外掛可以得到格式為:
.tries=1&.src=&.md5=&.hash=&.js=&.last=&promo=...........
但是經過化簡,我們所送出的字串只要有以下的參數就夠了:
login=帳號&passwd=密碼&.save=Sign+In
而發送HTTP POST的封包時,需要特別注意的是
Content-Length 這一個欄位,這個欄位必須填入POST的字串的長度
否則雅虎不會對你的訊息做處理
而在順利送出HTTP POST後
雅虎將會給你許多COOKIE,其中需要抓起來的是:
B、YLS、F、Y、PH、T、SSL
而到目前為止,我們已經完成了登入雅虎的步驟了
接著我們可以使用HTTP GET去取得: http://my.yahoo.com/
這一個頁面,當然,我們必須附上剛剛得到的那些COOKIE
(可能不用全附,此處我沒有再化簡)
而由於我們當初登入時,並沒有給定除了帳號密碼外的參數
而且我們發送的封包常常偷工減料,並沒有包含語系等等資訊
因此我們GET的結果會得到一個英文版的MY YAHOO的首頁
登入雅虎的工作,就研究到這裡
至於存取雅虎信箱等等,就有空再說了
3.如何登入WRETCH (雅虎字典:可恥的人)
在登入雅虎以後
表面上似乎登入丁丁應該會沒有什麼問題
[雅虎丁丁不是已經整在一起了?]
[用剛剛登入雅虎的COOKIE應該就可以存取丁丁了吧?]
=.. ="
別傻了,他們是兩個不同的帳密系統啊~~~~~~
有了登入雅虎的經驗後
要研究怎麼登入丁丁就快速多了
做法還是一樣-->瀏覽器抓封包-->用程式模仿瀏覽器的行為
但是抓封包的結果卻會讓人沮喪
因為有點小複雜......根本就是跳轉地獄
儘管如此,我還是大致上實做出了仿瀏覽器行為的機器人
並且成功登入了丁丁 (這是做苦工啊~有興趣的人可以玩玩看)
以下我將直接介紹精簡過後的登入流程給大家
a.先登入雅虎,得到許多具有登入權限的COOKIE
這一步驟應該不用說明
b.進入丁丁的頁面,取得一組COOKIE(PHPSESSID與BX與lang)
例如,進入http://www.wretch.cc/blog/XXXXX 這個頁面
進入頁面後,就可以得到前兩個COOKIE以及後者(當然,值會是zh-tw)
c.進入YAHOO提供的validate頁面,試著取得由YAHOO提供的驗證碼
請使用HTTPS連線,連到 https://login.yahoo.com/config/validate? 這一個頁面
參數為以下的格式:
.src=wrtch&.pc=1164&.done=http://www.wretch.cc/IDintegration/
連線的方法請用GET,並且附上具有雅虎登入權限的COOKIE
GET成功後,會得到一個頁面
該頁面內含JAVASCRIPT,意思是希望瀏覽器跳轉到某個URL網址
該網址格式為:
http://www.wretch.cc/IDintegration/?.data=LnlpZCUzZFp............
參數data後面非常非常的長...
我把那串data稱作驗證碼
d.用驗證碼登入丁丁,之後就可以用之前得到的三個COOKIE進行會員的操作
最後的步驟就是GET那串網址
並且同時送出PHPSESSID與BX與lang(=zh-tw)
這樣就完成了登入丁丁的程序
之後就可以透過PHPSESSID與BX與lang以行使會員權限
4.心得與結論
網路上好像很少有登入丁丁相關的機器人資料
原因之一可能是自從使用HTTPS連線以後,大家就對網頁機器人興趣大幅降低(其實沒差啊)
原因之二可能是......會寫的人,都把程式寫成具有商業價值的軟體了(密碼破解器??)
原因之三可能是...............
分析一下登入丁丁的過程
可以得知用戶端登入雅虎的通訊過程幾乎都是HTTPS
所以帳號密碼都可以確保不會輕易被第三者得知
但是在登入丁丁的最後一個步驟
卻是使用HTTP連線去GET某個網址
似乎可能會有安全性問題
例如我在你旁邊開WIRESHARK,雖然我還是不知道你的帳號密碼
可是只要我知道你最後GET的網址是什麼
我也可以透過GET那個網址取得和你一樣的登入權限
其實這個也不是問題,除非做到使用者與伺服器之間有關會員操作的連線完全使用HTTPS
不然,其實兩者之間的通訊大都是不安全的
不過比較糟糕的是,經過測試
即便使用者登出丁丁後,在旁邊的第三者如果偷存有當初使用者登入丁丁的驗證網址
第三者仍然可以在幾分鐘之內(沒有準確的測試)
透過當初偷存的丁丁驗證網址[登入]丁丁... ..... .....
結論:
1.網路大致上是不安全的
2.丁丁不開放備份網誌讓人感到很丁丁
我強烈鼓吹大家透過登入丁丁的技術來寫一些應用程式如[登入版丁丁網誌搬家器]
(因為牽涉到要請使用者輸入帳號密碼,所以可能程式要OPEN SOURCE會比較好??)
3.雖然理論上,透過丁丁登入機器人,應該是可以實做出暴力版的帳密破解器
不過還是不建議大家這樣做,除了可能有犯法疑慮外,這個方法也太笨了點.........
4.哪天如果PIXNET也不提供匯出匯入備份功能... .......
可能會出現一篇 [心得] 使用機器人登入PIXNET .....
5.科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科科END