第10回 ALAKI ◯◯ Lab -Webセキュリティ超入門- に参加した
11/28に行われた、ALAKI株式会社様主催の第10回 ALAKI ◯◯ Lab -Webセキュリティ超入門- に参加しました。
自分で何かポートフォリオ等作成する前に、一度セキュリティについて勉強しようと思ったのがきっかけです。
内容としては、XSSとCSRF、SQLインジェクションについての勉強会でした。
XSS,SQLインジェクションは過去に少し聞いたことがあった程度、CSRFは一度も聞いたことがなかったレベルですが、それぞれについて理解できたかと思います。
1.XSSについて
2.CSRFについて
3.SQLインジェクションについて
の順に説明をしていただいたので、まとめていこうと思います。
(メモ書きを基にしているので文体、句読点の有無など非常に汚いですが申し訳ございません)
1.XSSについて
正式な読み方:クロスサイトスクリプティング
外部からの入力内容に応じて、表示内容が変化する動的Webページの脆弱性、
もしくはその脆弱性を利用した攻撃のこと
検索窓 お問合せフォームなど 操作が入るページが当てはまる
どのような影響があるか?
攻撃者の用意したスクリプト実行によるクッキー値の盗難及び、なりすまし被害
例 代わりにログインされてしまう
サイト利用者の権限、Webアプリケーション機能の悪用
Webアプリケーション内でHTML,JAvaScriptを生成している箇所全て。
PHPのGET,POSTは特に注意
脆弱性に対する対策は、最初に作り始めた時にしておきべき。
次のような理由から脆弱性をつかれてしまう。
・XSS脆弱性が発生する原因はメタ文字(<,>,’,”)を正しく扱っていないため
・不用意に$_GETを利用しているため(PHPを利用している場合)
$_GETは送られてきたデータをチェックするのが大変
判断のしにくいものを送ってしまうと良くないので数値くらいに留めておいたほうが良い
< や & をエスケープして表示する
エンコーディングを統一する
$_GETを利用する場合は、エラーチェックが容易な場合に限る
できる限りリンクタブを作らない
対策
htmlspecialchars、ENT_QUOTESを利用
htmlspecialcharsとは?
HTMLとして意味を持つ文字を意味のない文字に変更する処理を行う関数
http://php.net/manual/ja/function.htmlspecialchars.php
$string
[, int $flags
= ENT_COMPAT | ENT_HTML401[, string $encoding
= ini_get("default_charset") [, bool $double_encode
= TRUE
]]] )
第一引数に変換したデータ名
第二引数にどういったメタ文字を潰すか
ENT_QUOTESは’,”共に潰す処理
<>も。
第三引数に文字コード
受け取ったものを表示させるところには特に注意する。
2.CSRF対策
正式な読み方:クロスサイトリクエストフォージェリ
フォージェリ = 盗む、奪う といった意味
利用者が意図せず 重要な処理 を実行させられる脆弱性、もしくはその脆弱性を利用した攻撃のことを言う
例えば、勝手にWebサービスを退会、パスワードを変更、SNSや問い合わせフォームへ書き込みされるなど。
重要な処理をクッキーのみのセッション管理を行って処理しているサイト
Basic認証などのHTTP認証やTLSクライアント認証のみに頼った識別を行っているサイトが攻撃の対象になる。
原因は二つほど挙げられる
From要素のaction属性にURLが指定できるため
クッキーに保存されているセッションIDは、対象サイトに自動で送信されてしまうため
脆弱性への対策
利用者が意図した処理かどうかを確認できる様にする
秘密情報の設置、
パスワードの再入力、
Referrerのチェック
→Webサイトはリンクを辿っているものを記憶している
一つ前のページをきちんと確認して、利用者の意図したアクセスかどうかを確認する
トークンを持っている人でないと参加できない様な仕組み
→トークンの設定を行う
トークンが一致しているかどうかチェックするのが必要
Laravelはデフォルトでフォージェリしないとデータを送ることができない。
脆弱性については対処法を知った上で取り組むことが必要
大規模になればなるほど、後でやると大変
最初から対策するのが必要
3.SQLインジェクション
上述じた二つは対処しきるのは難しいがSQLインジェクションは必ず対処する様に書かれている
SQLインジェクションとは?
もしくはその脆弱性を利用した攻撃のことを言います
あった場合どうなるか?
DB内の情報漏洩、改ざん、(攻撃者が自由に設定)
ログイン認証を回避
DBの破壊
SQLインジェクションの対策範囲
SQLの呼び出しをしている箇所、全て
特に外部入力を必要として動くSQLは要注意!
検索キーワードに一致するものを取得するもの。
SQLインジェクションが発生する原因
文字列、数値の値(リテラル)が正しく処理されていないため、
SQLとして処理される文字を入力されてしまうため
PDOを利用してSQLインジェクション対策を行う
‘の中に変数を入れてはいけない。
もともとあったSQLをなかったことにして、実行してしまう
対策
リテラルを正しく構成できる様に制御する
https://www.ipa.go.jp/files/000017320.pdf
PDO:MYSQL_ATTR_MULTI_STATEMENTS => false,
複文(1回の問い合わせで複数実行すること)を禁止する。
PDO:静的プレースホルダ設定。「true」にすると動的プレースホルダ設定になる
ここをfalseにすると良い。
プレースホルダを利用するのが2種類あって、
符号付きと名前付きの二つ
バインド設定
$ps->bindValue(‘:author’, $author, PDO:PARAM_STR)
静的プレースホルダを使うのが勧められている
動的で取得すると全て文字列型で取得してしまう
静的だと型を維持したまま取得できる
今回学んだことを実際に落とし込むことが大事だと思うので、明日からはセキュリティ対策を進めていこうと思います!!