來自:FreeBuf.COM
最近老是聽朋友說,被上級單位通報HTTP不安全方法漏洞,本來是低危漏洞,也沒怎麼註意它,最近升為中危漏洞,每天催著去整改,鬧得人心惶惶,甚至經常被維護人員吐槽,做的是得不償失的事情。
因此,有必要說明一下,為什麼要禁止除GET和POST之外的HTTP方法。
換句話說,對於這些HTTP不安全方法,到底有多不安全呢?
一、HTTP請求方法有哪些
根據HTTP標準,HTTP請求可以使用多種方法,其功能描述如下所示。
HTTP1.0定義了三種請求方法: GET、POST、HEAD
HTTP1.1新增了五種請求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT
二、舉例說明不安全的HTTP方法
眾所周知,GET、POST是最為常見方法,而且大部分主流網站只支援這兩種方法,因為它們已能滿足功能需求。其中,GET方法主要用來獲取伺服器上的資源,而POST方法是用來向伺服器特定URL的資源提交資料。而其它方法出於安全考慮被禁用,所以在實際應用中,九成以上的伺服器都不會響應其它方法,並丟擲404或405錯誤提示。以下列舉幾個HTTP方法的不安全性:
1、OPTIONS方法,將會造成伺服器資訊暴露,如中介軟體版本、支援的HTTP方法等。
2、PUT方法,由於PUT方法自身不帶驗證機制,利用PUT方法即可快捷簡單地入侵伺服器,上傳Webshell或其他惡意檔案,從而獲取敏感資料或伺服器許可權。
3、DELETE方法,利用DELETE方法可以刪除伺服器上特定的資源檔案,造成惡意攻擊。
三、漏洞驗證
(一)環境搭建
1、測試環境為:WIN10 64位、Tomcat 7.0.72、curl 7.49
2、在Tomcat 7預設配置中,web.xml檔案的org.apache.catalina.servlets.DefaultServlet的
readonly引數預設是true,即不允許DELETE和PUT操作,所以透過PUT或DELETE方法訪問,就會報403錯誤。為配合測試,把readonly引數設為false。
(二)漏洞利用
1、PUT上傳和DELETE刪除檔案成功
在DefaultServlet的readonly引數為falsed的情況下,使用Curl進行測試,發現已能透過PUT上傳和DELETE刪除檔案。
2、直接PUT上傳.jsp失敗
此時想直接上傳webshell.jsp,但發現上傳失敗。
研究發現,原因是在預設配置下,涉及jsp、jspx字尾名的請求由org.apache.jasper.servlet.JspServlet處理,除此之外的請求才由org.apache.catalina.servlets.DefaultServlet處理。
剛才將DefaultServlet的readonly設定為false,並不能對jsp和jspx生效。因此,當PUT上傳jsp和jspx檔案時,Tomcat用JspServlet來處理請求,而JspServlet中沒有PUT上傳的邏輯,所以會403報錯。
3、利用漏洞成功上傳WebShell
對於不能直接上傳WebShell的問題,一般的思路是透過解析漏洞來解決,而不少中介軟體版本如IIS 6、TOMCAT 7等都出現過相關的漏洞。
在此測試環境中,利用Tomcat 7的任意檔案上傳漏洞(CVE-2017-12615)來實現目的,該漏洞透過構造特殊字尾名,繞過tomcat檢測,讓它用DefaultServlet的邏輯處理請求,從而上傳jsp檔案。具體來說,主要有三種方法,比如shell.jsp%20 、shell.jsp::$DATA 、shell.jsp/
本次測試,使用第一種方法,在1.jsp後面加上%20,如此即可成功實現上傳,並取得WebShell。
curl -X PUT http://127.0.0.1:8080/examples/1.jsp%20 -d “HelloJSP”
然後就直接掛馬了,從下圖可以看到成功上傳webshell.jsp,併成功實現對伺服器的控制。
四、如何自糾自查
從上面的Tomcat測試可以發現,雖然需在DefaultServlet的readonly引數為false前提下,才能實現滲透,但還是建議把除了GET、POST的HTTP方法禁止,有兩方面原因:
1、除GET、POST之外的其它HTTP方法,其剛性應用場景較少,且禁止它們的方法簡單,即實施成本低;
2、一旦讓低許可權使用者可以訪問這些方法,他們就能夠以此向伺服器實施有效攻擊,即威脅影響大。
寫到這裡,也許大家都明白了,為什麼要禁止除GET和POST外的HTTP方法,一是因為GET、POST已能滿足功能需求,二是因為不禁止的話威脅影響大。
自糾自查方面,可以使用OPTIONS方法遍歷伺服器使用的HTTP方法。但要註意的是,不同目錄中啟用的方法可能各不相同。而且許多時候,雖然反饋某些方法有效,但實際上它們並不能使用。許多時候,即使OPTIONS請求傳回的響應中沒有列出某個方法,但該方法仍然可用。總的來說,建議手動測試每一個方法,確認其是否可用。
具體方法,舉例說明,使用curl測試:
1、測試OPTIONS是否響應,並是否有 Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
curl -v -X OPTIONS http://www.test.com/test/
2、測試是否能透過PUT上傳檔案
curl -X PUT http://www.test.com/test/test.html -d “test”
3、找一個存在的檔案,如test.txt,測試是否能刪除
curl -X DELETE http://www.example.com/test/test.text
●編號621,輸入編號直達本文
●輸入m獲取文章目錄
Web開發
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。