【脆弱性対応備忘録】脆弱性の種類とチェック・リストアップと簡単な対応例

#危険性と対策項目
##脆弱性の種類
###クロスサイトスクリプティング（XSS）
閲覧者から送信されたデータをコンテンツの一部として
他の閲覧者に見せるようなプログラムがあるWebサイトで、
送信データに悪意のあるスクリプト（JavaScriptコード）や
HTMLタグの断片を挿入・実行することが可能な状態。
認証情報が取得されたり、Webページの内容を改ざんされ、
フィッシング詐欺に悪用される可能性があります。

- 参考：
[IT用語辞典 e-Words](http://e-words.jp/w/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0.html)、
[＠IT](http://www.atmarkit.co.jp/ait/articles/0211/09/news002.html)

###SQLインジェクション
データベースと連動したWebサイトで、
データベースへの問い合わせや操作を行うプログラムに
パラメータとして悪意のあるSQL文の断片を挿入・実行することが可能な状態。
データベースを改ざんされたり、不正に情報を入手される可能性があります。

- 参考：
[IT用語辞典 e-Words](http://e-words.jp/w/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html)、
[＠IT](http://www.atmarkit.co.jp/ait/articles/0611/02/news127.html)

###OSコマンドインジェクション
閲覧者からのデータの入力や操作を受け付けるようなWebサイトで、
プログラムに与えるパラメータに
Webサーバで動作しているOSのコマンドとして解釈できる文字列を
挿入・実行することが可能な状態。
遠隔からサーバを乗っ取って不正に操作される可能性があります。

- 参考：
[IT用語辞典 e-Words](http://e-words.jp/w/OS%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html)

###ディレクトリリスティング
URLからファイル名を削除し、Webサーバのディレクトリに移動した際
ファイル一覧やディレクトリ一覧が表示されること。
Webサーバ側が公開を意図しないファイルにアクセス出来る可能性があります。

- 参考：
[【サイバー攻撃大辞典】](http://www.errorcode-search.com/security/cyber-attack/directory-listing.html)、[Webセキュリティの小部屋](http://www.websec-room.com/2014/01/17/1569)

##チェック項目
###1. $_SERVER['PHP_SELF']または$_SERVER['REQUEST_URI']を使ってないか、入力値の想定と対策ができているか
「PHP_SELF」はechoやprintでそのまま出力すると、
アドレスバーにタグやjavascriptを記述した場合にも有効になるためエスケープする必要があります。「REQUEST_URI」は指定されたURLそのものが格納されるため、同じくエスケープする必要があります。
URLにパラメータを必要としない場合は「$_SERVER['SCRIPT_NAME']」を使用したほうがよい。
エスケープの例

```php
<?php print("http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); ?>
```
↓

```php
<?php print("http://" . $_SERVER["HTTP_HOST"] . htmlspecialchars($_SERVER["REQUEST_URI"], ENT_QUOTES, 'UTF-8')); ?>
```

- 参考：
[tekboy](http://www.tekboy.net/archives/712)、[ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20070227/263356/)

また、入力値については案件ごとに異なりますが、主にユーザーに入力させたいデータやURLで受け取るパラメータが数値か文字列か、特定のワードかを想定し、入力されるべきデータ以外の文字列を固定させるなどの対応が必要です。
以下は変数「$hensuumei」に何らかの値があり、
その値が数値または数値文字列ではない値が挿入された場合に
「123」を固定値として設定する処理です。

※浮動小数点数、十六進法、二進表を含む

```php
if(!is_numeric($hensuumei) && $hensuumei!== ''){
$hensuumei= 123;
}
```
※数字のみを許可する場合

```php
if(!ctype_digit((string)$hensuumei)){
    $hensuumei= 123;
}
```

- 参考：
[そふぃのphp入門](http://php-beginner.com/function/var/is_numeric.html)、
[Let's Postgres](http://lets.postgresql.jp/documents/tutorial/with_php/against_sql_injection/escape_quote)

###2. ランダムで数点ディレクトリにアクセスし、一覧が表示されてしまう場合はindexファイルを設置（サーバ設定を確認）
画像などのディレクトリ直下にアクセスした際に一覧が表示される場合、
サーバ管理者にApache のディレクトリリスティングを無効に設定するよう問い合わせるか、
空のindexファイルを設置することで回避できます。

- 参考：[Webセキュリティの小部屋](http://www.websec-room.com/2014/01/17/1569)

###3. 不要なファイルは削除
調査や対応で余計な労力がかかるのをを防ぐためにも
日頃から整理をしておくことが賢明です。

###4. ワードプレスやプラグインは最新にアップグレード
WordPress (ワードプレス) はオープンソースのブログ／CMS プラットフォームです。
定期的にバージョンアップし、リリース情報・更新履歴なども公開しているため、
悪意あるユーザーから攻撃を受けるリスクも高いといえます。
案件ごとに設定が異なる場合がありますが、
管理画面でボタンを押すだけで実行できる自動アップグレードと、
直接ファイルをアップロードする手動アップグレードがあります。
特に理由もなく管理画面から自動更新ができない場合、
サーバ・案件の管理者に許可を得た上でwp-config.phpの末尾あたりに
以下の記述をすると管理画面から自動更新が可能になります。
ワードプレス自体は使っていなくても、jQueryを使ったプラグインやjQuery本体に関しても、
定期的に最新版をチェックしてアップグレードしておきましょう。

```php
define('FS_METHOD','direct');
```

- 参考：
[I.M.D](https://www.imd-net.com/column/3006/)、
[ハイファイブクリエイト](http://highfivecreate.com/blog/wordpress/2403.html)、
[タダで学べるWebコンサルタント養成講座](http://blog.shopconsul.com/tools/wp-secure.html)、
[web design mondo](http://mondotab.com/archives/138.html)

##リストアップ（確認とふりわけ）
サーバのファイルを一度すべてダウンロードし、
心当たりのあるワードで検索・リストアップしていきます。
他にも検索やアンケートなどユーザーが操作可能なページ、
データベースを参照するなど、プログラムを使用しているページがあればチェックするに越したことはありません。
チェック後問題があれば各仕様に沿って順次対応していきます。

###検索項目例
Dreamweaverなどのエディタで
心当たりのある文字列で検索し、
プログラムを使用しているめぼしいファイルを洗い出します。

1. `<form`
2. `method="post"`
3. `method="get"`
4. `mysql`
5. `htmlspecialchars`
6. `PHP_SELF`
7. `REQUEST_URI`

###チェック方法例
Firefoxにて以下のような文字列を
フォームやアドレスバー末尾に入れ実行し、スクリプトが効かなければOK。
以下は「PHP_SELF」等でURLをページ内に出力する記述があった場合
ページのタグ内に終了タグとスクリプトを滑り込ませるものです。

```text
/%22%3E%3CiMg%20SrC=x%20OnErRoR=alert%28xss%29%3E
/"><iMg SrC=x OnErRoR=alert(xss)>
/?param=1"><script>alert('xss')</script>
```