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

2021-10-18 00:06:52 字數 3640 閱讀 5439

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

因此,有必要說明一下,為什麼要禁止除get和post之外的http方法。

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

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

http1.0定義了三種請求方法: get、post、head

http1.1新增了五種請求方法:options、put、delete、trace 、connect

**於網路

眾所周知,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 -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

2、測試是否能通過put上傳檔案

curl -x put test.html -d "test"

3、找乙個存在的檔案,如test.txt,測試是否能刪除

curl -x delete

文中所述的漏洞測試之所以能成功,主要有三個原因:1、http put方法無驗證機制;2、tomcat jspservlet繞過;3、windows檔案字尾截斷。 以上三者,單獨存在都不能形成實質性的威脅,但合在一起,就形成了文中所演示的漏洞滲透。 另外,可能標題起得有些不恰當造成誤導,在此表示歉意。 我想傳達的意思是:在衡量好成本與威脅的情況下,得採取適當行動降低風險。比如完全不需要用到put、delete之類方法的,就禁止掉;如果要用到,就解決好這些潛在的威脅,如此即可。

為什麼get比post更快

get和post在面試過程中一般都會問到,一般的區別 1.post更安全 不會作為url的一部分,不會被快取 儲存在伺服器日誌 以及瀏覽器瀏覽記錄中 2.post傳送的資料量更大 get有url長度限制 3.post能傳送更多的資料型別 get只能傳送ascii字元 4.post比get慢 我相信不...

get和post有什麼不同?

get和post是http請求的兩種基本方法,要說它們的區別,接觸過web開發的人都能說出一二。最直觀的區別就是get把引數包含在url中,post通過request body傳遞引數。你可能自己寫過無數個get和post請求,或者已經看過很多權威 總結出的他們的區別,你非常清楚知道什麼時候該用什麼...

為什麼要禁止跨域的 Ajax 請求?

作者將 同源策略 分為 使用者登入了自己的銀行頁面向使用者的cookie中新增使用者標識 使用者瀏覽了惡意頁面 執行了頁面中的惡意ajax請求 向發起ajax http請求,請求同時對應cookie也同時傳送過去 銀行頁面從傳送的cookie中提取使用者標識,驗證使用者標識無誤,response中返...