使用Python CGIHTTPServer繞過注入時的CSRF Token防禦
前言
CSRF tokens是伺服器生成的一串隨機值,其主要作用是防止表單重複提交以及請求偽造攻擊。由於該生成值具有隨機性,一次性,並且是基於伺服器端的前一個請求生成的,因此黑客幾乎不可能偽造它。
Burp Suite
雖說無法偽造,但並不代表我們就不能繞過它。這裡,不得不提及一款web滲透神器Burp Suite。在Burp上有多種配置其使用巨集來繞過HTML表單上CSRF tokens的方法,例如我們可以使用Burp Active Scans,Burp Intruder,Burp Repeater,甚至Burp Proxy。還有專門用於Intruder模組的Grep-Extract和pitchfork攻擊型別。如果你還覺得不夠,Burp完美的擴充套件性支援你開發自己的Burp外掛。
除了Burp外,另一款神器Sqlmap也為我們提供了類似的功能。Sqlmap中有一個–csrf-token和–csrf-url引數,可用於繞過CSRF tokens。或者你也可以像我剛說的那樣,配置Burp使用–proxy通過Burp執行sqlmap。
但今天我要介紹另一種繞過方法,即使用Python CGIHTTPServer。
實驗環境
我的測試環境是一個簡單的PHP+mysql,我可以登入並訪問受限區域。我在這裡上傳了 ofollow" rel="nofollow,noindex" target="_blank">PHP程式碼 ,你可以下載進行測試。程式碼可能寫的並不完美,但用於測試目的應該問題不大。
CSRF tokens是隨機生成的數字的SHA256雜湊值,並且每個HTTP請求的雜湊值都不同。
因此,如果不對Burp進行鍼對性的配置,它將無法檢測到該問題的存在。
sqlmap也同樣。
我使用–technique,–dbms和-p選項來加速掃描。由於這只是一個簡單的基於布林的SQLi,因此–level 1(預設值)就足夠了。但是,如果憑據不正確的話,則必須將–risk設定為3才行。因為只有風險等級為3的情況下,基於布林的SQLi才能被檢測到。基於布林的SQLi是非常危險的,因為它們可以使任何條件為真。例如當UPDATE或DELETE語句的WHERE子句存在這種注入,攻擊者就可以實現更改資料庫中使用者密碼,轉儲憑據等。
這裡,我使用sqlmap的SQLi –csrf-token =“mytoken”選項,檢測到了一個基於OR的SQLi:
這是一個登入驗證表單,顯然這裡是一個SELECT語句,這意味著風險等級3沒有危害。
當然,如果你有有效憑據,它還容易受到基於AND的SQLi攻擊。但即使我擁有有效憑據,我也會先用另一個(有效)使用者名稱來進行測試,先找到基於OR的SQLi。這樣做可以避免賬戶被以外的鎖定。
此外,使用sqlmap的SQLi –csrf-token =“mytoken”選項,我還檢測到了一個基於AND的SQLi:
CGIHTTPServer
首先,我們來建立CGI指令碼:
這個指令碼需要建立在folder_whatever/cgi-bin/目錄中。我們將其稱為mask.py,並確保其是可執行的。建立完成後,我們從“folder_whatever”目錄中執行“python -m CGIHTTPServer”。預設情況下,它將偵聽8000/tcp埠。
你可以使用正確的密碼對其進行測試:
以及使用一個錯誤密碼:
現在,我們無需對Burp和sqlmap進行特定配置,就能輕鬆的檢測到安全漏洞。