? 做爬蟲的小伙伴們肯定都深有體會,爬蟲要是遇到驗證碼了基本上就是GG了。于是爬蟲工作者和驗證碼之間必有一戰(zhàn)。隨著web安全技術(shù)的提升,驗證碼也一代一代的革新,并且越發(fā)的變態(tài)。小曾也去研究了各式樣的驗證碼,最后決定拿出58手勢驗證碼和大家分享。
分析概述
? ? 首先我對58手勢驗證碼做一個總體的描述。從觸發(fā)驗證碼到驗證成功,我們操作的背后需要向服務(wù)器發(fā)送6個請求,并且還有一次js算法對參數(shù)加密。6個請求之間有著依賴關(guān)系,操作圖如下:
? ? 6個請求中有些請求還會存在時效性,也就是做時間過久之后該請求就會失效,請求返回的參數(shù)就需要重新獲取。
? ? 驗證碼圖片的url在請求4的返回值中,請求4的請求參數(shù)需要從請求2中獲取。
? ? js加密部分屬于AES加密,需要的參數(shù)是滑動軌跡的數(shù)據(jù)和請求3獲取token值。
? ? 請求6是驗證的最后一步,需要2,4請求返回的參數(shù)以及js加密后的參數(shù),如果軌跡數(shù)據(jù)和58服務(wù)器端數(shù)據(jù)一致則驗證成功,會返回一個success_token值。
具體過程
請求1.
該請求是驗證碼的入口,相關(guān)參數(shù)用于標(biāo)識你驗證的是該處驗證碼而不是其他處。
url:
https://callback.58.com/firewall/verifycode?serialId=d22d6f319b5148ae8a199a4b574dd8b4_7daf4f969cac4852a2fbbfb2e275bbcd&code=22&sign=26dbf4d672a5d9691e63e40bb02910d0&namespace=ershoufanglistphp&url=https%3A%2F%2Fwh.58.com%2Fershoufang%2F&tdsourcetag=s_pcqq_aiomsg&qq-pf-to=pcqq.group
請求2.
url:
https://callback.58.com/firewall/codev2/getsession.do?1552704552771
請求方式:post
參數(shù):1552704552771為時間戳
post內(nèi)容:
serialId=d22d6f319b5148ae8a199a4b574dd8b4_7daf4f969cac4852a2fbbfb2e275bbcd
&code=22
&sign=26dbf4d672a5d9691e63e40bb02910d0
第二個請求返回值如下:
請求3.
獲取加密時的所需的一個token參數(shù)
url:
https://cdata.58.com/fpToken?callback=dpjsonp_014459113626603415
返回值如下:
請求4.
url:
https://verifycode.58.com/captcha/getV3?callback=jQuery11010788698968164369_1552706578792&showType=win&sessionId=c511de755a684fcd96d8ce9af1c3b8d4&_=1552706578793
url中的sessionID便是第二鏈接返回值的sessionId值
該請求是為了返回獲取 captcha圖片的url和一個比較重要的參數(shù)responseId
返回值如下:
請求5.
獲取captcha驗證碼的圖片
https://verifycode.58.com/captcha/captcha_img?rid=fe8717a931e54d148bd01672c4e7ed1b&it=_big
該請求獲取只能返回一次,多次返回?zé)o圖片顯示。
js加密部分
搜索關(guān)鍵字: AESEncryption
需要的參數(shù)是滑動軌跡的數(shù)據(jù)和請求3獲取token值。
加密函數(shù)部分如圖:
下圖是鼠標(biāo)軌跡數(shù)據(jù):
下圖是AES加密后的數(shù)據(jù):
請求6.
最后一個鏈接,驗證滑動驗證碼是否成功:
Url如下:
https://verifycode.58.com/captcha/checkV3?
callback=jQuery110102771457823954544_1552707202602&
responseId=df3b891c0a6848cb9ede1e904e752988
&sessionId=761d8548ab34405eb5e6f555a44710ee
&data=
&_=1552707202604
Url中存在5個參數(shù)分別如下:
callback: 返回數(shù)據(jù)名稱;
responseId:第四個請求中的responseId
sessionId:第二個請求中的sessionId
Data:js加密生成的p值(js核心)
_:時間戳
驗證成功便會獲取success_token。
總結(jié):
? ? 如果我們想要去破解58手勢驗證碼,就需要模擬上述6個請求加一個JS加密的過程。模擬請求本就是爬蟲選手們的工作,js加密的部分也是很容易就可以實現(xiàn)的。破解58手勢驗證碼的難點是用編程語言及相關(guān)工具來獲取圖片中的軌跡數(shù)據(jù)。