Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「攻め」と「守り」で理解する PHP アプリケーション
Search
GMO Flatt Security
June 27, 2025
1
88
「攻め」と「守り」で理解する PHP アプリケーション
GMO Flatt Security
June 27, 2025
Tweet
Share
More Decks by GMO Flatt Security
See All by GMO Flatt Security
セキュリティ視点からみる生成AIアプリケーションとMCP ~ 脅威とリスク、認可・権限 ~
flatt_security
4
2.2k
脅威をモデリングしてMCPのセキュリティ対策を考えよう
flatt_security
5
1.9k
利用者目線で考える、MCPを安全に使うために
flatt_security
5
1.8k
アプリケーション固有の「ロジックの脆弱性」を防ぐ開発者のためのセキュリティ観点
flatt_security
41
20k
開発組織のための セキュアコーディング研修の始め方
flatt_security
5
3.9k
GMO Flatt SecurityにおけるKubernetesセキュリティ診断について
flatt_security
0
220
Flatt Security XSS Challenge 解答・解説
flatt_security
0
2.1k
GMO Flatt Security 会社紹介資料
flatt_security
0
14k
codeblue_2024_opentalks.pdf
flatt_security
0
130
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
245
12k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
790
Why Our Code Smells
bkeepers
PRO
337
57k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
4 Signs Your Business is Dying
shpigford
184
22k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.8k
Building an army of robots
kneath
306
45k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
Being A Developer After 40
akosma
90
590k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Transcript
「攻め」と「守り」で理解する PHP アプリケーション 2025/06/28 - PHP Conference Japan 2025 GMO
Flatt Security株式会社 てぃー / k1rnt
自己紹介 てぃー @k1rnt & GMO Flatt Security(株) セキュリティエンジニ) & 週末はCTFしたり旅をした
& 最近は逆流性食道炎がつらいです
AIからのPR おっと急にAIからPRが → 見てみましょう
AIからのPR どうやら、bタグとiタグだけ許可したいPRのようですね さて、このままマージして良いでしょうか?
AIからのPR
AIからのPR このコードには脆弱性が存在します。 一見エスケープしているので安全のように見えますが、 preg_replaceを使用してb, iタグを復元します
AIからのPR <b onclick=alert(‘ ’)>click</b>
AIからのPR
AIからのPR これまで、多くの脆弱性はフレームワークにより防がれてきた しかし、現代ではAIが大量に吐くコードに混入する 脆弱性をレビュー時に見過ごす危険性が生まれている 「脆弱性を生まない書き方」だけではなく 検出するということの重要性が増してきた
AIからのPR 実際なんも考えなかったらXSS出してきますし、、、 出典: 弊社ブログ( ) https://blog.flatt.tech/entry/ai_code_security
AIからのPR また、XSSってそんな中で残り続けた脆弱性でもあるんですよね 出典: 弊社ブログ( ) https://blog.flatt.tech/entry/flatt_top10_2025
AIからのPR 今回話すような内容をおさらいしつつ、 自分で書かないのはもちろん、 AIに書かせない/書いたら検出するのが重要ですよね。
このセッションで持ち帰れるもの 攻撃者目線で診る PHPアプリケーションでの XSS発生パターンと対策ポイント
アジェンダ P blade Template EngineにおけるXS9 P Unicode NormalizationによるXS9 P PHPのパラメータ上限によるCSP
Bypas P おわりに
blade Template EngineにおけるXSS bladeの と の違いの説明 {{ $var }} {!!
$var !!}
blade Template EngineにおけるXSS {{ $var }}
blade Template EngineにおけるXSS https://readouble.com/laravel/12.x/ja/blade.html
blade Template EngineにおけるXSS 実装してみましょう
blade Template EngineにおけるXSS XSSは発生しないですね
blade Template EngineにおけるXSS {!! $var !!}
blade Template EngineにおけるXSS https://readouble.com/laravel/12.x/ja/blade.html
blade Template EngineにおけるXSS 実装してみましょう
blade Template EngineにおけるXSS ドキュメントにもある通りXSSが発生しました
blade Template EngineにおけるXSS 対策方法 y {{ $var }} を使用すV y
どうしても {!! $var !!} が必要な場合は、mewebstudio/ Purifier などを使用して、適切にサニタイズを行8 p https://github.com/mewebstudio/Purifier
blade Template EngineにおけるXSS ここまでは皆さんご存知だと思います でも、、、
blade Template EngineにおけるXSS Laravelの {!! $var !!} の実装まで 読んだことはありますか?
blade Template EngineにおけるXSS {!! $var !!}
blade Template EngineにおけるXSS {!! で雑にgrepをかけると次のコードが見える
blade Template EngineにおけるXSS 使用箇所は?
blade Template EngineにおけるXSS {{ $var }}
blade Template EngineにおけるXSS $wrappedでは、sprintf() でechoFormatを使っている
blade Template EngineにおけるXSS $echoFormatはe(%s)、つまりエスケープしている!
blade Template EngineにおけるXSS つまり安全!
blade Template EngineにおけるXSS 本当に? e() の実装まで知ってる?
blade Template EngineにおけるXSS ... 追います
blade Template EngineにおけるXSS e()
blade Template EngineにおけるXSS 実装を見つける
blade Template EngineにおけるXSS よく見ると、安全ではないケースがあります
blade Template EngineにおけるXSS instanceがHtmlableである時 エスケープ処理せずに返しています
blade Template EngineにおけるXSS 事前にこのようにmarkdownをプレビューしたいみたいな場合は?
blade Template EngineにおけるXSS まぁ {{ $content }} なのでXSSは発生しないよね...?
blade Template EngineにおけるXSS XSS発生する
blade Template EngineにおけるXSS つまり、{{ $var }} でエスケープを行い 、 かつ $var
には Htmlable なインスタンスでないか確認すれば安全。
blade Template EngineにおけるXSS 今回のようなケースでは、入力値のタグをエスケープしつつ、 javascript:, data:, といった危険なスキームを拒否することで 安全になる
blade Template EngineにおけるXSS
Unicode NormalizationによるXSS じゃあエスケープしていれば安全なんだね?
Unicode NormalizationによるXSS 半分正解 エスケープ後の文字列に変なことしていなければね
Unicode NormalizationによるXSS 変なことって?
Unicode NormalizationによるXSS 例えばこんなコードはどうでしょうか
Unicode NormalizationによるXSS WP HTMLエスケーT 7P アプリケーションの標準であるUTF-8に変I #P ASCIIに直す
Unicode NormalizationによるXSS どういう時にこんなコードが書かれるの?
Unicode NormalizationによるXSS 例えば、caféみたいに入力された文字列をcafeとして システムに登録したい場面があるかもしれない
Unicode NormalizationによるXSS もちろんエスケープ済みなので、XSSも発生しない
Unicode NormalizationによるXSS 大丈夫そうじゃない?
Unicode NormalizationによるXSS ほんと? じゃあ (っ'-')╮«svg/onload%3Dalert(1)»
Unicode NormalizationによるXSS どうしてこんなことに...?
Unicode NormalizationによるXSS «svg/onload%3Dalert(1)» %C2%ABsvg/onload%3Dalert(1)%C2%BB
Unicode NormalizationによるXSS %C2%AB と %C2%BB のそれぞれがASCIIに正規化されると、 << や >> となり、通常のタグと同等のものになる
Unicode NormalizationによるXSS よって、 <<svg onload=alert(1)>> となりhtmlとして認識されXSSが発生する
Unicode NormalizationによるXSS 出力の直前にエスケープをすることで安全に扱うことができる エスケープ後にその文字列の操作を行わないことが大事
PHPのパラメータ上限によるCSP Bypass さて、ここまでの内容、AIが暴走した時に止められると思いますか? 結構しんどくないですか? CSPは有効な手段のひとつです
PHPのパラメータ上限によるCSP Bypass https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CSP CSPとは?
PHPのパラメータ上限によるCSP Bypass CSPとは? つまり、「このページでは信頼した場所のリソースだけ読み込め」 とブラウザに命令し、怪しいスクリプトや攻撃コードの実行を 防ぐ仕組みです
PHPのパラメータ上限によるCSP Bypass 実装してみましょう
PHPのパラメータ上限によるCSP Bypass この状態では、CSPがありエスケープせずともブラウザでエラーが出力 そして、XSSは発生しない
PHPのパラメータ上限によるCSP Bypass ただし、、、 PHPではなんとCSPヘッダーの前に応答が送信され、 ヘッダーが無視されます場合があります...
PHPのパラメータ上限によるCSP Bypass 今度はPHP本体のソースコードを確認します
PHPのパラメータ上限によるCSP Bypass $_GET は max_input_varsより最大値が1000であることが分かります
PHPのパラメータ上限によるCSP Bypass ここではソースは示しませんが同様に調査を行うと下記がわかります。 PHPでのデフォルトの最大パラメータg $_GET: 1000 parametere $_POST:
1000 parametere $_FILES: 20 files
PHPのパラメータ上限によるCSP Bypass では、この最大数を超えるパラメータを送るとどうなるのか? Devtoolsにこのペイロードを投げる document.location = '/?xss=<svg/onload=alert(1)>&'+'a=x&'.repeat(1000)
PHPのパラメータ上限によるCSP Bypass
PHPのパラメータ上限によるCSP Bypass 対策方法は? 現状のPHPではこれが仕様 なので、CSPに頼り切らずエスケープをちゃんとしましょう
おわりに いかがだったでしょうか? XSS対策って意外と見ることが多くて大変でしたね 最後におさらいとして、なにを書かせてはいけないのか見てみましょう
おわりに 出力を行う前にエスケープを行う エスケープをどうしてもできない場合は、信頼できるライブラ リで適切にサニタイズを行う 出力の直前にエスケープを行い、エスケープ後にその文字列の 操作を行わない CSPを適切に設定する
おわりに アプリケーションやパブリッククラウドのセキュリティは におまかせください プロフェッショナルによる 脆弱性診断・ペネトレーションテスト セキュリティコードレビューに 特化したAIエージェント Takumi セキュリティ診断AIエージェント