1. 程式人生 > 實用技巧 >Http Verb Tempering: Bypassing Web Authentication and Authorization(使用 HTTP 動詞篡改的認證旁路 )

Http Verb Tempering: Bypassing Web Authentication and Authorization(使用 HTTP 動詞篡改的認證旁路 )

Http Verb Tempering: Bypassing Web Authentication and Authorization(使用 HTTP 動詞篡改的認證旁路

什麼是HTTP動詞(HTTP VERB)?

超文字傳輸協議(HTTP)提供了可以用於在web伺服器上執行操作的方法列表。

這些方法中的許多都旨在幫助開發人員在開發或除錯階段部署和測試HTTP應用程式。

如果web伺服器配置不當,這些HTTP方法可能被用於惡意目的。

此外,還將檢查一些高脆弱性,如跨站點跟蹤(XST),這是一種使用伺服器的HTTP跟蹤方法的跨站點指令碼編制形式。

在HTTP方法中,開發人員最常用GET和POST來訪問web伺服器提供的資訊。

HTTP還允許其他一些不太為人所知的方法。

以下是一些方法:

  • HEAD
  • GET
  • POST
  • PUT
  • DELETE
  • TRACE
  • OPTIONS
  • CONNECT

這些方法可能會對一個web應用程式構成重要的安全風險,因為他們允許攻擊者修改儲存在web伺服器的檔案,刪除伺服器上的web頁面,並上傳一個web殼到伺服器,導致偷竊合法使用者的憑據。

此外,當翻尋伺服器時,必須禁用的方法是:

PUT 該方法允許客戶端在web伺服器上上傳新檔案。攻擊者可以通過上傳惡意檔案(例如通過呼叫cmd.exe執行命令的ASP或PHP檔案)利用它,或者簡單地使用受害者的伺服器作為檔案儲存庫。
DELETE該方法允許客戶端刪除web伺服器上的檔案。攻擊者可以利用它作為一種非常簡單和直接的方法來破壞web站點或發起拒絕服務(DOS)攻擊。
CONNECT

這種方法允許客戶端使用web伺服器作為代理
TRACE 此方法簡單地將傳送到伺服器的任何字串回傳給客戶機,主要用於開發人員的除錯目的。這種方法最初被認為是無害的,現在可以用來發動一種稱為跨站點追蹤的攻擊,這種方法被Jeremiah Grossman發現。

如果應用程式需要上述任何一種方法,比如在大多數情況下REST Web服務可能需要PUT或DELETE方法,那麼檢查它們的配置/使用是否正確地限制在可信的使用者和安全的環境中是非常重要的。

許多web環境允許基於謂詞的身份驗證和訪問控制(VBAAC)。

這基本上只是使用HTTP方法(如GET和POST)的安全控制(通常使用)。讓我們舉個例子讓你更好地理解。

[JAVA EE web XML file]

[xml]
<security-constraint>
<web-resource-collection>
<url-pattern>/auth/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>root</role-name>
</auth-constraint>
</security-constraint>
[/xml]

在上面的示例中,規則僅限於/auth目錄的根角色。

但是,即使在對上述角色的訪問受到限制之後,也可以使用HTTP謂詞調整繞過這個限制。正如我們看到的,上面提到的配置只限制了使用GET和POST方法。

我們可以很容易地繞過這個使用頭部方法;您還可以嘗試任何其他HTTP方法,如PUT、TRACK、TRACE、DELETE等。

此外,您還可以嘗試通過傳送任意字串(如ASDF)作為HTTP謂詞(方法)來繞過相同的問題。

以下是一些條件,是有可能繞過的:

  • 它的GET功能不是冪等的,也不是執行任意的HTTP方法
  • 它使用列出HTTP謂詞的安全控制元件
  • 安全控制無法阻止HTTP方法,不列在這些是最常見的場景,你可以繞過相同的。它還取決於規則的錯誤配置。

我們怎樣繞過VBAAC與HTTP方法

1. 使用HEAD方法

如上所述,HEAD方法用於獲取與GET相似但沒有響應體的結果。假設您的應用程式中有一個URL受到安全約束的保護,該約束僅使用GET和POST限制對/Auth目錄的訪問。

http://httpsecure.org/auth/root.jsp?cmd=adduser

如果您嘗試在瀏覽器中強制瀏覽到該URL,則安全約束將檢查規則,以檢視所請求的資源和請求者是否得到了授權。

第一個規則將檢查來自瀏覽器的HTTP方法,因此它應該是一個被安全約束阻止的GET或POST方法。

如果您使用瀏覽器代理(如BurpSuite)攔截請求,並通過更改GET to HEAD方法來生成它,因為HEAD方法沒有在安全約束中列出,所以請求將不會被阻止。

因此,adduser函式將被成功呼叫,並且由於HEAD功能,您將在瀏覽器中獲得空響應。

2. 使用任意的HTTP謂詞

大多數平臺都允許使用任意的HTTP動詞,比如PHP、JAVA EE。

這些方法的執行類似於GET請求,這使您能夠繞過相同的請求。

最重要的是,使用任意方法的響應不會像HEAD方法那樣被剝離。您可以很容易地看到內部頁面。

用任意方法,代替HEAD方法可以檢視頁面原始碼。

3.一些供應商允許HEAD頭部動詞

許多伺服器供應商預設允許頭動詞,例如:

  • APACHE 2.2.8
  • JBOSS 4.2.2
  • WEBSPERE 6.1
  • TOMCAT 6.0
  • IIS 6.0
  • WEBLOGIC 8.2

允許使用HEAD方法根本不是一個漏洞,因為它是RFC中的一項需求。

讓我們看看一些最流行的過時的應用程式安全機制,看看我們是否可以使用它們繞過VBAAC。

以下是可能受到謂詞篡改技術影響的伺服器。

JAVA EE

允許HTTP動詞在策略中—YES

繞路可能—YES

HEAD可以在policy中—YES

.htaccess

允許HTTP謂詞在Policy中—YES

Bypassing Possible繞路可能—YES(如果沒有設定)

HEAD可以在policy中—YES

ASP.NET
允許在策略中使用HTTP動詞—YES
繞路可能—YES(如果沒有設定)

HEAD可以在policy中—YES

Java EE容器

讓我們考慮以下安全約束策略:

[bash]
<security-constraint>
<display-name>Example Security Constraint Policy</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<!– Define the context-relative URL(s) to be protected –>
<url-pattern>/auth/security/*</url-pattern>
<!– If you list http methods, only those methods are protected –>
<http-method>POST</http-method>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>GET</http-method>
</web-resource-collection></security-constraint>
[/bash]

在上面提到的程式碼中,列出的方法是受保護的,因此只有當對/auth/security目錄中的任何內容的請求使用<http-method>列表中的謂詞時,該規則才會觸發。

實現此策略的最佳方法是阻止未列出的任何方法,但這不是這些機制當前的行為方式,並且您可以看到HEAD動詞不在此列表中。

因此,轉發HTTP HEAD請求將完全繞過此策略,在此之後,應用伺服器將把請求傳遞給GET處理程式。

確保JAVA EE安全的正確方法是從該策略中刪除所有< HTTP -method>元素,這只是將該規則應用於所有HTTP方法,但是如果您仍然希望限制對特定方法的訪問,那麼您需要設定下面提到的兩個策略。

[java]
<security-constraint>
<web-resource-collection>
<web-resource-name>site</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection></security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>site</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection></security-constraint>
[/java]

因此,第一個策略拒絕GET訪問請求,第二個策略拒絕所有訪問請求。

ASP.NET Authorization

讓我們來看看ASP.NET授權安全機制配置,容易被VBAAC繞過。

[vb]
<authorization>
<allow verbs="POST" users="joe"/>
<allow verbs="GET" users="*"/>
<deny verbs="POST" users="*"/>
</authorization>
[/vb]

在上述規則中,使用者JOE只能提交POST請求。

在本例中,這是不能繞過的,原因是GET方法允許所有人使用。

因此,沒有保證繞過使用HEAD 方法。

[bash]
<authorization>
<allow verbs="GET" users="root"/>
<allow verbs="POST" users="joe"/>
<deny verbs="POST,GET" users="*" />
</authorization>
[/bash]

這是容易繞過使用頭部方法。

這是可能的,因為. net隱式地在每個授權中插入了一個“允許所有人”規則。

在適當地列出他們的角色權利之後,附加一個“拒絕所有”規則。

[bash]
<authorization>
<allow verbs="GET" users="root"/>
<allow verbs="POST" users="joe"/>
<deny verbs="*" users="*" />
</authorization>
[/bash]

這將確保通過授權檢查的請求只有那些在授權規則中具有特定HTTP謂詞的請求。

需要記住的幾點

1)始終啟用deny all選項

2)配置你的網路和應用伺服器,完全不允許HEAD請求

感謝您的閱讀

References

https://www.owasp.org/index.php/Test_HTTP_Methods_%28OTG-CONFIG-006%29

http://www.aspectsecurity.com/research-presentations/bypassing-vbaac-with-http-verb-tampering

https://resources.infosecinstitute.com/topic/http-verb-tempering-bypassing-web-authentication-and-authorization/