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
Ryusei Ishikawa
September 03, 2023
Technology
3
1.3k
Webアプリケーションのユーザ入力検証
ここで話しました
https://connpass.com/event/290912/
Ryusei Ishikawa
September 03, 2023
Tweet
Share
More Decks by Ryusei Ishikawa
See All by Ryusei Ishikawa
DIVER OSINT CTF を支える技術 2025
xryuseix
0
79
OSINT CTFの リアル作問環境を体験してみよう!
xryuseix
0
170
OSINT CTFを支える技術
xryuseix
1
740
HTTP通信を書きかえてみよう
xryuseix
0
70
Privateリポジトリで 管理しているソースコードを 無料でGitHub Pagesに公開する
xryuseix
0
3.1k
CTFにおけるOSINT問題作問の難しさ
xryuseix
0
730
「Reactはビルド時にコメントが消えるから」と言ってコメントに💩を書いてはいけない
xryuseix
0
1.4k
Other Decks in Technology
See All in Technology
Language Update: Java
skrb
2
290
ブロックテーマ時代における、テーマの CSS について考える Toro_Unit / 2025.09.13 @ Shinshu WordPress Meetup
torounit
0
120
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
220
自作JSエンジンに推しプロポーザルを実装したい!
sajikix
1
170
La gouvernance territoriale des données grâce à la plateforme Terreze
bluehats
0
160
Autonomous Database - Dedicated 技術詳細 / adb-d_technical_detail_jp
oracle4engineer
PRO
4
10k
エラーとアクセシビリティ
schktjm
1
1.2k
Platform開発が先行する Platform Engineeringの違和感
kintotechdev
4
560
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
180
なぜSaaSがMCPサーバーをサービス提供するのか?
sansantech
PRO
8
2.8k
Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
yud0uhu
0
230
Evolución del razonamiento matemático de GPT-4.1 a GPT-5 - Data Aventura Summit 2025 & VSCode DevDays
lauchacarro
0
180
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
173
14k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Faster Mobile Websites
deanohume
309
31k
Embracing the Ebb and Flow
colly
87
4.8k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The World Runs on Bad Software
bkeepers
PRO
70
11k
What's in a price? How to price your products and services
michaelherold
246
12k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Optimizing for Happiness
mojombo
379
70k
Fireside Chat
paigeccino
39
3.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
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