1.概述
SSRF(Server-Side Request Forgery:服務器端請求偽造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。SSRF攻擊的主要目標是從外網無法訪問的內部系統。
SSRF形成的原因:服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。如通過指定URL地址獲取網頁敏感信息,加載指定地址的圖片,下載等等。通俗的來講SSRF就是利用存在缺陷的web應用作為代理,通過惡意篡改向服務器獲取資源的請求從而攻擊遠程及本地服務器。
PHP中的 curl_exec()、 file_get_contents()、fsockopen()等函數若使用不當便會造成SSRF漏洞。
curl_exec()函數造成SSRF漏洞的部分源碼:
<?php $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "ssrf_curl.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $FILEDIR = $_SERVER['PHP_SELF']; $RD = explode('/',$FILEDIR)[1]; $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; if(isset($_GET['url']) && $_GET['url'] != null){ //接收前端URL沒問題,但是要做好過濾,如果不做過濾,就會導致SSRF $URL = $_GET['url']; $CH = curl_init($URL); curl_setopt($CH, CURLOPT_HEADER, FALSE); curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE); $RES = curl_exec($CH); curl_close($CH) ; //ssrf的問題是:前端傳進來的url被后台使用curl_exec()進行了請求,然后將請求的結果又返回給了前端。 //除了http/https外,curl還支持一些其他的協議curl --version 可以查看其支持的協議,telnet //curl支持很多協議,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP echo $RES; } ?>
file_get_contents()函數造成SSRF漏洞的部分源碼:
<?php $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "ssrf_fgc.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $FILEDIR = $_SERVER['PHP_SELF']; $RD = explode('/',$FILEDIR)[1]; $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; //讀取PHP文件的源碼:php://filter/read=convert.base64-encode/resource=ssrf.php if(isset($_GET['file']) && $_GET['file'] !=null){ $filename = $_GET['file']; $str = file_get_contents($filename); echo $str; } ?>
如該web頁面存在SSRF漏洞
http://192.168.43.116/control/more/ssrf.php?url=localhost/pt_env/control/xss/xss_1.php?id=1
此時構造pyload:
/control/more/ssrf.php?url=http://192.168.43.223/phpmyadmin/
打開同一網段內主機192.168.43.223的phpmyadmin頁面。
繼續構造file協議的pyload:
/control/more/ssrf.php?url=file:///C:/phpStudy/WWW/test/test.txt
打開本地文件
更多pyload:
php://filter/read=convert.base64-encode/resource=ssrf.php //讀取PHP源碼 http://192.168.43.100:22 //探測其他主機端口
SSRF漏洞可能造成的危害:
- 對內網進行端口掃描和主機存活探測等敏感信息收集
- 攻擊內外網其他存在漏洞的web應用(主要是Get參數攻擊)
- 造成內外網DDOS攻擊
- 通過file://讀取本地任意文件,通過dict協議獲取服務器端口服務,通過http協議探測web應用等等。
SSRF漏洞的挖掘:
SSRF與CSRF的區別:
CSRF(client-site request forery客戶端請求偽造)是服務器端沒有對用戶提交的數據進行隨機值校驗,且對http請求包內的refer字段校驗不嚴,導致攻擊者可以利用用戶的cookie信息偽造用戶請求發送至服務器;(見前面的博客:CSRF漏洞解析與靶場復現)
SSRF(server-site request forery服務端請求偽造)是服務器對用戶提供的可控URL過於信任,沒有對攻擊者提供的URL進行地址限制和足夠的檢測,導致攻擊者可以以此為跳板攻擊內網或者其它服務器。
SSRF漏洞的修復建議:
- 限制請求的端口只能為web端口,只允許訪問HTTP和HTTPS請求。
- 限制不能訪問內網的IP,以防止對內網進行攻擊。
- 屏蔽返回的詳細信息。