SSRF伺服器端請求偽造漏洞基礎
1、什麼是SSRF漏洞?
2、SSRF漏洞的利用方式
3、SSRF漏洞繞過
4、SSRF漏洞加固
0x01 什麼是SSRF漏洞
定義
:
SSRF漏洞,中文全稱為服務端請求偽造漏洞,是一種由攻擊者構造一定的利用程式碼導致服務端發起漏洞利用請求的安全漏洞。一般情況下,SSRF攻擊的應用是無法透過外網訪問的,所以需要藉助目標服務端進行發起,目標伺服器可以連結內網和外網,攻擊者便可以透過目標主機攻擊內網應用。
漏洞成因
:
SSRF漏洞原理圖
由於業務需要,服務端程式需要從其他伺服器應用中獲取資料,例如獲取圖片、資料等,但是由於伺服器沒有對其請求的目標地址做過濾和限制,導致駭客可以利用此缺陷請求任意伺服器資源,其中就包含隱匿在內網的應用。很多企業認為伺服器在內網不會受到駭客攻擊,便放任漏洞不管,不做補丁修復和版本升級,弱口令遍佈內網。但是在SSRF漏洞面前這些漏洞都會成為駭客的“盤中餐”。
SSRF漏洞一般為HTTP/HTTPS方式出現,但類似TCP Connect方式也可以探測內網的IP活躍狀態和埠的開放情況,但此類危害較小。
SSRF漏洞出現的位置
:
伺服器主動發起網路請求,例如HTTP/HTTPS/Socket
分享功能,透過URL分享網頁內容,
微博SSRF
圖片載入、下載功能
郵件系統
api遠端呼叫
只要是伺服器可以主動發起網路請求便可能出現
SSRF漏洞的危害
:
對目標伺服器所在的內網進行IP存活性掃描和埠掃描
利用掃描的指紋資訊判斷開放的服務,從而對內網的主機進行攻擊
識別內網WEB應用指紋,判斷應用型別進行攻擊
使用特定協議攻擊應用(gopher、dict、file、FTP/SFTP等)
0x02 SSRF漏洞的利用方式
產生漏洞的函式
file_get_contents()
fsockopen()
curl_exec()
file_get_contents函式
:
<?
php
if
(
isset
(
$_POST
[
‘url’
]))
{
$content
=
file_get_contents
(
$_POST
[
‘url’
]);
$filename
=
‘。/images/’
。
rand
()
。
‘。img’
;
\
file_put_contents
(
$filename
,
$content
);
echo
$_POST
[
‘url’
];
$img
=
“
\”
“
。
$filename
。
”
\“
/>”
;
}
echo
$img
;
?>
以上程式碼是獲取post引數url中的值地址,透過file_get_contents獲取url中的圖片內容,儲存到image目錄下,然後顯示。
file_get_contents函式使用前需要將php。ini的allow_url_fopen設定為ON。
以上的漏洞程式碼是存在SSRF漏洞的,可以控制url引數,自定義任意的URL,包括內網的URL,例如現在驗證內網192。168。0。118是否開啟了6379埠,可以做以下訪問
SSRF漏洞探測埠
根據上圖的報錯資訊可以看出開啟了6379,接下來測試是否開啟了8888埠
SSRF漏洞探測埠
測試8888埠時,根據上圖提示,顯示錯誤資訊,說明埠未開放。接下來測試80埠,看顯示結果(因為109的80埠是開放的,所以測試下,看回顯內容)
SSRF漏洞探測埠
訪問109的80埠並未報錯,此時,檢視圖片內容(選中圖片,點複製連結),如下圖:
SSRF漏洞探測埠
發現請求的80埠的資料被寫入到了圖片問題中,符合程式碼預期。除了可以探測埠,也可以做檔案包含漏洞的利用,這裡不再細說檔案包含的知識。
fsockopen函式
:
<?
php
$host
=
$_GET
[
‘url’
];
$port
=
$_GET
[
‘port’
];
# fsockopen(主機名稱,埠號碼,錯誤號的接受變數,錯誤提示的接受變數,超時時間)
$fp
=
fsockopen
(
$host
,
intval
(
$port
),
$errno
,
$errstr
,
30
);
if
(
!
$fp
)
{
echo
“
$errstr
(
$errno
)
\n
”
;
}
else
{
$out
=
“GET / HTTP/1。1
\r\n
”
;
$out
。=
“Host:
$host\r\n
”
;
$out
。=
“Connection: Close
\r\n\r\n
”
;
# fwrite() 函式將內容寫入一個開啟的檔案中。
fwrite
(
$fp
,
$out
);
# 函式檢測是否已到達檔案末尾 ,檔案末尾(EOF)
while
(
!
feof
(
$fp
))
{
echo
fgets
(
$fp
,
128
);
}
fclose
(
$fp
);
}
?>
以上函式是接受url和port來制定socket訪問的地址和埠,由於地址和埠使用者可控,所以可以用來SSRF漏洞的利用。
例如可以做以下訪問可以探測119的3306埠是否開放:
做以下訪問可以探測109的3306是否開放:
未出現錯誤資訊說明埠開放
curl_exec函式
:
<?
php
$url
=
$_GET
[
‘url’
];
$curlobj
=
curl_init
(
$url
);
echo
curl_exec
(
$curlobj
);
?>
curl_exec函式是危害最大的函式,也是需要重點講的函式。以上程式碼是獲取引數url的值,使用curl進行訪問。
curl_exec的使用需要3個條件:
1、PHP版本>=5。3
2、開啟extension=php_curl。dll
3、——wite-curlwrappers(編譯PHP時用,此時不需要,可忽略)
使用dict協議探測22埠(後面會講dict協議)
使用dict協議探測6379埠
可以根據回顯的banner資訊判斷目標埠執行的服務為ssh和redis服務,dict協議還可以做到執行命令的功能,本文不再講解。
0x03 SSRF繞過方式
在SSRF漏洞利用時,經常被pass,接下來講一下常規的繞過方法。
攻擊本機
http://127。0。0。1:80
http://localhost:22
利用@繞過
http://example。com@127。0。0。1
# 這裡的example。com可以任意替換,
利用短地址繞過
http://127。0。0。1可以變為http://suo。im/5UHEvD
# 轉換地址you很多,可以採用http://tool。chinaz。com/tools/dwz。aspx
特殊域名繞過
http://127。0。0。1。xip。io/
http://www。margin。com。127。0。0。1。xip。io/
利用Enclosed alphanumerics
利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ。ⓒⓞⓜ >>> example。com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
利用句號代替點繞過
127。0。0。1 變為127。0。0。1
使用其他進位制繞過,例如127。0。0。1
(1)、8進位制格式:0177。0。0。1
(2)、16進位制格式:0x7F。0。0。1
(3)、10進位制整數格式:2130706433(轉16進位制,在轉10進位制)
(4)、16進位制整數格式:0x7F000001
(5)、還有一種特殊的省略模式,例如127。0。0。1這個IP可以寫成127。1
特殊域名繞過(DNS解析)
http://127。0。0。1。xip。io/
# 會解析道本地的127。0。0。1
0x04 SSRF漏洞加固
禁止302跳轉,或者沒跳轉一次都進行校驗目的地址是否為內網地址或合法地址。
過濾返回資訊,驗證遠端伺服器對請求的返回結果,是否合法。
禁用高危協議,例如:gopher、dict、ftp、file等,只允許http/https
設定URL白名單或者限制內網IP
限制請求的埠為http的常用埠,或者根據業務需要治開放遠端呼叫服務的埠
catch錯誤資訊,做統一錯誤資訊,避免駭客透過錯誤資訊判斷埠對應的服務