More Related Content
PPTX
PDF
PDF
【ナレッジグラフ推論チャレンジ】SPARQLと可視化ツールを用いた推論検討例 PDF
組み込み関数(intrinsic)によるSIMD入門 PDF
Python 3.9からの新定番zoneinfoを使いこなそう PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する PPTX
PDF
What's hot
PDF
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮 PDF
PDF
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive PDF
PDF
PDF
WebAssemblyのWeb以外のことぜんぶ話す PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ PDF
PDF
PDF
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2 PDF
なかったらINSERTしたいし、あるならロック取りたいやん? PDF
オントロジー工学に基づくセマンティック技術(2)ナレッジグラフ入門 PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜 PDF
こんなに使える!今どきのAPIドキュメンテーションツール PDF
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方 PDF
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O... PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx Viewers also liked
PDF
PDF
PDF
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い PDF
PPTX
PDF
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。 PDF
脆弱性もバグ、だからテストしよう PHPカンファンレス2015 PDF
PDF
PPTX
Similar to 『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
PDF
ODP
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt) PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012 PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011 PDF
PDF
今日こそわかる、安全なWebアプリの作り方2010 PDF
PPTX
PPTX
PPTX
PPTX
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか PPTX
PPTX
PPTX
PPTX
文字コードの脆弱性はこの3年間でどの程度対策されたか? PPTX
PDF
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則 PDF
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ PPT
PDF
More from Hiroshi Tokumaru
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021 PPTX
PPTX
脅威分析の手法によりウェブサーバーにウイルス対策ソフトが必要かを検証する PPT
PPTX
PPTX
introduction to unsafe deserialization part1 PPTX
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方 PPTX
XXE、SSRF、安全でないデシリアライゼーション入門 PPTX
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題 PPTX
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019) PPTX
Railsエンジニアのためのウェブセキュリティ入門 PPTX
PPTX
PPTX
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう PPTX
PDF
PPTX
PPTX
PPTX
PPTX
CMS四天王への攻撃デモを通じて、WordPressの効果的な防御法を学ぼう 『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
- 1.
- 2.
アジェンダ
• 例えば、PHPを避ける
• htmlspecialchars文字エンコーディングチェックの改善
• register_globalsが非推奨に
• マジッククォートが非推奨に
• 暗号学的に安全な擬似乱数生成器のサポート
• セッションID生成の安全性強化
• ヌルバイト攻撃の防御機能の追加
• PDOのDB接続時の文字エンコーディング指定が可能に
• header関数のバグ修正
• 安全なパスワード保存が簡単にできるようになった
Copyright © 2016 Hiroshi Tokumaru 2
- 3.
徳丸浩の自己紹介
• 経歴
– 1985年京セラ株式会社入社
– 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍
– 2008年 KCCS退職、HASHコンサルティング株式会社設立
• 経験したこと
– 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当
– その後、企業向けパッケージソフトの企画・開発・事業化を担当
– 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当
Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始
– 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立ち上
げ
• 現在
– HASHコンサルティング株式会社 代表 http://www.hash-c.co.jp/
– 独立行政法人情報処理推進機構 非常勤研究員 http://www.ipa.go.jp/security/
– 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月)
「徳丸浩のWebセキュリティ教室 」(2015年10月)
– 技術士(情報工学部門)
Copyright © 2016 Hiroshi Tokumaru 3
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
そこそこ安全なはずのスクリプト
Copyright © 2016Hiroshi Tokumaru 10
<?php
header('Content-Type: text/html; charset=Shift_JIS');
$p1 = @$_GET['p1'];
$p2 = @$_GET['p2'];
?><body><form>
<input name=p1 value="<?php echo
htmlspecialchars($p1, ENT_QUOTES, 'Shift_JIS'); ?>"><BR>
<input name=p2 value="<?php echo
htmlspecialchars($p2, ENT_QUOTES, 'Shift_JIS'); ?>"><BR>
<input type="submit" value="更新">
</form></body>
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
マジッククォートはなぜダメだったか?
• 不便
– システムが勝手にエスケープするので多重エスケープの原因になる
–エスケープが不要な場合アンエスケープの必要があり、不便であり、
脆弱性の要因にもなる
• 対策として不十分(文字エンコーディングを考慮しないため
…PDOの項参照)
• 徳丸の意見
– マジッククォートは入力時にエスケープ処理を自動的行う仕組みだ
が、エスケープ処理は文字列を使う時に都度すべきという考え方が
一般化した
– マジッククォートはMySQLに特化したエスケープ方式であり、かつ
MySQLのオプションや文字エンコーディングを考慮しない不完全な
エスケープだった
Copyright © 2016 Hiroshi Tokumaru 17
- 18.
- 19.
- 20.
PHPにおける乱数の状況
• PHPにおける乱数の状況は酷い…下記が用いられる
– rand()
–mt_rand()
– uniqid()
• 上記はいずれも暗号学的に安全でない
– 過去の乱数列から推測可能性があるということ
• PHP-5.3.0から下記がサポートされる
– openssl_random_pseudo_bytes()
• PHP-7.0.0から下記がサポートされる
– random_bytes()
– random_int()
Copyright © 2016 Hiroshi Tokumaru 20
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
ディレクトリトラバーサルとヌルバイト攻撃
• 以下のPHPスクリプト
$fp =fopen('./data/' . $_GET['file'] . '.txt', 'r');
…
• file=../../../../../etc/passwd%00 とすると
ファイル名は以下となる。[nul]は値0の文字
./data/../../../../../etc/passwd[nul].txt
カレントディレクトリが /var/www/html とすると
/var/www/html/../../../../../etc/passwd[nul].txt
↓ 正規化 ([nul]以降は無視される)
/etc/passwd
• Unix / Linux / WindowsのAPIでは通常ヌルバイトを
文字列の終端記号として用いているため
Copyright © 2016 HASH Consulting Corp. 27
- 28.
ディレクトリトラバーサルの影響と対策
• 影響
– 任意のファイルの読み出し
–任意のファイルに任意内容が書き込みできる場合も
– PHPスクリプト等を書き込みできれば、任意スクリプト
を外部から自由に実行できる場合も
• 対策
– ファイル名には basename()関数を通してから使う
$file = basename($_GET['file']);
– できるだけ新しいPHPを使う
• PHP5.3.4以降ではヌルバイト攻撃対策がされている
Copyright © 2016 HASH Consulting Corp. 28
- 29.
- 30.
- 31.
攻撃ができる理由
Copyright © 2016HASH Consulting Corp. 31
case 'replace_prefix_tbl':
$current = $selected[$i];
$newtablename = preg_replace("/^" . $from_prefix . "/", $to_prefix, $current);
preg_replace("/^/e0/", "phpinfo();", "test");
preg_replace("/^/e", "phpinfo();", "test");
$from_pref = "/e0"
PHP5.4.3以前では、0以降は無視される
- 32.
- 33.
脆弱性が混入した要因
• preg_replaceに渡す正規表現をエスケープしていな
かった
– 最低限、/をエスケープする必要がある…理論的には
• えーっと、preg_quoteって、マルチバイト対応だっ
け?
– Shift_JIS以外では問題ない?
• 外部からの値を用いて正規表現を組み立てるべきで
はない
Copyright © 2016 HASH Consulting Corp. 33
preg_replace(“/^” . $from_prefix . “/”, …
↓
reg_replace("/^" . preg_quote($from_prefix, '/') . "/", …
- 34.
- 35.
【文字コードの問題1】 5C問題によるSQLインジェクション
• 5C問題とは
–Shift_JIS文字の2バイト目に0x5Cが来る文字に起因する問
題
ソ、表、能、欺、申、暴、十 … など出現頻度の高い文字
が多い
– 0x5CがASCIIではバックスラッシュであり、ISO-8859-1な
ど1バイト文字と解釈された場合、日本語の1バイトが
バックスラッシュとして取り扱われる
– 一貫して1バイト文字として取り扱われれば脆弱性になら
ないが、1バイト文字として取り扱われる場合と、
Shift_JISとして取り扱われる場合が混在すると脆弱性が発
生する
Copyright © 2014 HASH Consulting Corp. 35
- 36.
ソースコード(要点のみ)
<?php
header('Content-Type: text/html; charset=Shift_JIS');
$key= @$_GET['name'];
if (! mb_check_encoding($key, 'Shift_JIS')) {
die('文字エンコーディングが不正です');
}
// MySQLに接続(PDO)
$dbh = new PDO('mysql:host=localhost;dbname=books;charset=sjis',
'phpcon', 'pass1');
// Shift_JISを指定
$dbh->query("SET NAMES sjis");
// プレースホルダによるSQLインジェクション対策
$sth = $dbh->prepare("SELECT * FROM books WHERE author=?");
$sth->setFetchMode(PDO::FETCH_NUM);
// バインドとクエリ実行
$sth->execute(array($key));
?>
Copyright © 2014 HASH Consulting Corp. 36
- 37.
- 38.
SQLインジェクション対策はプレースホルダで
• プレースホルダとは
SELECT *FROM books WHERE id=?
• 静的プレースホルダと動的プレースホルダ
– 静的: サーバー側で値をバインドする(エスケープは必要
ない)
– 動的: 呼び出し側で値をエスケープしてバインドする
• 接続時に文字エンコーディングを指定する
$db = new PDO('mysql:host=myhost;dbname=mydb;charset=utf8',
DBUSER, DBPASS);
– SET NAMES utf8 はやめましょう
• 列の型を意識する
Copyright © 2012-2015 HASH Consulting Corp. 38
- 39.
サンプルコード
$db = newPDO('mysql:host=myhost;dbname=mydb;charset=utf8',
DBUSER, DBPASS);
// エミュレーションモードOFF = 静的プレースホルダ
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// エラー時に例外を発生させる
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// プレースホルダを使ってSQLを準備
$prepare = $db->prepare(
'SELECT * FROM example WHERE id = :id and language = :lang');
// 型を指定してbind
$prepare->bindValue(':id', (int) $id, PDO::PARAM_INT);
$prepare->bindValue(':lang', $str, PDO::PARAM_STR);
$prepare->execute();
Copyright © 2012-2015 HASH Consulting Corp. 39
- 40.
- 41.
- 42.
- 43.
ヘッダインジェクションによるXSSフィルタ回避
Copyright © 2016Hiroshi Tokumaru 43
<?php
$cookie = $_GET['cookie'];
$txt = $_GET['txt'];
header('Content-Type: text/html; charset="UTF-8"');
header('Set-Cookie: A=' . $cookie);
?><!DOCTYPE html> <body><?php
echo "Cookie A=" . htmlspecialchars($_COOKIE['A']) ; ?>
<?php
echo $txt; // XSS脆弱性あり
?></body>
X-XSS-Protection: 0 ヘッダを追加して、XSSフィルタを無効にしたい…
- 44.
header関数改修の歴史
• PHP 5.1.2
–改行のチェックが追加される
– %0d(キャリッジリターン)のチェックが漏れていた
• PHP 5.3.11 および PHP 5.4.0
– キャリッジリターンのチェックが追加される
– 継続行(下図)については許容
• PHP 5.4.38 / PHP 5.5.22 / PHP 5.6.6
– 継続行が禁止される
Copyright © 2016 Hiroshi Tokumaru 44
Location: http://php.net/
Set-Cookie: PHPSESSID=ABC;
↑空白またはタブ
- 45.
- 46.
- 47.
- 48.
- 49.