將Web服務與mod_security結合起來
Blue銀行的web服務使用www.bluebank.example.com/axis/getBalance.jws的URL。為這個資源創建一套規則通常一個不錯的主意。為達此目的,Blue銀行將此資源通過以下方式加入到httpd.conf:
SecFilterEngine On
SecFilterDefaultAction "deny,log,status:500"
# Other rules
# ------- Rules for web services --------------------------
SecFilterInheritance Off
SecFilterDefaultAction "deny,log,status:500"
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding On
#---------------------------------------------------------------
下面的指令塊為/axis/getBalance.jws應用了過濾標准。為了保護web服務它添加了必要的規則。這些規則在
# ------- Rules for web services --------------------------
SecFilterInheritance Off
SecFilterDefaultAction "deny,log,status:500"
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding On
#---------------------------------------------------------------
在這裡有兩個重要的指令:
SecFilterInheritance Off
這個指令關閉其他所有規則,為新的location建立一套規則創建一個干淨的空間。(譯者注:初始化,建立新空間)
SecFilterScanPOST On
由於web服務的方法調用是通過POST,所以這個指令是打開POST過濾器。
有了上面的配置,Blue Bank已經在mod_security中部署了一個“護盾”(譯者注:防火牆)。該“護盾”也知道它的防護目標——客戶端通過SOAP封套發送的id的內容。
防范攻擊
作為防護所有惡意請求的第一步,Blue銀行需要限制從客戶端發送的id的值,防止傳來無效值。SOAP請求用XML標簽將id信息發送到web服務的代碼中,像如下這樣:
為了過濾該請求,mod_security必須有一些途徑去讀取與標簽相關的值(在這裡標簽是id);這個例子中的值是12123,mod_security提供一些途徑限制通過POST請求發送的值。其中的一個方法就是使用自定義過濾器:
SecFilterInheritance Off
SecFilterDefaultAction "deny,log,status:500"
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding On
SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
上面標示出來的行對請求中的id進行限制。POST_PAYLOAD截取POST數據塊並與正則表達式(<\s*id[^>]*>)進行匹配。該正則表達式確保id標簽存在,當存在的情況下才進行其余的檢查。換句話說,如果id標簽存在,mod_security繼續下一個檢查。
如果發送的POST請求中存在一個id,服務器能夠執行信息。然而,一個惡意的客戶端能夠修改這個值加入惡意內容。有四種最流行的攻擊方式。
攻擊方式1:變量長度緩沖區注入(譯者注:緩沖區溢出)
當把一個大的緩沖數據傳給一個變量時可能會引起應用程序運行不正常或者在執行的時候“宕”掉的安全隱患。下面的規則將保護id變量免受此類攻擊:
SecFilterInheritance Off
SecFilterDefaultAction "deny,log,status:500"
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding On
SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>" chain
SecFilterSelective POST_PAYLOAD "<\s*id[^>]*>.{6,}""deny,status:500"
在上面的指令中,正則表達式<\s*id[^>]*>.{6,}限制緩沖變量的長度為5個字符。為了檢查上面的代碼塊是否起作用,Blue銀行可以發送兩個請求,一個請求符合約束,另一個越界。
POST /axis/getBalance.jws HTTP/1.0Content-Type: text/XML; charset=utf-8SOAPAction: ""Content-Length: 576Expect: 100-continueHost: www.bluebank.example.com
...HTTP/1.1 200 OKDate: Mon, 03 Jan 2005 19:24:10 GMTServer: apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4Set-CookIE: JSESSIONID=69C6540CC427A8B064C0795ADDFC20EA; Path=/axisContent-Type: text/XML;charset=utf-8Connection: close
在上面的例子中,將一個包含5個字符的緩沖數據傳給web服務,服務收到後發回一個響應值為$2500。下面的例子將更改12123這個數據為121234,新的數據有6個字符,將得到一個新的響應信息,如下: POST /axis/getBlalance.jws HTTP/1.0Content-Type: text/XML; charset=utf-8SOAPAction: ""Content-Length: 577Expect: 100-continueHost: www.bluebank.example.com ...HTTP/1.1 500 Internal Server ErrorDate: Mon, 03 Jan 2005 22:00:33 GMTServer: apache/2.0.50 (Unix) mod_ssl/2.0.50 OpenSSL/0.9.7d mod_jk2/2.0.4Content-Length: 657Connection: closeContent-Type: text/Html; charset=iso-8859-1 The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the servererror log. mod_security模塊拒絕了該請求。返回500狀態。這說明請求根本沒有到達web服務層。Blue 銀行成功地防范了最常見和常常被忽略的緩沖區溢出攻擊。(譯者注:HTTP定義的500狀態是服務器執行錯誤) 第二種攻擊:元字符注入 另外一個主要的針對輸入變量的威脅來自於使用像%,單引號(’),雙引號(”)。這些字符會導致SQL注入攻擊,並且可能會導致不必要的信息洩漏。采用下面的策略將保護web服務防范此類攻擊。 SecFilterInheritaInternal Server Error