SSRF(Server-Side Request Forgery:服務器端請求偽造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)
SSRF形成的原因大都是由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。比如從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等。
接下來我們通過pikachu平台中的SSRF示例進行進一步學習。
一、SSRF(curl)
首先我們大概了解一下在PHP中curl函數是用來干什么的。curl是一個庫,能讓你通過URL和許多不同種的服務器進行交流,並且還支持許多協議。curl可以支持https認證、http post、ftp上傳、代理、cookies、簡單口令認證等等功能。
下面我們看一下pikachu中該部分的代碼:
從上一段代碼中,可以看出客戶端可以使用GET方法提交url參數和內容,下一段就是會把用戶提交請求的URL返回客戶端去執行。這里我們假設提交的是這樣:
這里我們提交了url參數和內容,服務器用函數curl_exec()函數執行,並將結果用echo $RES顯示出來。
所以我們就可以利用curl_exec()函數去執行一些惡意操作。比如我們本機還裝有sqli-lab,我們假設不用需外部訪問。而這里我們就能構造這樣的url去訪問到:
localhost/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/sqli/
二、SSRF(file_get_content)
file_get_content()函數的功能是對本地和遠程的文件進行讀取。下面我們看一下pikachu中該部分的代碼:
這里我們可以看到可以讀取一個文件,如果是本地的直接加路徑,遠程的需要加入域名。
這里演示一下本地讀取。我們現在D盤下創建一個文件1.txt,內容如下圖
然后在客戶端瀏覽器中輸入:
localhost/pikachu/vul/ssrf/ssrf_fgc.php?file=file:///D://1.txt
這里我們可以看到講本地文件內容讀出來了。
如果讀取內網中的服務器信息,只要Web服務器有權限,就很有可能讀取出來。