PHP FastCGI的遠程利用
說到FastCGI,大家都知道這是目前最常見的webserver動態腳本執行模型之一。目前基本所有web腳本都基本支持這種模式,甚至有的類型腳本這是唯一的模式(ROR,Python等)。
FastCGI的主要目的就是,將webserver和動態語言的執行分開為兩個不同的常駐進程,當webserver接收到動態腳本的請求,就通過fcgi協議將請求通過網絡轉發給fcgi進程,由fcgi進程進行處理之后,再將結果傳送給webserver,然后webserver再輸出給瀏覽器。這種模型由于不用每次請求都重新啟動一次cgi,也不用嵌入腳本解析器到webserver中去,因此可伸縮性很強,一旦動態腳本請求量增加,就可以將后端fcgi進程單獨設立一個集群提供服務,很大的增加了可維護性,這也是為什么fcgi等類似模式如此流行的原因之一。
然而正是因為這種模式,卻也帶來了一些問題。例如去年80sec發布的《nginx文件解析漏洞》 實際上就是由于fcgi和webserver對script路徑級參數的理解不同出現的問題。除此之外,由于fcgi和webserver是通過網絡進行溝通的,因此目前越來越多的集群將fcgi直接綁定在公網上,所有人都可以對其進行訪問。這樣就意味著,任何人都可以偽裝成webserver,讓fcgi執行我們想執行的腳本內容。
ok,以上就是背景原理解釋,我這里就用我最熟悉的PHP給各位做個例子。
php的fastcgi目前通常叫做FPM。他默認監聽的端口是9000端口。我們這里用nmap直接掃描一下:
nmap -sV -p 9000 --open x.x.x.x/24
為什么要用sV?因為9000端口可能還存在其他服務,這里需要借用nmap的指紋識別先幫我們鑒定一下。
[root@test:~/work/fcgi]#nmap -sV -p 9000 --open 173.xxx.xxx.1/24
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-14 20:06 EDT
Nmap scan report for abc.net (173.xxx.xxx.111)
Host is up (0.0095s latency).
PORT STATE SERVICE VERSION
9000/tcp open ssh OpenSSH 5.3p1 Debian 3ubuntu7 (protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:kernel
Nmap scan report for abc.com (173.xxx.xxx.183)
Host is up (0.0096s latency).
PORT STATE SERVICE VERSION
9000/tcp open tcpwrapped
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 256 IP addresses (198 hosts up) scanned in 7.70 seconds
隨便掃描了一下,運氣不錯,一個C段有2個開放9000端口的,不過其中一個是被管理員修改的sshd,另一個tcpwrapped,才是我們的目標。
為了做測試,我寫了一個fastcgi的客戶端程序,直接向對方發起請求。我們利用一個開放的fastcgi能有什么作用?這里和普通的http請求有一點不同,因為webserver為了提供fastcgi一些參數,每次轉發請求的時候,會通過FASTCGI_PARAMS的包向fcgi進程進行傳遞。本來這些參數是用戶不可控的,但是既然這個fcgi對外開放,那么也就說明我們可以通過設定這些參數,來讓我們去做一些原本做不到的事情:
新聞熱點
疑難解答