JWT token破解繞過

前言

  這是印度舉辦的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

相關文章
相關標籤/搜索