XSS
XSSとは
TODO
XSS問の典型的パターン
TODO
SourceとSink
Source: XSSが起こるデータの入力元のこと
Sink: XSSが起こるデータの出力先のこと
攻撃者が操作できるSourceと、それが反映されるSinkを見つけるのが重要
Stored XSS
サーバーがユーザー入力値をデータベースなどに格納し、それを動的にHTMLに埋め込む際に起こるケースのXSS
要は保存されたデータによるXSS。データが格納されている限り永続的に起こるのが特徴
Reflected XSS
サーバーがユーザー入力値をその場でHTMLに埋め込む際に起こるケースのXSS
例えばURLのクエリパラメータで起こるXSSがReflected XSS。リクエストのパラメータに対して反射的に起きる点が重要。
DOM-based XSS
JavaScriptの安全でないDOM操作によって起こるケースのXSSのこと
例えば安全でないHTMLをinnerHTMLに代入することにより起きるXSSがDOM XSS。サーバーの処理ではなくクライアントの処理でXSSが起きる点が重要。
mutation XSS
広義では「HTMLの解釈の違いを悪用したXSS」、狭義では「ブラウザの誤ったHTML解釈に起因するXSS」と自分は捉えている。
広義の方はDOMPurifyなどのサニタイズライブラリのバイパスなどがそれにあたる。
狭義の方は本来安全であるDOM操作がXSSにつながるという点で0dayになりうる。例えばDOMのinnerHTMLを別のDOMのinnerHTMLに移し替えたいときに、DOMから文字列へのシリアライズと文字列からDOMへのデシリアライズがうまく嚙み合わず元のDOM要素とは違うDOMが生成されてしまい、それによりXSSが起きるケースがある。
TODO: CVE貼る
Encodingを利用したXSS
ブラウザが文字のEncodingを識別できないとき、ブラウザはEncodingを推測(sniff)しようとする
UTF-7は現在は使えない
SekaiCTF 2024 htmlsandbox
XSSにまつわる攻撃手法
XSS対策
DOMPurify
一番使われてるサニタイズライブラリ
メンテナンスされているので基本的には安全
imgタグなどによってGETリクエストを飛ばすことはできる
XHTMLなのにHTMLとしてサニタイズしていたり、変なタグを許可していたりするとXSSにつながる
Imaginary CTF 2023 - Sanitize
DOM Clobberingでエラーを起こせる
SECCON CTF 2022 Finals - light-note
javascript:
ブラウザのアドレスバーにjavascript:から始まるURLを指定すると、JavaScriptを実行することができる
例えば<a href='javascript:alert(1)'>の要素をクリックすると、画面遷移は起きずにalertが実行される。
location.hrefにjavascript:URLを設定してもJavaScriptが実行される
imgタグのsrc属性などでは無理。あくまでアドレスバーの変更が必要
java\tscript:など間にタブなどを入れても動く
data:
TODO
XSSには基本使えなくなった
svgやXMLでもXSSできる
TODO content-type-research貼る
ペイロードの短縮
window.name
window.openやiframeから指定することができる
TSG CTF 2023 - Brainfxxk Challenge
eval("'"+URL)
HTMLのイベントハンドラからJSが発火したとき、スコープにdocumentがセットされる
そのため、ここで参照してるURLはwindow.URLではなくdocument.URL
http://xss.example.com/#';alert(1)のようにexploitする
puppeteerのデバッグポートに介入したり
innerHTMLに入れた時点で即時発火するやつ: <svg><svg/onload=alert(1)>
ElectroVolt
情報を自分のサーバーに飛ばすときはnavigator.sendBeaconやlocation.hrefが便利