[Security] HTTP 動詞竄改弱點 (HTTP Verb Tampering)

這是今天有位朋友在 MSN 上問的一個問題,因為我也是第一次看到這個名詞,所以我也上網查了一下,在 Arshan Dabirsiaghi 於 2008 年所發表的 "Bypassing Web Authentication and Authorization with HTTP Verb Tampering" 論文中提到這樣的弱點,但早在 2004 年 Kernelpanik Lab 就已經有研究報告提出這個弱點,主要的原因是在 Web Server 或 Web Application 或 HTTP Endpoint 中,沒有針對 HTTP 動詞 (verb) 去做存取控制所致。

這是今天有位朋友在 MSN 上問的一個問題,因為我也是第一次看到這個名詞,所以我也上網查了一下,在 Arshan Dabirsiaghi 於 2008 年所發表的 "Bypassing Web Authentication and Authorization with HTTP Verb Tampering" 論文中提到這樣的弱點,但早在 2004 年 Kernelpanik Lab 就已經有研究報告提出這個弱點,主要的原因是在 Web Server 或 Web Application 或 HTTP Endpoint 中,沒有針對 HTTP 動詞 (verb) 去做存取控制所致。

在 Arshan 的論文中所舉的例子,是 Java EE 的 Http Servlet 的設定:

image

這樣的設定是告訴 Http Servlet 的 Container,允許角色為 admin 的使用者以 GET 和 POST 的 HTTP 動詞存取路徑是 /admin/* 的資源。乍看之下好像沒有什麼問題,但是卻有 HTTP Verb Tampering 的弱點,因為它並沒有限制其他的 HTTP Verb 應拒絕存取,所以今天只要有一個非 admin 的使用者,使用了 HEAD 或是其他非 GET/POST 的 HTTP 動詞的話,仍然可以存取到 /admin/* 的資源,形成一個可能被入侵的漏洞。

而在 Arshan 的論文中,提到了不同的 Web Application Framework 會受到 HTTP Verb Tampering 弱點影響的情形:

image

 

而要如何防禦呢?很簡單,只要確保不合法的 HTTP 動詞無法存取即可,像 IIS 7 的 HTTP 處理常式對應中,會有一個 "要求限制" 的對話盒:

image

這個要求限制會和 Web.config 的 <httpHandler> 的 verb 屬性做對應,而如果只想要允許特定動詞的話,就只要在 verb 中設定 (ex: verb="GET,POST"),IIS 7 會檢查 Http Request 使用的動詞是什麼,若發現有不允許的動詞時,就會拒絕其存取。若是 IIS 6.0 又使用 ASP.NET 的話,則可以在 <httpHandler> 中去設定。

如果不想這麼麻煩去設定 IIS,當然也可以透過 ASP.NET 的 URL Authorization 來做控管,也就是設定 <deny> 的屬性,而 Arshan 也在他的論文中示範了較佳的設定:

image

上列的設定是允許使用者名稱為 Admin 的帳戶以 GET 方式存取 (不過我覺得他想寫的應該是 roles),而使用者名稱為 Kim 的帳戶則可以用 POST 方式存取,其他的全部拒絕。

這個弱點除了 Web Application 的開發人員以外,如果是以 REST-style 提供 API 的系統,更要小心這個弱點,以避免有心人士利用它來侵入系統。

 

Reference:

http://www.aspectsecurity.com/documents/Bypassing_VBAAC_with_HTTP_Verb_Tampering.pdf
http://www.imperva.com/resources/glossary/http_verb_tampering.html