為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

最近 老是 聽朋友說,被上級單位通報HTTP不安全方法漏洞,本來是低危漏洞,也沒怎麼注意它,最近升為中危漏洞,每天催著去整改,鬧得人心惶惶,甚至經常被維護人員吐槽,做的是得不償失的事情。

因此,有必要說明一下,為什麼要禁止除GET和POST之外的HTTP方法。

換句話說,對於 這些HTTP不安全方法,到底有多不安全呢?

一、HTTP請求方法有哪些

根據HTTP標準,HTTP請求可以使用多種方法,其功能描述如下所示。

HTTP1.0定義了三種請求方法: GET、POST、HEAD

HTTP1.1新增了五種請求方法:OPTIONS、PUT、DELETE、TRACE 、CONNECT

二、舉例說明不安全的HTTP方法

眾所周知,GET、POST是最為常見方法,而且 大部分主流網站只支持這兩種方法,因為它們已能滿足功能需求。 其中,GE T方法主要用來獲取服務器上的資源,而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處理。

為什麼要禁止除GET和POST之外的HTTP方法?

剛才將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%2 0 -d “HelloJSP”

然後就直接掛馬了,從下圖可以看到成功上傳webshell.jsp,併成功實現對服務器的控制。

為什麼要禁止除GET和POST之外的HTTP方法?

四、如何自糾自查

從上面的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

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?

為什麼要禁止除GET和POST之外的HTTP方法?


分享到:


相關文章: