Script Gadgetsのデモを作成してみた
2019年1月にOWASP Kansai スクールキャラバン2019 〜NAIST編~にてLTをさせて頂きました。
内容としては、”Code-Reuse Attacks for the Web: Breaking Cross-Site Scripting Mitigations via Script Gadgets”というACM CCS 2017で発表された論文の紹介とデモを行いました。
論文:
https://github.com/google/security-research-pocs/blob/master/script-gadgets/ccs_gadgets.pdf
今回はその際に作成したScript Gadgetsを利用したXSSのデモの作成手順を紹介します。
Script Gadgetsとは?
まずScript Gadgetsとは何か、ですが
Webページやライブラリに存在する正当なJavaScriptコードのブロック
のことです。
つまるところただのJavaScriptの一部のことですが、これを悪用することでClient-Side XSSを引き起こすことが可能です。
先ほど紹介した論文ではこのScript Gadgetsを利用することで、現在普及しているXSS対策(HTMLサニタイザ、XSSフィルタ、WAF、CSP)を回避することが可能だと示しています。
実際にやってみる
XSS対策が回避可能というなら実際にやってみることにします。
今回作成するデモは、論文の中で紹介されていた中でも再現が簡単そうなXSSフィルタの回避にすることにしました。
サーバの準備
まずWebサーバを用意します。今回は仮想マシンにFedoraが何故か残っていたので再利用することにして、Apacheを起動しておきます。
コンテンツの準備
コンテンツは正直必要ないですが、発表のデモということもあって普通のWebサイトを装った方が面白い気がしたので、我らがinet-labのWebサイトのミラーを作成しました。
インジェクション部分の作成
コードを挿入できる箇所を作成するために、今回はサイト内検索ボックスを用意し、結果画面で検索文字列を表示するようにして、明らかなXSSのインジェクション部分を作成しました。
小休止
この時点で当然XSSは通るはずなんじゃねということで、Chrome上でやってみると、
残念ながらChromeのXSS AuditorというXSSフィルタが働いてXSSは成立しないことがわかりました。
Script Gadgetsの用意
論文では、DojoというJavaScriptライブラリにXSS Auditorを回避するScript Gadgetsが存在するとされていました。
ということでDojoをコンテンツの中に読み込ませました。(当時最新のものでVer1.9.3)
当然検索結果画面でDojoを読み込ませる必要があります。
エクスプロイトの入力
ということで論文に書いてあったエクスプロイトを入力してみます。
無事に発火させることが出来ました。
作成手順は以上になりますが、発表でも無事に発火してくれたので良かったです。
最後に
記事書くのすげえ疲れるという新しい発見がありました。
ブロガーすげえ