一次文件上傳對 Token 的繞過
聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
No.1 背景
在Web滲透過程中,最離不開的應該就數Burpsuit了,通過它,我們可以很方便的進行數據包的修改和重放。例如在進行sql注入時,我們需要通過不斷的修改Post數據的內容來測試payload。為了防止數據包的重放,token機制被引入了代碼中。
Token常見的兩種功能,一種是用來代替賬號密碼,當你登錄后,就不需要不斷的去數據庫查詢賬號密碼來驗證身份,只需要驗證token即可(就像session),另一種是為了防止CSRF攻擊,每次請求前會先向服務端請求并獲得一個token,然后在會在后面的請求中帶上這個值。有的token每次請求都會重新獲取,而有的會持續一段時間。
就像上面說的,常見的token是用在一些敏感操作作為防御CSRF攻擊的一種手段,例如,修改密碼、增加用戶、轉賬等。這邊分享一個在文件上傳時遇到Token限制的案例。
No.2 案例
在一處上傳點,像往常一樣進行上傳并抓包:

抓包后看到如下請求:

竟然在文件上傳點用了Token,繼續抓包:
可以看到第二階段的包才是進行上傳的包,并且把第一個請求中獲取到的token插入到了請求體中,放包一次,成功:

再放包一次:
這次上傳失敗了,說明這里token刷新了

重放了一次第一階段的數據包,獲取到新的token:

將這個token替換到第二階段數據包的token中,這次重放又成功了:

為了能夠不斷重放數據包,方便我們測試,這里得想辦法繞過token的限制。根據判斷,這里分成三步,第一步,獲取token,第二步,插入token,第三步,上傳文件。由于每次上傳,數據包中需要改變的地方只有token,根據這個特點,我們可以利用自動化腳本的方式來方便我們測試,既然腳本有了,再接下去我們就可以手動調試或加載字典進行愉快的fuzzing了。
關于這里的發送數據包,可以通過代碼的形式將整個POST請求的數據包表示出來,當然,還有一種很偷懶(很香)的方式,調用系統curl命令執行請求就可以了。這么大個數據包,肯定有人會說,這curl的命令不得很難寫嗎?其實很簡單,方法如下:
Burpsuit已經為我們提供了快速將數據包轉換成curl命令的功能了:

curl -i -s -k -X $'POST'
接下來,上傳文件的包同理,但是因為我們測試的時候是放的一張圖片,這樣的話會導致復制的內容很長,所以這里可以將圖片的內容進行刪減,例如變成這樣子:

然后復制即可:
curl -i -s -k -X $'POST'
OK,命令有了,后面就是愉快的py了。這里以導入字典fuzzing為例,代碼如下:
#encoding:UTF-8
最終效果如下:

這樣我們就利用腳本繞過了Token限制了。
原創: 雷神眾測 rebootORZ
原文鏈接:https://mp.weixin.qq.com/s/MSS_pBu-5Dbo7iL...