Webのセキュリティの話ではXSSやCORSやCSRFというワードを何度か目にすることはある。
なんとなーく知っているつもりだけど、今回はXSSについて改めて調べ直してみた
XSS(cross site scripting): クロスサイトスクリプティング
XSSはユーザーが任意のプログラムをWebサイト内で実行できる余地に付け入った攻撃である。
例えば、ブログサービスのコメント機能でjavascriptのコードをそのままHTML内に埋め込めるような仕組みになっているのなら、そこに<script>alert(1);</script>
みたいなコードをそのページを開いた瞬間に実行させることができる。
この事例だと知ってるわという人がいるけど、実はいろんな種類のXSSがあるみたいだ
Stored XSS
これは例で挙げた種類の攻撃だ
ユーザーが入力した悪意のある入力をサーバーがそのままDBに保存してしまい、そのデータを混み込んだページを開いたユーザーの画面でその悪意のコードが実行されてしまう
ざっくりとした攻撃の手順は以下の通り
- 悪意のあるjavascriptのコードをPOSTメソッドで送る
- サーバがそのコードをそのままDBに保存する
- 他のユーザーがページを開く
- サーバーは悪意のあるコードを取得してそれをHTMLに埋め込んでユーザーに表示☠️
Reflected XSS
Reflected XSSとはページURLのクエリパラメーターに指定した悪意のあるコードをページ内にそのまま埋め込み他のユーザーでそのコードを実行させる攻撃だ
ユーザーが埋め込んだものが他のユーザーにそのまま反映されるということから反射型(reflrected)となっているのだろう
Stored XSS(格納型)とは違って悪意のあるコードはDBに保存はされない なのでそれをクエリパラメータに含めたページURLをEmailとか掲示板とかで共有してそれをうっかりクリックしたユーザのブラウザで実行されるという流れになることが多い
以下がざっくりとした攻撃手順
- 悪意のあるコードをクエリパラメータに含んだURLをユーザに渡す
- ユーザがそのURLを開く
- クエリパラメータに含まれた悪意のあるコードをサーバがそのままページに埋め込んで返す☠️
DOM-Based XSS
DOM-Based XSSは悪意のあるコードを埋め込んだページURLを他のユーザにアクセスさせてそのコードを実行させるという点でReflected XSSと似ている
だけど、Reflected XSSとは違って悪意のあるコードはサーバ側で評価されずクライアント側のDOM操作を行うプログラムによってページ内に埋め込まれる
Unlike all other types of cross-site scripting, DOM-based XSS is purely a client-side vulnerability. This means that during a DOM-based XSS attack, the payload never reaches the server. The entire attack happens in the web browser.
DOM-based XSS is similar to reflected XSS because no information is stored during the attack. A DOM-based XSS attack is also conducted by tricking a victim into clicking a malicious URL.
以下がざっくりとした手順
- 悪意のあるコードをクエリパラメータに含んだURLをユーザに渡す
- ユーザがそのURLを開く
- クエリパラメータに含まれた悪意のあるコードをクライアントのDOM操作のプログラムによってページに埋め込まれる☠️
対策
対策は性悪説にのっとってユーザーが入力するものは信用しないことやな
具体的には
- ユーザーの入力値をバリデーションして不正な値を含むリクエストを受け付けないようにする
<
や>
のようなHTMLの文字列はエスケープする- HTMLタグの入力を許容する場合ではそれをサニタイズ(無毒化・消毒)する
などすることで悪意のあるコードがページ内に埋め込まれるのを阻止するのが定石である
まとめ
今回はXSSについてまとめてみました
どの攻撃もユーザーからの悪意のあるコードをそのままページに埋め込めてしまうという脆弱性をついたものであるので
そういった入力をされる可能性も0ではないよということを念頭に置いて、セキュリティを高めていけばいいんじゃねという内容でした