百度登錄加密協議分析(上)


  本周又和大家見面了,沒什么特殊情況,一般是一周一篇原創。發布的時間基本上是在周末,平時還是比較忙碌的。最近在開發自己的博客,過段時間可以和大家分享開發博客中的技術點。如果大家想及時的和我交流的話,可以關注文章最后的微信公眾號,這樣我可以比較及時的知道大家的想法。(我的新書《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的往上看,一個敏感的鏈接就出現了。
 
 
 
 
 
 
 
   通過查看響應我們找到rsakey,雖然在響應中變成了key,可是值是一樣的。
   通過之前的信息,我們知道密碼是通過RSA加密的,所以響應中的publickey可能是公鑰,所以這個要重點注意
 
 
  咱們還可以發現callback 字段,參數中出現callback字段,之后響應中也出現 了 callback字段的值將響應包裹取來,由此可以推斷
  callback字段可能只是進行標識作用。不參與實際的參數校驗
 
  通過這個get鏈接的參數,我們可以得出結論:
 
    gid和token可以得到rsakey參數:
    gid token ------->>>>>rsakey
 
 
 
  分析 gid和token字段
 
  為了加快速度,咱們直接在firebug的搜索框中輸入token:
  搜索兩三次就發現了token的出處。
 
 
 
 
 
  通過get請求的參數可以得出這樣的結論:
    通過gid可以得出來Token
    gid----------->>>>>>>>token
 
 
  最后咱們分析一下gid:
    依然是搜索gid ,搜索幾次就在這個腳本中發現了gid的存在:
 
 
  
       格式化腳本之后,咱們看一下這個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 隨機產生,可以通過調用函數獲取
 
 
 
 
今天的分享就到這里,下一篇繼續分析。如果大家覺得還可以呀,記得推薦呦。



 歡迎大家支持我公眾號:   



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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM