UserAgentに起因したXSSの危険性についての話
こんにちは。Kmasaです。先日、研の先輩から主題されたCTFにボコボコにやられたので、そこで学んだことを残しておく。CTFの内容としては、Web分野のXSSを題材とした問題であった。KmasaはXSSの脆弱性診断に関して、入力フォームへの診断文字列入力での診断程度のレベルしかやったことがなかった。(初心者に毛が生えた程度)
(注意: 脆弱性攻撃は自分が管理できる環境下で行いましょう。)
概要
タイトルにあるようにUserAgentの偽装(書き換え)による脆弱性に焦点を当て、今回はXSS攻撃の危険性について詳しく見ていく。
UserAgentとは
webページを閲覧するとき、どのデバイスからアクセスするかマチマチ。スマホやタブレット、さらにPCではWindowsやMac、Linuxといった多種の環境下でウェブページにアクセスできる。UserAgentではどの環境でアクセスしたかを示す情報を持ち、その情報をWebサーバに対して通知する。簡単にいうと、Webページに訪問する際は自分が誰なのかという情報がWebサーバ側に通知されるということ。
(例)Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0
こんな感じでブラウザやOSの種類、バージョンなどが明記されている。
詳しい見方に興味があるやる気者は
を参考に。
もう少し詳しい話をすると、
ブラウザはHTTPと呼ばれるプロトコル(約束事)を介して、Webサーバとやりとりを行う。HTTPは「HTTP Request」と「HTTP Response」に分けられて、RequestではブラウザがWebサーバに対して要求する。
「HTTP Request」は主に、
- 「HTTP Request Line」
- 「HTTP Request Header」
- 「HTTP Request Message Body 」
の3つに分類される。
2つ目の「HTTP Request Header」では様々な情報が保持されており、UserAgentもここに含まれる。他には、
に書かれているような情報がある。
UserAgent偽装について
えっ!UserAgentの偽装ってできるの?
→できるのです!
例えば、Android端末からアクセスしているのに、自分を名乗る際に「私はMacです!」っと自信満々に虚偽の申告ができてしまう。
なぜ、偽装ができるのか!?
本来、UserAgentによりWebサーバは各端末環境に合った情報(HTMLなど)を返す。例えば、スマホ用のページとPC用のページが別々に用意されている場合、UsertAgentでどちらのページを振り分けるかを識別している。
ここで、スマホでwebページにアクセスしているけどPC用のWebページを見たいと思ったとき、UserAgentを偽装してスマホであってもPC用ページ情報を獲得することができる。
XSSについて
XSS攻撃の流れの例としては、
- まず、攻撃者は標的とするWebサイトに罠を仕掛ける。
- 第3者が罠を仕掛けたWebサイトを閲覧。
- そのWebサイト上の罠リンクをクリックする。
- あるWebサイトに飛び、不正なスクリプトを送る。
- ここで、問題のあるWebサイトであれば不正なスクリプトがユーザのブラウザ上で実行される。
- そして、偽ページが表示される。
- ユーザはその偽ページ上で個人情報などを入力する。
- 攻撃者はユーザの個人情報を取得してしまう。
恐ろしい。。。。
詳しくは、
を参考に。
さらに、XSSとCSRFを混同している人が多い(Kmasaも混同していた)のでCSRFとの違いは以下を参考に。
UserAgent + XSSの作用
ここまで、UserAgentとXSSの概要について見てきた。
それでは、本題に戻ろう!(やっと...........)
話を振り返ると、UserAgentを偽装(書き換え)経由でXSS攻撃の危険性はあるのかという問題。
結論から言うと、危険性はある!
先述したとおり、攻撃者は罠の一つとされるURLを仕掛けなければならない。ここで、UserAgentを介して罠を仕掛ければ危険なのでは?と思うかと。
残念ながら(残念じゃない!)UserAgentは第3者によって書き換えはできない。
→そりゃそうか。
書き換えができるとしたら自分自身。自分でUserAgentの書き換えしても自分自身に攻撃してることになるので、よっぽど攻撃されるのが好きな方でない限りしても無駄だと考えてしまうだろう。
こうすると一見、危険性は存在しないように思われるがWebサイトの仕様によっては危険性が存在する可能性がある。1つの例として、XSS対策が施されていない環境でUserAgentにおいて、ユーザからの入力を受け付けて(偽装して)その値(文字列)をWebアプリケーション上でそのまま使うという場合、危険性がある。もう少し詳しく言うと、UserAgentの内容をWebブラウザ上で出力するというWebアプリケーションがあったとする。(一番わかりやすい例で言うと、”UserAgentの確認サイト”かな。)ここで、サニタジングなどの文字列処理が行われていない場合、サーバからのResponseで文字列(偽装したUserAgent)が直接出力されてしまうとXSSが起こる可能性がある。(注意:多分、ここまで話して来たら実際にXSSがあるかどうか試してみたいと思う方もおられるかもしれない。度々言っていますが、他人のサイトなどにおいて無断で許可なく検証すると法にふれちゃうかもしれないのでクレグレも自分が管理できる環境以外では検証しないでください。)
まとめ
今回はUserAgentに起因したXSSというテーマで考えてきたけれど、XSS脆弱性の根本の部分は同じであるということ。つまり、Webサイト上の入力を受け付ける部分に対してはXSS脆弱性が存在する可能性があるということ。(サニタイジングなどの対策が必須)
つまり何が言いたいかというと、入力受け付け部分はWebブラウザ上に表示されている部分だけでなく、UserAgentなどのHTTP Request Header内でも存在し、それを利用したXSS攻撃を実行できてしまう危険性があるということを頭に入れておきたい。
特に、今後Webアプリケーションを実装する場合には注意すべきだろう。
おまけ
実はKmasaにとってはこの記事が第1号のブログとなる。もう少し、簡潔にかけるようになりたい。人にもわかるような記事を書けるようになると今後の研究やその発表にとっても役に立つと思うので、今後もこのような記事をちょこちょこ書いていきたい。
それでは......