セキュリティ研修アウトプット

# 目次
[1. 秘匿情報の漏洩 - 物理的な漏洩](#1-秘匿情報の漏洩-物理的な漏洩)
[2. 秘匿情報の漏洩 - 他サイト漏洩の影響](#2-秘匿情報の漏洩---他サイト漏洩の影響)
[3. 辞書アタックと強度の弱いパスワード](#3-辞書アタックと強度の弱いパスワード)
[4. 不十分なアクセス権限(パーミッション)](#4-不十分なアクセス権限パーミッション)
[5. 不十分な認証方法の実装](#5-不十分な認証方法の実装)
[6. ディレクトリ・トラバーサル](#6-ディレクトリトラバーサル)
[7. SQLインジェクション](#7-sqlインジェクション)
[8. OSコマンドインジェクション](#8-osコマンドインジェクション)
[9. XSS(クロス・サイト・スクリプティング)](#9-xssクロスサイトスクリプティング)

# 1. 秘匿情報の漏洩 物理的な漏洩
## 物理的手段による漏えい
会社には社外に公開してはいけない
- 顧客や社員の個人情報
- 社内での会議資料
- 財務情報
- 開発中の新商品の情報

などの __機密情報__ がある。これらの情報が物理的に取得可能な状態であると、その情報を得ようとしている第三者に用意に情報を与えてしまう。

_~&emsp;例えば&emsp;~_
- パソコンの画面に機密情報を表示されたままで、その情報を見る
- アカウントのパスワードが紙に書かれていて、忘れないようにデスクの見やすいところに置いてあり、その情報を見る
- ゴミ箱を漁り、欲しい情報の書いてある紙を持ち去る
- ノートパソコン、USBなどの電子媒体や放置されている重要資料などを持ち去る
- SNSに写真を上げてしまった際にうっかり機密情報を載せてしまった

等のことが対策されていないと起こり得ることである。

## 対策
上記の例で言うと、
- PCで機密情報を表示したら使い終わった後にしっかりと閉じること
- パスワード等の大事な情報はどこでも見える場所に置かない
- 機密情報の書いてある紙を破棄する際はシュレッダーにかけるなどして、物理的に見えないようにしてから破棄する
- ノートPCであれば勤務終了後には所定の位置にしまう、持ち帰る、USBの使用後は放置せずにしまう
- 写真をアップする前に目を通して確認する

等の対策が必要である。

プログラムで情報を入手するのがハッキングに思えてしまうが、物理的なハッキングは比較的容易にできてしまうので、情報漏洩しないよう都度適切な対応をとらなければいけない。

# 2. 秘匿情報の漏洩 - 他サイト漏洩の影響
## 他サイトによる漏えいのリスク
近年ではWEBがスマホの普及などにともなって社会インフラと言えるレベルになっている。その中でユーザーは多くのWEBサービスを使い、多くのアカウントを作っている。その際にIDやパスワード忘れてしまうのを防ぐために、 __同じ情報を使い回して__ アカウント登録している人も多い。しかし、一つのアカウント情報が漏洩してしまった場合にその他のサイトにも __同じ情報でログインできる__ ことになるので、被害が大きくなってしまう。

## 対策
複数のアカウントで同じIDやパスワードを使用するのを避け、リスクの分散をする。またその際にPCソフトウェアやスマホのアプリなどのアカウント管理ツールを使うと管理が楽になる。
また近年ではGoogleアカウントに複数サイトのログイン情報を保存することができる。その際にはGoogleアカウントの取り扱いに注意する。

# 3. 辞書アタックと強度の弱いパスワード

## 辞書攻撃とは？
辞書に載っている単語を延々と試すことでパスワードを解読する解析方法のこと。
パスワードを設定する際に、辞書に載っているような単語や身の回りの人やものの名前や数字などを利用する人が多い。それらの単語や数字を用いてしまうと、 __弱いパスワード__ になってしまい、容易に突破されてしまう。
[Top 200 most common passwords](https://nordpass.com/most-common-passwords-list/)のようなサイトもあるので、ここに上位で載っているようなものは避けたい。

## 対策
>安全なパスワードとは、他人に推測されにくく、ツールなどで割り出しにくいものを言います。
>
>(1) 名前などの個人情報からは推測できないこと
(2) 英単語などをそのまま使用していないこと
(3) アルファベットと数字が混在していること
(4) 適切な長さの文字列であること
(5) 類推しやすい並び方やその安易な組合せにしないこと
>
>逆に、危険なパスワードとしては、以下のようなものがあります。このような危険なパスワードが使われていないかどうか、チェックをするようにしましょう。
>
>(1) 自分や家族の名前、ペットの名前
yamada、tanaka、taro、hanako（名前）
19960628、h020315（生年月日）
tokyo、kasumigaseki（住所） 　　　
3470、1297（車のナンバー）
ruby、koro（ペットの名前）
(2) 辞書に載っているような一般的な英単語
password、baseball、soccer、monkey、dragon
(3) 同じ文字の繰り返しやわかりやすい並びの文字列
aaaa、0000（同じ文字の組み合わせ）
abcd、123456、200、abc123（安易な数字や英文字の並び）
asdf、qwerty（キーボードの配列）
(4) 短すぎる文字列
gf、ps
>
>この他、電話番号や郵便番号、生年月日、社員コードなど、他人から類推しやすい情報やユーザIDと同じものなどは避けましょう。

参照　[総務省 国民のための情報セキュリティサイト](https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/privacy/01-2.html)

# 4. 不十分なアクセス権限（パーミッション）
## パーミッションとは？
ファイルやディレクトリに対するアクセス権のこと。
複数のユーザーでPCを共有する場合やサーバー運用する際などに、 __ファイルを他人に不正に操作されないようにする__ ためにパーミッションを設定することができる。ターミナルではchmodコマンドでrwx(read, write, execute)の権限を割り当てることができる。

## 対策
読み込み、書き換え、実行されては困るファイルやディレクトリを洗い出し、適切なパーミッションを割り当てる。

# 5. 不十分な認証方法の実装
## 認証処理をHTMLに埋め込むリスク。
一般的に認証処理はサーバサイドのプログラムで処理されている。その際に認証処理をjavascriptで実装しHTML中に埋め込んでしまうと、デベロッパーツールやページのソースを表示から　__容易に確認__　できてしまう。

# 対策
認証処理などの際に用いるユーザーに見られては困るような重要な情報の処理はサーバーサイドで実行する、暗号化するなどして漏洩を防ぐ。

# 6. ディレクトリ・トラバーサル
## ディレクトリ・トラバーサルとは？
フォルダ(ディレクトリ）を遡り任意のファイルにアクセスする脆弱性。
ウェブアプリケーションは複数のフォルダで構成されており、そのフォルダで __パスの解釈に問題がある__ ことで生じる。相対パスでディレクトリの指定が可能になっているケースなどが当てはまる。
### クエリストリング
URLの末尾に「?」マークを付け、続けて「パラメータ=値」の形式で記述するサーバーに情報を送るためにURLの末尾につけ足す文字列(変数)のことをクエリ文字列(クエリストリング)という。

例えば　
http://example.com/foo?file=secret.txt
のようなクエリストリングでファイル指定できるようにしてしまうと、不正にファイルアクセスされてしまう危険性が高まってしまう。また過大なパラメータを送付できるパラメータ検証不備があると、DoS攻撃(サーバーに過剰な負荷をかける攻撃)を仕掛けられてしまう危険性も高まる。

## 対策
パラメータの外部入力によるファイル指定機能の実装を回避する、相対パスが入り込まないファイル参照設定にする、各種攻撃に対する検知システムを導入するなど。検知システムにはIDS（侵入検知システム)やIPS（侵入防止システム)があり、サーバーや外部ネットワークとの通信の監視・検知を行える。

# 7. SQLインジェクション
## SQLインジェクションとは？
SQLとは、データベースを操作するための問合せ言語。
__外部から意図しないSQLを注入し、不正にデータベースを操作する攻撃__ のことをSQLインジェクションという。例えば

```sql:sql
SELECT * FROM users WHERE user='ユーザー入力' AND password='ユーザー入力'
```

というSQLがあるとする。この場合のuserとpasswordの値をユーザーの入力で受け取り、サーバー側でデータベースのデータと照合して一致した場合にはログインするという機能があった場合に、ユーザー名の入力の際
__xuser'--__
と入力したとする。パスワードはこの場合任意で構わないのでxpasswordとする。するとsqlは
```sql:sql
SELECT * FROM users WHERE user='xuser'--' AND password='xpassword'
```
となる。「'」でxuserのクォーテーションの閉じを確定、sqlでは __「--」以降の文をコメントとみなす__ ため、ANDやpasswordの文がコメント化(コメントアウト)され、 __ユーザー名のみの照合__ になる。すると、xuserというユーザー名データが存在してさえいれば、ログインできる状態になってしまう。
## 対策
セミコロン(;)やシングルクォート(‘)などの特殊文字を他の文字列に置き換える __エスケープ処理__ 行う、半角数字の入力以外を禁止する等の想定外の文字入力を禁止する、データベースサーバーのログの監視、解析する等の対策が必要。

# 8. OSコマンドインジェクション
## OSコマンドインジェクションとは？
OSコマンドとは、OS(オペレーティングシステム)を操作するための命令。os)mac,windows,linuxなど。
__外部から意図しないOSコマンドを注入し、システムを不正に操作する攻撃__ のこと。
ターミナルに入力をして使うシェルを利用することで入力されたコマンドをOSに認識させることが可能。
```shell:シェル
rm "ファイル名"
```
とした場合にはrmで指定したファイルを削除する処理になる。
シェルでは連結文字 「&&」で複数のコマンドを繋げることができる。よって、ユーザー入力を用いてサーバー側で処理をするプログラムがあった場合に、ユーザー入力側で「&& rm "ファイル名"」と入力すると

```shell:シェル
何かしらの処理 && rm "ファイル名"
```
がサーバーで実行されることになる。すると、サーバーの指定されたファイルが削除されてしまう。
シェルコマンドには多くの命令があり、OSコマンドインジェクションが可能な状態になっていると、それらのコマンドを攻撃者側が好き勝手に実行できる状態になってしまう。
## 対策
PHPのexec()、 passthru()、system()、Pythonのos.system()、 os.popen()などプログラム内でシェルを利用するコマンドの関数の入力値に対してチェックを行う、もしくは使わない、入力データに含まれる「;」「|」「&」「<」等の危険な文字を無害な文字に置き換えるエスケープ処理等の対策が必要。

# 9. XSS(クロス・サイト・スクリプティング)
## クロス・サイト・スクリプティング(XSS)とは？
XSS(Cross Site Scripting)とはスクリプト(javascriptのコード等)を脆弱性のあるサイトに送り込み、 __スクリプトを含むHTMLを出力しブラウザ上で実行させる攻撃__ のこと。個人情報の詐取、不正なプログラムの感染などの被害がある。

### XSS脆弱性のタイプ
#### 反射型XSS
攻撃には罠サイトと脆弱性サイトの2サイトを用いる。罠サイト経由で脆弱性サイトにアクセスしたときに悪質なスクリプトが実行される。


#### 格納型XSS

攻撃には、脆弱性サイトのみを用いる。脆弱性サイトのあるにスクリプトを埋め込んだ後は、当該サイトにアクセスするたびにスクリプトが実行される。


## 対策
ブラウザーなどのアプリケーションを常に最新にアップデートすること、Webサイトやメールに含まれているリンクを安易にクリックしないこと、信頼できるWebサイト以外ではjavascriptなどのスクリプト機能を無効にする、
開発側では、ユーザーが入力に使うことのできる文字の種類を制限する等の対策が必要になる。