セキュリティ

XSSにはいろんな種類があるのでまとめてみた

Webのセキュリティの話ではXSSやCORSやCSRFというワードを何度か目にすることはある。

なんとなーく知っているつもりだけど、今回はXSSについて改めて調べ直してみた

XSS(cross site scripting): クロスサイトスクリプティング

XSSはユーザーが任意のプログラムをWebサイト内で実行できる余地に付け入った攻撃である。

例えば、ブログサービスのコメント機能でjavascriptのコードをそのままHTML内に埋め込めるような仕組みになっているのなら、そこに<script>alert(1);</script>みたいなコードをそのページを開いた瞬間に実行させることができる。

この事例だと知ってるわという人がいるけど、実はいろんな種類のXSSがあるみたいだ

Stored XSS

これは例で挙げた種類の攻撃だ

ユーザーが入力した悪意のある入力をサーバーがそのままDBに保存してしまい、そのデータを混み込んだページを開いたユーザーの画面でその悪意のコードが実行されてしまう

ざっくりとした攻撃の手順は以下の通り

  1. 悪意のあるjavascriptのコードをPOSTメソッドで送る
  2. サーバがそのコードをそのままDBに保存する
  3. 他のユーザーがページを開く
  4. サーバーは悪意のあるコードを取得してそれをHTMLに埋め込んでユーザーに表示☠️

Reflected XSS

Reflected XSSとはページURLのクエリパラメーターに指定した悪意のあるコードをページ内にそのまま埋め込み他のユーザーでそのコードを実行させる攻撃だ

ユーザーが埋め込んだものが他のユーザーにそのまま反映されるということから反射型(reflrected)となっているのだろう

Stored XSS(格納型)とは違って悪意のあるコードはDBに保存はされない なのでそれをクエリパラメータに含めたページURLをEmailとか掲示板とかで共有してそれをうっかりクリックしたユーザのブラウザで実行されるという流れになることが多い

以下がざっくりとした攻撃手順

  1. 悪意のあるコードをクエリパラメータに含んだURLをユーザに渡す
  2. ユーザがそのURLを開く
  3. クエリパラメータに含まれた悪意のあるコードをサーバがそのままページに埋め込んで返す☠️

 

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.

以下がざっくりとした手順

  1. 悪意のあるコードをクエリパラメータに含んだURLをユーザに渡す
  2. ユーザがそのURLを開く
  3. クエリパラメータに含まれた悪意のあるコードをクライアントのDOM操作のプログラムによってページに埋め込まれる☠️

 

対策

対策は性悪説にのっとってユーザーが入力するものは信用しないことやな

具体的には

  • ユーザーの入力値をバリデーションして不正な値を含むリクエストを受け付けないようにする
  • < >のようなHTMLの文字列はエスケープする
  • HTMLタグの入力を許容する場合ではそれをサニタイズ(無毒化・消毒)する

などすることで悪意のあるコードがページ内に埋め込まれるのを阻止するのが定石である

まとめ

今回はXSSについてまとめてみました

どの攻撃もユーザーからの悪意のあるコードをそのままページに埋め込めてしまうという脆弱性をついたものであるので

そういった入力をされる可能性も0ではないよということを念頭に置いて、セキュリティを高めていけばいいんじゃねという内容でした

-セキュリティ

© 2023 Shiro's secret base