【学習記録】『HTTPの教科書』第11章　読書メモ　〜N予備校の復習を添えて〜

【学習記録】『HTTPの教科書』第6章~第10章　読書メモ　〜N予備校の復習を添えて〜( https://qiita.com/Molly95554907/items/2e9c44a1402cb6e95e27 )の続き

<h5>第11章</h5>
●webへの攻撃技術

・HTTPは必要なセキュリティ機能が無い（盗聴可能・誰でもリクエスト可能・サーバー/クライアントが誰かチェックできない）
↓
認証やセッション管理、暗号化の機能が無い

●webアプリケーションへの攻撃パターン
・能動的攻撃
攻撃者が直接webアプリケーションに対してアクセスし攻撃コードを送る

例）SQLインジェクション、OSコマンドインジェクション

・受動的攻撃
罠を利用しユーザーに攻撃コードを実行させる。
攻撃者は直接webアプリケーションに対して攻撃は行わない

<h5>Web攻撃の例</h5>
●クロスサイトスクリプティング（XSS）
Webサイト上で、不正なHTMLタグやJavaScriptを動かす。発生箇所は動的にHTMLを動かすところ。

HTMLにテキストを入力する際に、HTMLタグやJavaScriptタグを一緒に打ち込みそれを作動させることで攻撃。

<h5>N予備校３章「XSS脆弱性の対策」</h5>

```js
<script>window.onload=function(){document.getElementsByTagName('h2')[0].innerHTML='新規投稿<small>(本名を入力しても自動的に除去されます)</small>';}</script>

```
このコードを掲示板の投稿欄に書き込んで投稿するとスクリプトが実行される。

getElementByTagName('h2')[0]関数が実行され、h2の要素の一番目のものが取得される。.innerHTMLで、HTMLのコードが書き換えられる。

Pugを使い、投稿欄ではタグを使った処理が行えないようにして対策する。

※N予備校４章ではPugモジュールを利用してHTMLを書いている。PugはJavaScriptingを受け付けないので脆弱性を補えている。


●ユーザーのクッキーを奪う
webアプリケーションドメインのCookieにアクセスし、ユーザーのCookie情報を盗む。

●SQLインジェクション
Webアプリが実行しているSQLに対し不正を実行する。SQLの中身を消したり書き換えたりする。

<h5>N予備校４章「セキュリティの対策と公開」</h5>
SQLインジェクションは、ユーザー入力したものをそのままSQLに入れている時危ない。
N予備校４章、予定調整くん作成ではsequelizeのfindAll関数をかけてSQLの中身を取得しているので問題ない。

※sequelize（ https://sequelize.org/ ）とは、SQLに簡単にアクセスするための、Node.jsのライブラリ

●OSコマンドインジェクション
webアプリケーションを経由してOSコマンドを不正に実行する。シェルを呼び出す関数がある時に実行される。LinuxやWindowsなどの、コマンドラインからプログラムを起動するプログラムが発生箇所。

<h5>N予備校３章「脆弱性」</h5>
```js
'use strict';
const http = require('http');
const cp = require('child_process');
const server = http.createServer((req, res) => {
  const path = req.url;
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  });
  res.end(cp.execSync('echo ' + path));
});
const port = 8000;
server.listen(port, () => {
  console.info('Listening on ' + port);
});

```
HTTPモジュールと、child_processという子のプロセスを作るモジュール（ https://nodejs.org/api/child_process.html ）を読み込む。

Webサーバーを作成し、リクエストが成功したら200というHTTPヘッダーと、リクエストしたパス名を返している。

↓

 http://localhost:8000/hoge 
にアクセスすると、アクセスしたパス名である
/hoge
と表示される。

http://localhost:8000/hoge;date 
というアドレスにアクセスすると。アクセスしたパス名である/hoge;dateが表示される・・・と思いきや、

/hoge
2019年  2月 19日 火曜日 16:47:08 JST

と表示される。

; という文字がコマンドの区切りを表す記号であるため、dateコマンドが実行された。

↓

http://localhost:8000/;○○
の○○に悪意のあるコマンドを入れたリクエストがなされると、
・ソースコードやパスワードの表示
・サーバーの停止や再起動
・サイトの改ざん
・サーバーのユーザーの乗っ取り
・外部サイトへの攻撃

が行われれてしまう。

●HTTPヘッダーインジェクション
HTTPのヘッダを書き換える。cookieの値を使ったり、URLを使ったりリダイレクトしたりするところが発生箇所。


●メールヘッダーインジェクション
Webアプリケーションのメール送信機能において、攻撃者が任意のToやSubjectなどのメールヘッダーを不正に追加する。


●ディレクトリトラバーサル
公開することを意図していないディレクトリのファイルに対し、不正にディレクトリを横断してアクセスすること。「../」などの相対パス指定や絶対パス指定でファイルを外部から呼び出す。

<h5>N予備校４章「セキュリティの対策と公開」</h5>
N予備校４章、予定調整くん作成ではexpressフレームワークのrouterでアクセス管理をしており、UserはPublic以外のフォルダを見れないようにしているから問題ない。


●リモートファイルインクルージョン
スクリプトの一部を別ファイルから読み込む時に、攻撃者が指定した外部サーバーのURLをファイルとして読み込ませることで、任意のスクリプトを実行する。

主にPHPに存在する脆弱性。

●強制ブラウジング
公開することを意図していないファイルが閲覧可能になっている脆弱性。
隠したいファイルを、URLを隠すことで隠した気になっていても、そのパスにアクセスされると閲覧されてしまう。

●不適切なメッセージ処理
エラーメッセージにより脆弱性がバレてしまう実装のこと。

例）
・データベースがエラーを返す時のエラーメッセージから、使っているデータベースがMySQLだとバレる

・「メールアドレスは登録されていません」というメッセージから、入力したメールアドレスが登録済みのものか否かを特定されてしまう

●オープンリダイレクト
URLのパラメーターをすり替えて、アクセスした人を別のページに誘導する。

例）http://example.com/?redirect=http://ex.jp

というページのパラメーターを

http://example.com/?redirect=http://konnichiha.jp


にすり替えてリダイレクト先を変える


●セッションハイジャック
攻撃者がユーザーのセッションIDを不正に入手し、そのセッションIDを不正に利用することでユーザーになりすます

<h5>N予備校３章「セッション固定化攻撃脆弱性の対策」</h5>
「秘密の掲示板」に対してguest1でログイン
↓
ChromeのディベロパーツールでApplication の Cookies の （サーバー名）をクリックすると、guest1のtrackingID(セッションID)がわかる。
↓
guest1のセッションIDを記録。不正に入手したことにする。
↓
chromeのシークレットウィンドウを利用してguest2でログイン。
※シークレットウィンドウを使うと、Cookieの履歴やブラウザの履歴、検索履歴が残らない。
↓
ChromeのディベロパーツールでApplication の Cookies の （サーバー名）をクリックすると、guest2のtrackingID(セッションID)がわかる。
↓
Chromeのコンソールを開き、JavaScriptを実行。
document.cookie = 'tracking_id=guest1のtrackingID';
を実行
↓
guest1のセッションIDで掲示板に投稿できるようになる。

○対策
・expressのフレームワークを利用する
または
・ハッシュ関数を利用し、ユーザー ID を使って、トラッキング ID をそのユーザーであることを検証できる形式のプログラムを組む



●セッションフィクセーション
攻撃者が、指定したセッションIDをユーザーに強制的に使わせる。


●クロスサイトリクエストフォージェリ（CSRF)
認証済みのユーザーが意図しない個人情報や設定情報など何らかの状態を更新するような処理を、攻撃者が仕掛けた罠によって強制的に実行させる。


<h5>N予備校４章「セキュリティの対策と公開」</h5>
CSRFはパッケージを使って実装しても対策しにくい攻撃。
とはいえ、expressフレームワークを使うと脆弱性対策が楽！！！

csurf（ https://github.com/expressjs/csurf ）というミドルウェアを利用。csurf の README.md にしたがって、CSRF脆弱性対策を行いたいページに実装していく。

```js
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });

router.get('/new', authenticationEnsurer, csrfProtection, (req, res, next) => {
  res.render('new', { user: req.user, csrfToken: req.csrfToken() });
 });

router.post('/', authenticationEnsurer, csrfProtection, (req, res, next) => {
   const scheduleId = uuid.v4();
   const updatedAt = new Date();
   Schedule.create({
```
csurfモジュールを読み込む
CSRF対策に使用するトークンをcsrProtectionとして読み込む。

POSTをリクエストする際には、csrProtection関数をrouterに足して、チェックが行われるようにする。


実装が必要なページは、何らかのフォームをサーバーに渡しているところ。


●パスワードクラッキング
・総当たり攻撃
パスワードシステムで取り得る全てのパスワード候補を試すことで認証を突破する。鍵となるパターンが多い場合は解読に時間がかかる。

・辞書攻撃
予め、よくあるパスワードの候補を用意しておき、それを試すことで認証を突破する。攻撃の成否は辞書に左右される。


<h5>N予備校３章「パスワードの脆弱性の対策」</h5>
・自分の作成した練習サイトに辞書攻撃を行ってみる。これは他人のサイトに行うと不正アクセス禁止法に違反するので、ここでのソースコードの扱いは要注意。
処理の流れ

↓

HTTPのクライアントモジュールであるrequestモジュール、
fsというファイルシステムモジュール
requireというファイルを一行ずつ読みこむモジュール
を読み込む。

rsにpasswordというファイル（パスワードの辞書）を読み込む
rlという、rsを一行ずつ読み取るオブジェクトを作成。

Basic認証をして、サーバーにアクセスする。${line}に辞書からパスワードを読み込んだ一行の文字列が入った変数を入れていく。

もしもエラーがでなければそれが正解。

●クリックジャキング
透明なボタンやリンクを、罠となるWebページに埋め込み、そのリンクをユーザーにクリックさせることで意図しないコンテンツにアクセスさせる。

<h5>N予備校４章「セキュリティ対策と公開」</h5>
expresフレームワークを使っているので問題ない。
expressでは、 レスポンスヘッダに X-Frame-Options:SAMEORIGIN という内容が含まれている。

・X-Frame-Options ：　HTML 内に HTML を読み込む際、どのサイトからの読み込みなら許可するかを設定

・SAMEORIGIN ：同じサイト内からの読み込みだけしか許可しないという設定


●Dos

（ITパスポートでも出題）
アクセスを集中させることで負荷をかけてリソースを使い切らせて、事実上サービスを停止させる。


●バックドア
（ITパスポートでも出題）

制限された機能を正規の手続きを踏まなくても利用でるように設けられた裏口。