1. 程式人生 > >web安全/滲透測試--25--伺服器端包含注入(SSI注入)

web安全/滲透測試--25--伺服器端包含注入(SSI注入)

1、漏洞描述:

SSI是英文Server Side Includes的縮寫,翻譯成中文就是伺服器端包含的意思。從技術角度上說,SSI就是在HTML檔案中,可以通過註釋行呼叫的命令或指標。SSI具有強大的功能,只要使用一條簡單的SSI命令就可以實現整個網站的內容更新,時間和日期的動態顯示,以及執行shell和CGI指令碼程式等複雜的功能。SSI可以稱得上是那些資金短缺、時間緊張、工作量大的網站開發人員的最佳幫手。

(Server-side Includes)伺服器端包含提供了一種對現有HTML文件增加動態內容的方法。apache和iis都可以通過配置支援SSI,在網頁內容被返回給使用者之前,伺服器會執行網頁內容中的SSI標籤。在很多場景中,使用者輸入的內容可以顯示在頁面中,比如一個存在反射XSS漏洞的頁面,如果輸入的payload不是xss程式碼而是ssi的標籤,伺服器又開啟了ssi支援的話就會存在SSI漏洞。

2、檢測條件

1、Web伺服器已支援SSI(伺服器端包含)。

2、Web應用程式在返回HTML頁面時,嵌入使用者輸入。

3、引數值未進行輸入清理。

3、檢測方法

1、黑盒檢測

首先尋找Web伺服器事實上是否支援SSI指令。由於SSI支援很常見,答案几乎是肯定的。然後只需要通過傳統資訊收集技術,瞭解我們的檢測目標執行哪些型別的Web伺服器即可。無論能否成功發現這一資訊,我們都可以通過檢視檢測網站的內容來猜測其是否支援SSL:由於.shtml檔案字尾名是用來表明網頁檔案是否包含SSI指令的,因此如果該網站使用了.shtml檔案,那說明該網站支援SSI指令。然而.shtml字尾名並非是強制規定的,因此如果沒有發現任何.shtml檔案,並不意味著目標網站沒有受到SSI注入攻擊的可能。

下一個步驟。這不僅需要確認是否可以進行SSI注入攻擊,還需要確認我們用來注入惡意程式碼的輸入點。這一步的測試跟測試其它程式碼注入漏洞一樣。我們需要找到執行使用者提交輸入的每一個網頁,並確認應用程式是否正確驗證了所提交的輸入,反之則確認是否存在按輸入原樣顯示的資料(如錯誤資訊、論壇發帖等)。除了常見的使用者提供的資料外,常考慮的輸入變數就是容易偽造的HTTP請求頭和Cookie內容。

一旦我們有了潛在注入點的清單,可以檢查輸入是否得到正確驗證,並找出所提供的資料將在網站按原樣顯示的地方。必須確保我們能夠使用SSI指令中使用的字元:

<!#=/."->and[a-zA-Z0-9]             //能在同一個地方通過伺服器並被解析。

利用驗證的缺乏就像使用如下所示的字串進行表單提交那樣容易:

<!--#includevirtual="/etc/passwd" -->

不要用傳統的字串:

<script>alert("XSS")</script>

當下次伺服器需要提供指定的頁面時,就會解析該指令,這樣頁面就包含了Unix標準密碼檔案內容。

如果Web應用程式將使用這些資料建立一個動態產生的頁面,在HTTP頭資訊中也可以執行該注入:

GET/HTTP/1.0
Referer:<!--#exec cmd="/bin/psax"-->
User-Agent: <!--#virtualinclude="/proc/version"-->

2、灰盒檢測例項

如果能檢視應用程式的原始碼,我們可以輕鬆找出:

A、是否使用SSI指令;如果使用,web伺服器就啟動了SSI支援。這就導致SSI注入至少成為需要調查的潛在問題;

B、使用者輸入、cookie內容和HTTP標題頭在哪裡處理;很快就能生成一張完整的輸入變數清單;

C、如何處理輸入、使用什麼樣的過濾方式、應用程式不允許什麼樣的字元通過、考慮了多少種編碼方式。使用grep執行這些步驟,找到原始碼中的正確關鍵詞(SSI指令、CGI環境變數、涉及使用者輸入的變數任務、過濾函式等等)。

4、修復方案

由於未對使用者輸入正確執行危險字元清理,可能會在Web伺服器上執行遠端命令。這通常意味著完全破壞伺服器及其內容。

1、清理使用者輸入。禁止可能支援SSI的模式/字元。

2、由於SSI會帶來許多安全風險,建議您不在Web站點中使用SSI,即關閉伺服器對ssi的支援即可。