天天看點

百度登入加密協定分析(上)

  本周又和大家見面了,沒什麼特殊情況,一般是一周一篇原創。釋出的時間基本上是在周末,平時還是比較忙碌的。最近在開發自己的部落格,過段時間可以和大家分享開發部落格中的技術點。如果大家想及時的和我交流的話,可以關注文章最後的微信公衆号,這樣我可以比較及時的知道大家的想法。(我的新書《Python爬蟲開發與項目實戰》出版了,大家可以看一下樣章)

  好了,廢話不多說,咱們進入今天的主題,講解一下前段時間做的百度登入加密協定分析,由于寫的比較詳細,篇幅有點多,是以就分為上下兩篇來寫。由于百度登入使用的是同一套加密規則,是以這次就以百度雲盤的登入為例進行分析。

百度登入加密協定分析(上)

 第一部分:

  首先打開firebug,通路http://yun.baidu.com/,監聽網絡資料。

百度登入加密協定分析(上)

  

    流程:

      1.輸入賬号和密碼,點選登入。

      2.點選登入。(第一次post,這時候會出現驗證碼)

      3.會出現驗證碼,輸入驗證碼,

      4.最後點選登入成功上線。(第二次post登入成功)

    根據以往的分析經驗,一般需要進行兩次登入,來比較post請求出去的資料,哪些字段是不變的,哪些字段是動态改變的。同樣上述的流程,這次也會重複一次。将兩次登入過程中産生的post請求儲存下來。

    在一次成功的登入過程中,我們需要點選兩次登入按鈕,也就出現了兩次post請求。

百度登入加密協定分析(上)
  咱們先關注最後一次post的請求内容。
百度登入加密協定分析(上)

  這個時候從賬号登出,清除cookie資訊,再進行一次登入過程,再把post出去的資料,記錄下來,進行比較哪些是變化的。

  通過兩次的比較,我們可以發現:

   apiver=v3

  callback=parent.bd__pcbs__yqrows

  charset=utf-8

  codestring=jxGa206f4ef6540e2a5023014affd01abcc160fde066101382d

  countrycode=

  crypttype=12

  detect=1

  foreignusername=

  gid=58DDBCC-672F-423D-9A02-688ACB9EB252

  idc=

  isPhone=

  logLoginType=pc_loginBasic

  loginmerge=true

  logintype=basicLogin

  mem_pass=on

    password

  quick_user=0

  rsakey=kvcQRN4WQS1varzZxXKnebLGKgZD5UcV

  safeflg=0

  staticpage=http://yun.baidu.com/res/static/thirdparty/pass_v3_jump.html

  subpro=netdisk_web

  token=69a056f475fc955dc16215ab66a985af

  tpl=netdisk

  tt=1469844379327

  u=http://yun.baidu.com/

  username

  verifycode=1112

 其中标有綠色的字段都是不變化的,其他都是變化的。

  接着看一下變化的字段:

    callback 不清楚是什麼

    codestring 不清楚是什麼

    gid 一個生成的ID号

    password 加密後的密碼

    ppui_logintime 時間,不知道有沒有用

    rsakey RSA加密的密鑰(可以推斷出密碼肯定是經過了RSA加密)

    token 通路令牌

    tt 時間戳

    verifycode 驗證碼

    上面标為綠色的部分,都是可以簡單擷取的,是以先不用考慮。

第二部分:

  (1) 采取倒序的分析方式,上面說了一下第二次post的值,接着咱們分析一下,第一次post的資料内容。

百度登入加密協定分析(上)

  通過兩次post比較,可以發現一下字段的變化:

    callback 第一次post已經産生,第二次post内容發生變化

    codestring 第一次post時沒有資料,第二次post産生資料

    gid 第一次post已經産生,第二次post内容沒有發生變化

    password 第一次post已經産生,第二次post内容發生變化

    ppui_logintime 第一次post已經産生,第二次post内容發生變化

    rsakey 第一次post已經産生,第二次post内容沒有發生變化

    token 第一次post已經産生,第二次post内容沒有發生變化

  從上面可以看到出現明顯變化的是codestring ,從無到有。

   可以基本上确定 codestring 是在第一次post之後産生的,是以codestring 這個字段應該是在第一次post之後的響應中找到。

   果然不出所料:

百度登入加密協定分析(上)

  codestring 這個字段的擷取位置已經确定。

  ————————————————————————————————————————————————————————————————————————

  (2) 接下來 分析第一次post已經産生,第二次post内容沒有發生變化的字段

    gid

    rsakey

    token

  根據網絡響應的順序,從下到上,看看能不能發現一些敏感命名的連結(這是之前的經驗)

  從第一次post的往上看,一個敏感的連結就出現了。

  https://passport.baidu.com/v2/getpublickey?token=69a056f475fc955dc16215ab66a985af&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1469844359188&gid=58DDBCC-672F-423D-9A02-688ACB9EB252&callback=bd__cbs__rn85cf

百度登入加密協定分析(上)
百度登入加密協定分析(上)

  通過檢視響應我們找到rsakey,雖然在響應中變成了key,可是值是一樣的。

   通過之前的資訊,我們知道密碼是通過RSA加密的,是以響應中的publickey可能是公鑰,是以這個要重點注意。

  咱們還可以發現callback 字段,參數中出現callback字段,之後響應中也出現 了 callback字段的值将響應包裹取來,由此可以推斷

  callback字段可能隻是進行辨別作用。不參與實際的參數校驗。

  通過這個get連結的參數,我們可以得出結論:

    gid和token可以得到rsakey參數:

    gid token ------->>>>>rsakey

  分析 gid和token字段

  為了加快速度,咱們直接在firebug的搜尋框中輸入token:

  搜尋兩三次就發現了token的出處。

    https://passport.baidu.com/v2/api/?getapi&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1469844296412&class=login&gid=58DDBCC-672F-423D-9A02-688ACB9EB252&logintype=basicLogin&callback=bd__cbs__cmkxjj

百度登入加密協定分析(上)
百度登入加密協定分析(上)

  通過get請求的參數可以得出這樣的結論:

    通過gid可以得出來Token

    gid----------->>>>>>>>token

  最後咱們分析一下gid:

    依然是搜尋gid ,搜尋幾次就在這個腳本中發現了gid的存在:

    http://passport.bdimg.com/passApi/js/login_tangram_a829ef5.js

百度登入加密協定分析(上)

      格式化腳本之後,咱們看一下這個gid是怎麼産生的

      通過gid:e.guideRandom ,我們可以知道gid是由guideRandom這個函數産生的,接着在腳本中搜尋這個函數;

百度登入加密協定分析(上)

  最後找個了這個函數的原型,但是通過代碼可以看到,這個是随機生成的一個字元串,這就好辦了(百度。。。其實當時我是無語的)。

    gid = this.guideRandom = function () {

      return 'xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (e) {

      var t = 16 * Math.random() | 0,

      n = 'x' == e ? t : 3 & t | 8;

      return n.toString(16)

      }).toUpperCase()

    }()

總結一下:

  codestring:從第一次post之後的響應中提取出來

  gid: 有一個已知函數guideRandom 随機産生,可以通過調用函數擷取

  token:通過将gid帶入這連結https://passport.baidu.com/v2/api/?getapi&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1469844296412&class=login&gid=58DDBCC-672F-423D-9A02-688ACB9EB252&logintype=basicLogin&callback=bd__cbs__cmkxjj 擷取響應中的token

  rsakey:将擷取的gid和token帶入https://passport.baidu.com/v2/getpublickey?token=69a056f475fc955dc16215ab66a985af&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1469844359188&gid=58DDBCC-672F-423D-9A02-688ACB9EB252&callback=bd__cbs__rn85cf從響應中可以提取出來rsakey

今天的分享就到這裡,下一篇繼續分析。如果大家覺得還可以呀,記得推薦呦。


        
百度登入加密協定分析(上)
 歡迎大家支援我公衆号:   
百度登入加密協定分析(上)
本文章屬于原創作品,歡迎大家轉載分享。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/

本文章屬于原創作品,歡迎大家轉載分享,禁止修改文章的内容。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/

繼續閱讀