クロスサイトスクリプティングとSQLインジェクションについて勉強しました。本記事はこれらの攻撃についてまとめています。なお、私はセキュリティに関してはずぶの素人で本記事にも誤りが含まれているかもしれません。その際はコメントでご指摘いただけると幸いです。
クロスサイトスクリプティング(XSS)
どんな攻撃?
脆弱性があるWEBページに悪意のあるスクリプトを埋め込む攻撃です。
どうやって攻撃するの?
URLのパラメータなどに悪意があるスクリプトを設定し、実行させます。
例
GET方式で
http://(脆弱性があるWEBサーバのphpファイル)?para='>"><hr>
などのURLを指定します。このとき、phpファイル内に
$URL[$para]
などのコードがあると
'>"><hr>
が実行され、元のWEBページに線が引かれてしまいます。
上記の例ではWEBページに線が引かれるくらいで大して害のない攻撃でした。しかし、このような脆弱性を放置しておくと次の様な被害が発生することがあります。
どんな影響があるの?
図1のように、元のページを書き換えられてしまったり、意図しない場所に情報が送られてしまったりします。
脆弱性体験学習ツール AppGoat:IPA 独立行政法人 情報処理推進機構によれば、他にも下記のような被害が発生することがあります。
対策は?
<などの特殊文字全てにエスケープ処理を施します。PHPだと下記のコードでエスケープ処理できます。
# 脆弱性のある状態 $URL[$para] # エスケープ処理をした状態 htmlspecialchars($URL[$para], ENT_QUOTES, "UTF-8")
次にSQLインジェクションについてまとめます。
SQLインジェクション
どんな攻撃?
脆弱性のあるWEBページに悪意のあるSQL文を埋め込む攻撃です。
どうやって攻撃するの?
URLのパラメータなどに、悪意のあるSQL文を構成するような文の一部を設定することによって攻撃します。
例
PHPファイル内で
$sql = "SELECT * FROM database WHERE id=' ".$param["id"]". '; "
という文があったとします。このとき、次の様なURLを脆弱性のあるWEBページに送り込みます。
http://(脆弱性があるWEBサーバのphpファイル)?id=' OR 'A'='A'--
このとき、上記のSQL文は次のように組み立てられます。
SELECT * FROM database WHERE id=' ' OR 'A'='A'-- ';
この文のidに関する条件 id = ' ' OR 'A'='A'-- ';は常にTrueとなる条件です(図2)。
これにより、本来は正しいidを指定しなければTrueとなりえない文も、ある一定の条件下ではTrueとなってしまうことを利用した攻撃がSQLインジェクションです。
上記のような攻撃がログインページなどで行われると、正規のユーザではないのに認証を突破できてしまうといったことが起こりえます。つまり、SQLインジェクションを使うことで不正ログインができてしまうのです。
どんな影響があるの?
AppGoatによれば下記のような被害が発生するようです。
- データベースに蓄積された非公開情報を閲覧される。
- データベースに蓄積された情報を改ざん、消去される。
- 認証回避により不正にログインされる。
- ストアドプロシージャなどを利用したOSコマンドを実行させられる
対策は?
静的プレースフォルダに値をバインドすることで、SQL文を組み立てられないようにすることです。 例えば、脆弱性のあるコードとして下記のようなものが挙げられます。
# 脆弱性のあるコード $sql = "SELECT * FROM database WHERE id = ' ".$param["id"]." ';"
このコードを下記のように書き換えることで、SQLインジェクションを防ぐことができます。
# 対策を施したコード
$sql = "SELECT * FROM database WHERE id = ?;" # 静的プレースフォルダ
$ sql -> execute(array($param["id"])) # 値のバインド
本記事のまとめ
クロスサイトスクリプティングとSQLインジェクションの攻撃原理や防御技術についてまとめました。 どちらの攻撃も脆弱性のあるWEBページに何らかのコマンドを埋めこむという点で共通点があります。 また、攻撃が似ている分、防御も似たような技術であることが印象的でした。