前言
這是印度舉辦的CTF中遇到的一道JWT破解繞過題,以爲仍是挺有價值的,mark一下。html
JWT僞造
這是一道b00t2root
的一道web題,以爲頗有意思,而且結合了加密的知識,因此記錄一下。git
首先了解下JWT:github
JSON Web Token(JWT)是一個很是輕巧的規範。這個規範容許咱們使用JWT在用戶和服務器之間傳遞安全可靠的信息。JWT常被用於先後端分離,能夠和Restful API配合使用,經常使用於構建身份認證機制。web
JWT的數據格式分爲三個部分: headers , payloads,signature(簽名),它們使用.
點號分割。拿道題後看了一下cookie,發現是以下格式:算法
1 |
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhbHNlIn0.oe4qhTxvJB8nNAsFWJc7_m3UylVZzO3FwhkYuESAyUM |
進行base64解密後發現:後端
因此,咱們的目的就是把false
改爲true
,並且要經過服務器的驗證
,這點很重要,並非直接把false
改爲true
就萬事大吉了。由於服務器收到token後會對token的有效性
進行驗證。安全
驗證方法:首先服務端會產生一個key
,而後以這個key
做爲密鑰,使用第一部分選擇的加密方式(這裏就是HS256
),對第一部分和第二部分拼接的結果
進行加密,而後把加密結果放到第三部分
。服務器
1 |
服務器每次收到信息都會對它的前兩部分進行加密,而後比對加密後的結果是否跟客戶端傳送過來的第三部分相同,若是相同則驗證經過,不然失敗。 |
由於加密算法咱們已經知道了,若是咱們只要再獲得加密的key
,咱們就能僞造數據,而且經過服務器的檢查。cookie
這裏我使用了這個工具進行破解:C語言版JWT破解工具,下載安裝完畢後,直接進行破解,如圖:前後端分離
因此,個人加密密鑰就是:54l7y。而後咱們去驗證一下,這個網站能夠提供驗證服務:https://jwt.io/。當咱們使用破解出來的key時,咱們能完美還原出原始數據,這證實咱們的key是正確的。
最後咱們把false
改爲true
,而後使用key進行加密,能夠獲得以下:
而後咱們拿着這個token刷新一下:
能夠看到flag已經出來了。
參考連接
https://github.com/brendan-rius/c-jwt-cracker
https://auth0.com/blog/brute-forcing-hs256-is-possible-the-importance-of-using-strong-keys-to-sign-jwts/
https://jwt.io/
http://www.cnblogs.com/dliv3/p/7450057.html