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
Webアプリケーションのユーザ入力検証
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ryusei Ishikawa
September 03, 2023
Technology
1.3k
3
Share
Webアプリケーションのユーザ入力検証
ここで話しました
https://connpass.com/event/290912/
Ryusei Ishikawa
September 03, 2023
More Decks by Ryusei Ishikawa
See All by Ryusei Ishikawa
“それなりに”安全なWebアプリケーションの作り方
xryuseix
0
630
DIVER OSINT CTF を支える技術 2025
xryuseix
0
160
OSINT CTFの リアル作問環境を体験してみよう!
xryuseix
0
360
OSINT CTFを支える技術
xryuseix
1
1.2k
HTTP通信を書きかえてみよう
xryuseix
0
89
Privateリポジトリで 管理しているソースコードを 無料でGitHub Pagesに公開する
xryuseix
0
5k
CTFにおけるOSINT問題作問の難しさ
xryuseix
0
840
「Reactはビルド時にコメントが消えるから」と言ってコメントに💩を書いてはいけない
xryuseix
0
1.5k
Other Decks in Technology
See All in Technology
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
3
550
最低限これだけ押さえれ大丈夫_Claude Enterprise/Team企業展開ガバナンス入門
tkikuchi
1
590
食べログのサーキットブレーカー導入を振り返って
atpons
1
160
Spring AI × MCP 入門〜AIエージェントへのツール公開、境界設計から始める最小構成 〜
yuyamiyamoto
0
190
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
320
Spring Boot における AOT Cache 活用テクニックと 起動時間改善事例
ntt_dsol_java
0
180
Databricks 月刊サービスアップデート 2026年05月号
tyosi1212
0
130
Javaコミュニティをもっと楽しむための9箇条
takasyou
0
840
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.8k
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
180
Java正規表現エンジン(NFA)の仕組みと パフォーマンスを維持するための最適化手法
takeuchi_132917
0
160
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.8k
Featured
See All Featured
Leo the Paperboy
mayatellez
7
1.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Rails Girls Zürich Keynote
gr2m
96
14k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
130
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.5k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
150
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
830
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
410
Embracing the Ebb and Flow
colly
88
5.1k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Transcript
Webアプリケーションの ユーザ入力検証 xryuseix (@ryusei_ishika)
講演内で使用するソースコードについて https://github.com/SECCON/2023_beginnerslive これ 1. GitHubリポジトリへアクセスしてください 2. xryuseixフォルダの中のREADMEを読んでください 2
自己紹介 ID: xryuseix (Twitter: @ryusei_ishika) Webセキュリティと開発が好きです。 ctf4b 2023では以下の問題を提供しました。 • shaXXX
• drmsaw • phisher2 3
ユーザの入力をちゃんとチェックしてますか? これってstring? number? https://expressjs.com/ja/starter/hello-world.html 4
ユーザの入力をちゃんとチェックしてますか? https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch この中身って保証されてる? 5
ユーザの入力をちゃんとチェックしてますか? https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch undefinedにならない?大丈夫? 6
Q1. if文書けば解決するのでは? A. プロパティの数が少なければそれで良いが、多い場合は大変 想定していないプロパティが含まれていないかチェックする 必要もある 7
Q2. TypeScriptを使えば解決するのでは? A. えっこうですか?? 8
Q2. TypeScriptを使えば解決するのでは? A. えっこうですか??(2) プロパティが多かったり入れ子になってたりしたら 実装がかなり増えてキツくないですか? 9
Q3. いやでもさ...... 「これって実行時エラーが出るだけで、 脆弱性にならんのとちゃうんか??」 😎「クックックッ......」 ※僕は大阪弁喋れません 10
今回使用するサンプル問題 corCTF-2021 web/buymeより一部改変 ここをユーザが自由に書き換えられる https://github.com/SECCON/2023_beginnerslive/blob/main/xryuseix/chall.js 問題サーバ: https://x-beginnerslive2023.deno.dev 11
今回使用するサンプル問題 corCTF-2021 web/buymeより一部改変 • フラグはflagsオブジェクトにある • buyFlag関数でフラグが買える場合は 買ってretuenしている • 買えるフラグはuserとadminで異なる。
userの場合はフラグが偽物で、admin の場合はフラグが高額 12
今回使用するサンプル問題 corCTF-2021 web/buymeより一部改変 • サーバはDeno.serveで実装されてお り、ユーザの入力はクエリパラメータで 受け取れる (今回Denoを使っていることに深い意 味はありません) •
ユーザの入力はmain関数に送られ、 JSONをパースした後にroleが指定さ れているか確認する • その後、buyFlag関数にユーザ情報と ロール情報が送られる 13
今回使用するサンプル問題 ⚠次のスライドで答えを言及します 見たくない場合は1分くらい下の猿のモノマネしててください。 答えはレポジトリ内にも書かれています。 14
今回使用するサンプル問題(解説) こんな感じのJSONを送れば良いです。 buyFlag関数の呼び出しの箇所で、スプレッド構文を使っているため、 userオブジェクトの中身を書き 換えられます。 15
prototype pollution 脆弱性を埋め込むパターンは他にも... https://www.youtube.com/watch?v=LUsiFV3dsK8&t=67s のコードを一部改変 16
Zodという選択肢もある https://zod.dev/?id=basic-usage Zodは静的型推論による TypeScript ファーストのスキーマ検証ツールです。 文字列、数字、オブジェクトなどが特定のスキーマ (≒型※1 )に一致しているか確認することができます。 → ユーザの入力を検証することができる!
文字列のスキーマ “tuna”は文字列なのでOK 12は文字列ではないのでエラー ※1 正確には違うが、そう考えた方がわかりやすいかもしれない 17
Zodという選択肢もある https://zod.dev/ 18
まずはTypeScriptで書き換えてみる https://github.com/SECCON/2023_beginnerslive/blob/main/ xryuseix/chall.ts 19
まずはTypeScriptで書き換えてみる https://github.com/SECCON/2023_beginnerslive/blob/main/ xryuseix/chall.ts 前述の通り、単純にTypeScriptにした からといって修正できるとは限りません 20
Zodを使って書き換えてみる https://github.com/SECCON/2023_beginnerslive/blob/main/xryuseix/fixed.ts Zodスキーマを定義 検証 21
EmailやUrl、IPなど、 いろんな文字列に対して検証できる Zodなら様々な検証ができる 22
• ユーザの入力を検証する事は 安全なアプリケーション開発において重要 • TypeScriptを使ったからといって ユーザの入力内容は保証できない • 入力を検証する方法の1つの手段として、 Zodというものがある まとめ
思わぬ入力が与えられて ゾッと しないように、気をつけてコードを書こう! 23