セキュア・プログラミング講座(Webアプリケーション編)ブートアップセミナー
(NIIで開催)にいってきた!
その内容をメモメモ
・IPAのセキュア公開資料
脆弱性を前倒しで論点を挙げている
やさしい論点が後になる
■導入:HTTPプロトコル
・Webアプリケーション
まあ、せつめいしなくてもいい
・使われるプログラミング言語の例
サーバー
RoRに刺激されCake,Django・・・
クライアント
Dart,TypeScript
JQuery
大きなことが抜けている
・攻撃は通信から入ってくる
HTTPプロトコル
・HTTPの通信を観察する
ローカルプロキシ:リクエストの監視、改変
DWASP・ZAP・Fiddlerなど
・HTTP通信の観察
MIMEメッセージの一種
・POSTメソッド
・舞台裏は単純なテキストのやり取り
→いくらでも捏造、改変できる
■SQLインジェクション:シンプルな攻撃
・攻撃の流れ
入力パラメータにSQL文字列を使い、データを破壊する
・被害
DBの中身を読み出される
定義も
RDBSの種類、バージョンがわかる
情報の改ざん→データ破壊
サーバーのっとり
・やりかた
パスワードを' or 'a'='a とする
・悪さをする特殊企業
'
;
スペース SQLサーバー
-- コメント
\ 特殊記号:エスケープを乗り越える
・対策
SQL文の発行を半自動化してくれる道具を使う
よい道具
O/Rマッパ
言語に統合されたクエリ(LINQ、PL/SQL)
プリペアド・ステートメント
次善の策
特殊記号をエスケープする
・O/Rマッパー
RoR ActiveRecord
Grails GORM
Cake Model
Spring S2JDBC,Hiberneta
・SQL注入のポイント
SQL文を発行してデータベースへアクセス
SQLの構文を攻撃者にいじられない
■スクリプト注入
ブラウザ側を攻撃
・典型的にはXSS
HTMLの文字列を貼り付けられると、
・偽ページ:
セッションのっとり
・攻撃方法
・攻撃パターン
スタイルタグなどもあぶない:いろいろな手口
・対策1:scriptタグを抑止
対策2:URL属性の無害化
・バリエーション
蓄積されたデータ内
DOM型(AJAX)
■セッションメカニズムとユーザー認証について
・HTTPはステートレス
セッションで
セッションID運び方3種類
URLリライティング
POSTデータ
クッキー
■セッションハイジャック
・SSLで暗号化していても、セッションハイジャックは
起こる可能性はある
→証明書を使わない限り、なりすましはできる
・被害
なんでもできる
金銭被害
情報漏えい
業務妨害
・悪い例
ある種のフレームワーク
ログイン前とログイン後で同じセッションIDを使っている場合
「推測」への対応
→処理系が作ってくれるので、それを使う
ログイン、ユーザー認証成功のたびに異なる値を使う
「奪取」の対応
SSLなどを使う
Cookieにセキュア属性
Cookieの寿命を短くする
ログイン成功時のCookieを発行しなおす
・セッションハイジャックのポイント
発行と運用にかかわる
他人が入ってくる
対策:「推測」されない「奪取」されない
■セッションフィクセーション
(セッションIDのお膳立て)
・攻撃の流れ
攻撃者はCookieを取得し、
ユーザーにそのCookieを送りつけると
攻撃者が知っているCookieでログインすることになる
→付け替えないから
あとは、セッションハイジャックと同じ
・対策
ログインしたとき、新しいセッションIDにする
■アクセス認可の実装
・失敗パターン
メニューにないページにアクセスできる
URLをたたくと画面が出てくる
他者の所有データにアクセスできる
IDに連番のキーの場合
・対策
ページごとに、保護するロジック
オブジェクトのオーナーを確かめる
・より一般的:PEP
保護すべきもの:Webページ
問い:今ログインしているユーザーは
その対象へアクセスする権限をもつか
■ほかの論点
・セキュア・プログラミング講座
Webアプリケーション編
に書いてある
要件定義で考えないといけないもの
設計でもいいもの
実装でも間に合うもの
クロスサイト リクエスト フォージェリー
正常
サーバーが送りだす→ブラウザが操作→サーバ書き込み
問題
悪さサイトが送り出す→ブラウザが操作(しなくてもいい)→サーバーX
XSSとの違い
クロスサイト リクエスト フォージェリーはサーバーに入ったところで悪さ
XSSは、サーバーに入った後、ブラウザで悪さする
Cookieを他者がみる
document.cookie
ここに代入されてしまうと、Cookieを入れられてしまう。
ところが、HTTPレスポンスにsecureをつけると、だいにゅうできない。
ところがPHPは(WebSphereも)、
ブラウザからセッションIDを使えた(セッションあだぷしょん)。
→悪いヒトが、セッションIDを送りつけると・・・
(NIIで開催)にいってきた!
その内容をメモメモ
・IPAのセキュア公開資料
脆弱性を前倒しで論点を挙げている
やさしい論点が後になる
■導入:HTTPプロトコル
・Webアプリケーション
まあ、せつめいしなくてもいい
・使われるプログラミング言語の例
サーバー
RoRに刺激されCake,Django・・・
クライアント
Dart,TypeScript
JQuery
大きなことが抜けている
・攻撃は通信から入ってくる
HTTPプロトコル
・HTTPの通信を観察する
ローカルプロキシ:リクエストの監視、改変
DWASP・ZAP・Fiddlerなど
・HTTP通信の観察
MIMEメッセージの一種
・POSTメソッド
・舞台裏は単純なテキストのやり取り
→いくらでも捏造、改変できる
■SQLインジェクション:シンプルな攻撃
・攻撃の流れ
入力パラメータにSQL文字列を使い、データを破壊する
・被害
DBの中身を読み出される
定義も
RDBSの種類、バージョンがわかる
情報の改ざん→データ破壊
サーバーのっとり
・やりかた
パスワードを' or 'a'='a とする
・悪さをする特殊企業
'
;
スペース SQLサーバー
-- コメント
\ 特殊記号:エスケープを乗り越える
・対策
SQL文の発行を半自動化してくれる道具を使う
よい道具
O/Rマッパ
言語に統合されたクエリ(LINQ、PL/SQL)
プリペアド・ステートメント
次善の策
特殊記号をエスケープする
・O/Rマッパー
RoR ActiveRecord
Grails GORM
Cake Model
Spring S2JDBC,Hiberneta
・SQL注入のポイント
SQL文を発行してデータベースへアクセス
SQLの構文を攻撃者にいじられない
■スクリプト注入
ブラウザ側を攻撃
・典型的にはXSS
HTMLの文字列を貼り付けられると、
・偽ページ:
セッションのっとり
・攻撃方法
・攻撃パターン
スタイルタグなどもあぶない:いろいろな手口
・対策1:scriptタグを抑止
対策2:URL属性の無害化
・バリエーション
蓄積されたデータ内
DOM型(AJAX)
■セッションメカニズムとユーザー認証について
・HTTPはステートレス
セッションで
セッションID運び方3種類
URLリライティング
POSTデータ
クッキー
■セッションハイジャック
・SSLで暗号化していても、セッションハイジャックは
起こる可能性はある
→証明書を使わない限り、なりすましはできる
・被害
なんでもできる
金銭被害
情報漏えい
業務妨害
・悪い例
ある種のフレームワーク
ログイン前とログイン後で同じセッションIDを使っている場合
「推測」への対応
→処理系が作ってくれるので、それを使う
ログイン、ユーザー認証成功のたびに異なる値を使う
「奪取」の対応
SSLなどを使う
Cookieにセキュア属性
Cookieの寿命を短くする
ログイン成功時のCookieを発行しなおす
・セッションハイジャックのポイント
発行と運用にかかわる
他人が入ってくる
対策:「推測」されない「奪取」されない
■セッションフィクセーション
(セッションIDのお膳立て)
・攻撃の流れ
攻撃者はCookieを取得し、
ユーザーにそのCookieを送りつけると
攻撃者が知っているCookieでログインすることになる
→付け替えないから
あとは、セッションハイジャックと同じ
・対策
ログインしたとき、新しいセッションIDにする
■アクセス認可の実装
・失敗パターン
メニューにないページにアクセスできる
URLをたたくと画面が出てくる
他者の所有データにアクセスできる
IDに連番のキーの場合
・対策
ページごとに、保護するロジック
オブジェクトのオーナーを確かめる
・より一般的:PEP
保護すべきもの:Webページ
問い:今ログインしているユーザーは
その対象へアクセスする権限をもつか
■ほかの論点
・セキュア・プログラミング講座
Webアプリケーション編
に書いてある
要件定義で考えないといけないもの
設計でもいいもの
実装でも間に合うもの
クロスサイト リクエスト フォージェリー
正常
サーバーが送りだす→ブラウザが操作→サーバ書き込み
問題
悪さサイトが送り出す→ブラウザが操作(しなくてもいい)→サーバーX
XSSとの違い
クロスサイト リクエスト フォージェリーはサーバーに入ったところで悪さ
XSSは、サーバーに入った後、ブラウザで悪さする
Cookieを他者がみる
document.cookie
ここに代入されてしまうと、Cookieを入れられてしまう。
ところが、HTTPレスポンスにsecureをつけると、だいにゅうできない。
ところがPHPは(WebSphereも)、
ブラウザからセッションIDを使えた(セッションあだぷしょん)。
→悪いヒトが、セッションIDを送りつけると・・・