破解網站登入加密–RSA
大家好,我是四毛,下面的是我的公眾號,歡迎關注。
今天的內容主要講的是破解一個網站的rsa加密,當然肯定不是破解這個演算法,而是找到加密的引數,正確模擬這個演算法即可。
1. 什麼是rsa演算法
下面的資料摘抄自阮一峰老師的文章, ofollow,noindex">點這裡瞭解更多
1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下,完成解密。這被稱為 “Diffie-Hellman金鑰交換演算法” 。這個演算法啟發了其他科學家。人們認識到,加密和解密可以使用不同的規則,只要這兩種規則之間存在某種對應關係即可,這樣就避免了直接傳遞金鑰。
這種新的加密模式被稱為”非對稱加密演算法”。
(1)乙方生成兩把金鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
(2)甲方獲取乙方的公鑰,然後用它對資訊加密。
(3)乙方得到加密後的資訊,用私鑰解密。
如果公鑰加密的資訊只有私鑰解得開,那麼只要私鑰不洩漏,通訊就是安全的。
2. 研究目標
從我要研究的網站來說,就是根據引數得到正確的公鑰,加密以後返回給伺服器,讓伺服器使用私鑰可以解密出正確的資料即可。
同時,本文不會將具體的網站說出來,只是給大家提供一個解決問題的思路。
3. 開始
3.1 抓包找引數
首先,開啟某個網站的登入頁面,輸入使用者名稱,密碼,驗證碼之類的引數, 抓包看到了下面這個頁面:
我實際輸入的值全是1, 然後都被加密了, 沒辦法,只能去找加密的方法了。
經過一番搜尋過後,才發現,原來加密的演算法就在原始碼裡面,這裡截個圖:
從這裡就可以看到具體的演算法名以及相關的引數了,你會說,這是什麼演算法我都不知道啊?搜啊,用關鍵詞搜一下就能知道了。
同時,是不是覺得這個網站好傻逼,這不太簡單了嗎?
肯定不是!!!
這麼簡單,說明此處也是必有玄機!!!
至於什麼玄機,到後面說,都是淚。
3.2 分析加密流程
首先, 我們知道了公鑰以後,解析這個公鑰,就可以得到相關的引數,給大家找了示例程式碼
# /usr/bin/python # encoding: utf-8 import base64 def str2key(s): # 對字串解碼 b_str = base64.b64decode(s) if len(b_str) < 162: return False hex_str = '' # 按位轉換成16進位制 for x in b_str: h = hex(ord(x))[2:] h = h.rjust(2, '0') hex_str += h # 找到模數和指數的開頭結束位置 m_start = 29 * 2 e_start = 159 * 2 m_len = 128 * 2 e_len = 3 * 2 modulus = hex_str[m_start:m_start + m_len] exponent = hex_str[e_start:e_start + e_len] return modulus,exponent if __name__ == "__main__": pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC7kw8r6tq43pwApYvkJ5laljaN9BZb21TAIfT/vexbobzH7Q8SUdP5uDPXEBKzOjx2L28y7Xs1d9v3tdPfKI2LR7PAzWBmDMn8riHrDDNpUpJnlAGUqJG9ooPn8j7YNpcxCa1iybOlc2kEhmJn5uwoanQq+CA6agNkqly2H4j6wIDAQAB" key = str2key(pubkey) print key
相應的輸出
('c2ee4c3cafab6ae37a7002962f909e656a58da37d0596f6d530087d3fef7b16e86f31fb43c49474fe6e0cf5c404acce8f1d8bdbccbb5ecd5df6fded74f7ca2362d1ecf033581983327f2b887ac30cda54a499e500652a246f68a0f9fc8fb60da5cc426b58b26ce95cda41219899f9bb0a1a9d0abe080e9a80d92a972d87e23eb', '010001')
從程式碼中可以看出,解析了公鑰之後得到了兩個值,一個就是010001,和我們在網站原始碼裡面找到的值是一樣的。所以,原始碼裡面的引數我們應該就是可以直接使用的,是不是有種找到組織的趕腳。
接下來,利用下面的程式碼,來對資料進行加密
import rsa import binascii def en_test(): param_1 = "010001" # 某次我找到的 param_2 = "955120AB9334B7CD52FCDB422DBF564AFD46DEBDC706F33502BBFAD9DD216A22E4D5012CB70F28473B46FB7190D08C31B4B8E76B5112ACE1C5552408961530B1C932DEEA8FC38A9A624AD22073F56F02BF453DD2C1FEA0164106D6B099CC9E5EC88C356FC164FCA47C766DD565D3D11048D27F2DD4221A0B26AB59BD7D09841F" message = 'nihao' modulus = int(param_2, 16) exponent = int(param_1, 16) rsa_pubkey = rsa.PublicKey(modulus, exponent) crypto = rsa.encrypt(message, rsa_pubkey) data = binascii.b2a_hex(crypto) print data if __name__ == '__main__': en_test()
但是當我這樣做完,進行模擬登入,還以為自己很牛逼的時候,伺服器卻給我返回了這樣的結果, 目瞪狗呆啊:
{"Status":false,"ResultValue":"","StatusCode":"REFRESH","StatusMessage":"請嘗試重新登入","RecordCount":0,"Data":null}
可以看到資訊提示要重新整理,但是當時是百思不得其解,為毛線要重新整理?
困惑了一會之後,我再次從頭走了一遍流程,這下我才發現,原來原始碼裡面的那個 長長的資料 是會 改變 的,直到這個時候,我才意識到為什麼要我重新整理。。。。。。
伺服器啊,你就不能直接說引數錯誤嗎?重新整理你大爺啊。
果然,我還是太年輕啊。
果然,天上掉下的絕不是餡餅,絕逼是個陷阱。
知道這個坑以後就好辦了,用個正則匹配一下就行了,而結果也是對的:
{"Status":true,"ResultValue":"","StatusCode":"OK","StatusMessage":"成功","RecordCount":0,"Data":{"LoginUrl":"/System/Welcome"}}
4 總結
到這裡這篇文章就結束了,這個案例相對於來說很簡單,而且為了保護網站的隱私,所以沒辦法展開說。
有些網站的加密方式是很變態的,比如網易雲音樂,知曉常見的加密方法,就可以處理大部分的情況了。
其實,網易雲音樂並不是一定要加密, 有想知道非加密的方法的,可以關注我,私聊我。有點敏感,就不寫文章了。
反正,我爬了1000W+的網易雲音樂都是不加密的~~
如果你有類似的問題待解決或者想了解的更清楚的細節的,歡迎關注我的公眾號以後,後臺私我一下。