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
1k
Webアプリケーションのユーザ入力検証
ここで話しました
https://connpass.com/event/290912/
Ryusei Ishikawa
September 03, 2023
Tweet
Share
More Decks by Ryusei Ishikawa
See All by Ryusei Ishikawa
OSINT CTFを支える技術
xryuseix
1
460
HTTP通信を書きかえてみよう
xryuseix
0
58
Privateリポジトリで 管理しているソースコードを 無料でGitHub Pagesに公開する
xryuseix
0
2k
CTFにおけるOSINT問題作問の難しさ
xryuseix
0
580
「Reactはビルド時にコメントが消えるから」と言ってコメントに💩を書いてはいけない
xryuseix
0
990
Other Decks in Technology
See All in Technology
Jr. Championsになって、強く連携しながらAWSをもっと使いたい!~AWSに対する期待と行動~
amixedcolor
0
190
신뢰할 수 있는 AI 검색 엔진을 만들기 위한 Liner의 여정
huffon
0
370
10分でわかるfreeeのQA
freee
1
3.4k
生成AIの強みと弱みを理解して、生成AIがもたらすパワーをプロダクトの価値へ繋げるために実践したこと / advance-ai-generating
cyberagentdevelopers
PRO
1
180
10分でわかるfreee エンジニア向け会社説明資料
freee
18
520k
来年もre:Invent2024 に行きたいあなたへ - “集中”と“つながり”で楽しむ -
ny7760
0
470
とあるユーザー企業におけるリスクベースで考えるセキュリティ業務のお話し
4su_para
3
330
ユーザーの購買行動モデリングとその分析 / dsc-purchase-analysis
cyberagentdevelopers
PRO
2
100
小規模に始めるデータメッシュとデータガバナンスの実践
kimujun
3
590
Amazon FSx for NetApp ONTAPを利用するにあたっての要件整理と設計のポイント
non97
1
160
マネジメント視点でのre:Invent参加 ~もしCEOがre:Inventに行ったら~
kojiasai
0
470
Fargateを使った研修の話
takesection
0
120
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Code Reviewing Like a Champion
maltzj
519
39k
How to Ace a Technical Interview
jacobian
275
23k
For a Future-Friendly Web
brad_frost
175
9.4k
We Have a Design System, Now What?
morganepeng
50
7.2k
Music & Morning Musume
bryan
46
6.1k
The Art of Programming - Codeland 2020
erikaheidi
51
13k
A Philosophy of Restraint
colly
203
16k
Code Review Best Practice
trishagee
64
17k
RailsConf 2023
tenderlove
29
880
The Invisible Side of Design
smashingmag
297
50k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
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