Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2025新卒研修・Webアプリケーションセキュリティ #弁護士ドットコム

2025新卒研修・Webアプリケーションセキュリティ #弁護士ドットコム

2025年入社の新卒エンジニア向けに実施した研修「Webアプリケーションセキュリティ」の資料です。弁護士ドットコム株式会社 開発本部 技術戦略室の太田良典が講師として登壇しました。

セッションタイトル:2025年入社の新卒エンジニア向け研修「Webアプリケーションセキュリティ」

■ 弁護士ドットコム株式会社プロダクト組織について
https://speakerdeck.com/bengo4com/introduction-for-creators

■ 採用情報はこちら
https://hrmos.co/pages/bengo4/jobs

■ テックブログ:弁護士ドットコム Creators’ blog
https://creators.bengo4.com/

■ X(Twitter):弁護士ドットコム CREATOR'S
https://x.com/bengo4_creators

Avatar for 弁護士ドットコム

弁護士ドットコム

August 19, 2025
Tweet

More Decks by 弁護士ドットコム

Other Decks in Technology

Transcript

  1. Bengo4.com, Inc. 今日のお話 9 • 1. セキュリティとは何か • 2. HTTPとHTTPS

    • 3. Cookie • 4. Same Origin policy • 5. Webアプリケーションの脆弱性 • 6. おわりに
  2. Bengo4.com, Inc. 情報セキュリティの 3大要素 13 以下の3つを情報セキュリティの3大要素という • 機密性 (Confidentiality) •

    完全性 (Integrity) • 可用性 (Availability) さらに、真正性 (Authenticity) 、責任追跡性 (Accountability) 、 否認防止 (Non-repudiation) を加えて6大要素とすることもある
  3. Bengo4.com, Inc. 機密性 (Confidentiality) • 機密情報が漏れると問題が生じる ◦ 個人情報、顧客情報、パスワード等 • 漏れ方はさまざま

    ◦ データベースからの漏えい ◦ 通信経路上での傍受 ◦ 社内ネットワークへの侵入 ◦ 内部犯行による外部流出 14
  4. Bengo4.com, Inc. 完全性 (Integrity) • データが改ざんされると問題が生じる ◦ データの改ざん、Webページの改ざん • 改ざんで起きる現象はさまざま、

    一見してわからないもの も ◦ 政治的主張に書き換え? ◦ Webページでウィルスを配布 ◦ 他人のサーバーでひそかに暗号通貨のマイニング 15
  5. Bengo4.com, Inc. 可用性 (Availability) • サービスが使えなくなる と問題が生じる ◦ Webサイトのダウン、サービスの停止 •

    使えなくなる理由は様々 ◦ アクセスの殺到 ◦ DoS攻撃 ◦ ランサムウェア これを考えないと、 「サービスが停まっていれば事故は起きない」 となりかねない 16
  6. Bengo4.com, Inc. IPA 情報セキュリティ 10大脅威 19 IPA (独立行政法人 情報処理推進機構) が

    毎年発行している文書 日本国内の世間一般で良くみられた脅威を 集計、専門家の投票で順位づけして 上位10件を公表するもの よく順位が一人歩きするが、 順位に深い意味はない
  7. Bengo4.com, Inc. Phishing campaign impersonates Booking .com, delivers a suite

    of credential-stealing malware https://www.microsoft.com/en-us/security/blog/2025/03/13/phishing-campaign-impersonates-bo oking-com-delivers-a-suite-of-credential-stealing-malware/ 26
  8. Bengo4.com, Inc. ミスを誘発するサービスというものもある 人為ミスによる事故の中には、人の問題というよりも アプリケーションやサービス側の問題 と言えるものもある • 操作がわかりにくく、ミスを誘発 する •

    設定項目や動作原理がまぎらわしく、予想外の結果 になる • 安全ではないのに、安全と誤解されるような説明 がされている これらはどちらかというとユーザビリティの問題に近いが、 セキュリティエンジニアの責任範囲 であると考えている 使いにくさ や、不適切な説明 を無視してはならない 28
  9. Bengo4.com, Inc. 脆弱性とは 30 セキュリティ上の問題 につながるソフトウェアやシステムの欠陥 • 種類や原因はさまざま ◦ プログラムのバグ

    によるもの ◦ 仕様・設計上の不具合 (設計ミス) • 有名なソフトウェアにもしばしば存在する • Webアプリケーションにもしばしば脆弱性がある
  10. Bengo4.com, Inc. 悪用の例 • 個人情報などの秘密情報を勝手に閲覧 する • Web サイトの内容を書き換える •

    サイトを閲覧した利用者の PC をウイルスに感染させる • 別の利用者になりすまし 、秘密情報の閲覧、買い物、送金など • コンピュータ資源を勝手に使う (暗号通貨のマイニングなど) • Web サイトを利用不能にする • オンラインゲームで無敵になる、アイテムを好きなだけとる 34
  11. Bengo4.com, Inc. セキュリティとは何か • 情報セキュリティの 3大要素 ◦ 機密性、完全性、可用性 • 脅威と脅威分析

    ◦ 潜在的な危険・リスクを脅威と呼ぶ ◦ 組織やシステムの脅威分析をしてリスクに備えることがある • 事故はなぜ起きるか ◦ 人為的なミスが多い ◦ システムのバグや欠陥、脆弱性が原因となることも多い 36
  12. Bengo4.com, Inc. リクエスト行 POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 43 先頭はリクエスト行と呼び、 以下の情報を含む • メソッド • ターゲット • HTTPバージョン
  13. Bengo4.com, Inc. リクエストメソッド POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 44 リクエストの種類をあらわす もっともよく使われるのは 単にリソースを取得する GET サーバーにデータを送信する ときはPOSTを使う このほか、HEAD や OPTIONS などのメソッドが利用される
  14. Bengo4.com, Inc. リクエストターゲット POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 45 リクエストの対象をあらわす 省略はできない http://www.bengo4.com にアクセスすると、ブラウザ側で http://www.bengo4.com/ に補正され、 リクエストターゲットは / となる
  15. Bengo4.com, Inc. リクエストヘッダ POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 47 リクエスト行の後に、 CR+LF 1つで区切って リクエストヘッダが続く
  16. Bengo4.com, Inc. ヘッダフィールド POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 48 リクエストヘッダ内の個々の行は ヘッダフィールドと呼ばれる フィールド名: フィールド値の形 それぞれのヘッダフィールドは CR+LF 1つで区切られる
  17. Bengo4.com, Inc. よくあるリクエストヘッダ • Host ◦ 接続先のホスト名とポート番号を指定、HTTP/1.1以降では必須 • Content-Length ◦

    メッセージボディの長さをオクテット単位で指定 • User-Agent ◦ ユーザーエージェント名を指定 • Accept ◦ 受入可能なMIMEタイプを指定 • Cookie ◦ 過去に受け取った Cookie の値を送信。詳しくは後ほど 49
  18. Bengo4.com, Inc. リクエストボディ POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83

    User-Agent: curl/7.16.3 name=john&age=12 50 リクエストヘッダの後、 CR+LFを2つ続けて書くと ヘッダの終了を意味する その後ろはリクエストボディ リクエストメッセージ本体となる メソッドの種類によっては、 ヘッダのみでボディがないことも GETなどはボディがない
  19. Bengo4.com, Inc. HTTPレスポンスの例 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; <!DOCTYPE html> <html lang="ja"> … 53
  20. Bengo4.com, Inc. ステータス行 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; <!DOCTYPE html> <html lang="ja"> … 54 先頭行は「ステータス行」 以下を含む • HTTPバージョン • ステータスコード • リーズンフレーズ
  21. Bengo4.com, Inc. ステータスコード HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; <!DOCTYPE html> <html lang="ja"> … 55 3桁の整数値 意味はおおよそ以下の通り 100番台: 情報提供 200番台: 成功 300番台: リダイレクト 400番台: クライアント側エラー 500番台: サーバー側エラー
  22. Bengo4.com, Inc. リーズンフレーズ HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; <!DOCTYPE html> <html lang="ja"> … 56 何らかのテキスト 仕様的には特に意味はない レスポンスを人間が見た時に わかりやすくするためのもの (今のHTTPを人間が直接見る ことがあるだろうか……?) 仕様的には特に意味はない ユーザーエージェントは これを無視するべき
  23. Bengo4.com, Inc. レスポンスヘッダ HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; <!DOCTYPE html> <html lang="ja"> … 57 ステータス行の後に、 CR+LF 1つで区切って レスポンスヘッダが続く
  24. Bengo4.com, Inc. よくあるレスポンスヘッダ • Date ◦ レスポンスを生成した日時を示す • Last-Modified ◦

    リソースの最終更新日時を示す • Content-Length ◦ メッセージボディの長さをオクテット単位で指定 • Content-Type ◦ リソースの種類を示すMIMEタイプを指定 • Set-Cookie ◦ Cookie の値を送る。詳しくは後ほど 58
  25. Bengo4.com, Inc. TLS TLS = Transport Layer Security トランスポート層で通信を暗号化するプロトコル 昔使われていたSSLというプロトコルの後継

    現在SSLは使われていない が、あわせてSSL/TLSと呼ぶこともある TLSの上にアプリケーション層のプロトコルを載せることができる もっともよく使われるのはHTTPで、HTTP over TLS と呼ばれる このほか、SMTP over TLS、FTP over TLSなどいろいろある 68
  26. Bengo4.com, Inc. TLSの機能 TLSは以下のような機能を提供する • 通信内容の暗号化 • 通信内容の改ざん防止 • 通信相手の認証

    (なりすまし 防止) 単に「暗号化」と説明されることが多いが、 暗号化は機能の一部に過ぎない むしろ通信相手を認証することが重要 69
  27. Bengo4.com, Inc. サーバー証明書 73 SSL/TLS証明書と呼ばれることも TLSの通信相手のサーバーが真正なものであることを証明 サーバー内に秘密鍵を持っておき、鍵に対応する証明書を公開 する 証明書には対象となるサイトのドメインの情報 が書かれており、

    別のドメインに使いまわすことはできない 証明書には認証局の署名 がついていて、偽造困難 その認証局の署名にもさらに別の認証局の署名がついている 最終的にルート証明書まで遡る (Trust Chain)
  28. Bengo4.com, Inc. HTTPとHTTPS • HTTP = Hypertext Transfer Protocol ◦

    リクエストとレスポンスがあり、それぞれにヘッダがある ◦ HTTPの内容は開発者ツールでもある程度は見られる ◦ 状態を持たない、ステートレスなプロトコルである • HTTPS ◦ インターネット通信にはリスクがある ◦ TLSで通信を暗号化する ◦ サーバー証明書でなりすましの防止をする ◦ TLSだからといって安全というわけではない 80
  29. Bengo4.com, Inc. RFC 6265 の概要 84 ブラウザからアクセスがあった時、サーバー側は HTTPレスポンスヘッダに Set-Cookie: フィールド

    を出力して name / value のペアを渡す ブラウザはその name / value を記憶しておく 以後、同じサイトにアクセスする時に HTTPリクエストヘッダに Cookie: フィールド を出力して name / value のペアを渡す ブラウザが自動で送る ので、ユーザーが意識することはない
  30. Bengo4.com, Inc. さきほどの例 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length:

    7887 Date: Thu, 19 Aug 2021 10:00:02 GMT Last-Modified: Tue, 17 Aug 2021 14:00:11 GMT Set-Cookie: dlid=form01-83;Path=/; expires=Mon, 05-May-2025 08:50:20 GMT; 85 POST /form.php HTTP/1.1 Host: www.example.com Cookie: dlid=form01-83 User-Agent: curl/7.16.3 name=john&age=12
  31. Bengo4.com, Inc. Cookieによるセッション管理 ユーザーがログインした際、サーバー側でセッション IDを発行 ユーザーIDとセットにして内部で記憶 しておき、 同時に、Set-Cookie でその値を渡す ブラウザはその値を受け取り、以後は

    Cookie でその値を渡す サーバー側は Cookie の値を受け取り、内部の記憶と照合して 過去に発行したセッション IDに同一のものがあるか判定 する 同一のものがあれば、そのセッションIDとセットのユーザーIDから セッション情報を復元、そのユーザーのセッションとみなす 86
  32. Bengo4.com, Inc. 別サイトのリソースを参照すると ? サイトAからサイトBにページ遷移したときは、 サイトBが表示され、サイトBで発行されたCookieが送られる サイトAに、サイト Bの画像を埋め込んで表示 したらどうなるか? サイトAへのリクエストではサイトAのCookieが、

    サイトBへのリクエストではサイトBのCookieが送られる このようなとき、サイトBのCookieを 「サードパーティ Cookie」と呼ぶ 画像に限らず、JavaScriptからのリクエストなども同様 95
  33. Bengo4.com, Inc. セッション IDが漏れると …… 105 番号送るで! Cookie: 9466ir8fgmmk1gnr6raeo7ne71 パスワードは

    送られてきてないけど 番号はさっきのやつやな ! マイページ見てよし
  34. Bengo4.com, Inc. セッション IDの推測 セッションIDの生成規則が単純だと推測できてしまう たとえば、2回のアクセスで以下のCookieが発行されたとする Set-Cookie: dlid=form01-83; Set-Cookie: dlid=form01-84;

    過去どんなIDが生成されたか、次どんなIDが生成されるか一目瞭然 一見ランダムなようで実は推測できてしまうというケースもある 基本的に、セッションIDの生成処理を自前で書くべきではない 106
  35. Bengo4.com, Inc. Expires Cookie 値の期限が切れる日時を指定する RFC 1123形式で時刻を指定 例: Set-Cookie: a=b;

    Expires=Mon, 05-May-2025 08:50:20 GMT; • 過去日が指定されているとブラウザは即座に Cookie を削除 Cookieを削除させたい時にあえて使うことがある 110
  36. Bengo4.com, Inc. Max-Age Cookie 値の有効期限を秒数で指定する Expiresと似ているが、現在時刻からの相対的な長さとなる 例: Set-Cookie: a=b; max-age=86400;

    • 0 が指定されているとブラウザは即座に Cookie を削除 • ExpiresとMax-Ageの両方があるときはMax-Ageが優先 • どちらの指定もない場合、ブラウザセッションの終了まで有効 ◦ 昔のRFCではこれを “session cookie” と呼んでいたが 「セッション管理用のCookie」と紛らわしいので注意 111
  37. Bengo4.com, Inc. Domain Cookieが送信される対象ドメインを指定 例: Set-Cookie: a=b; Domain=bengo4.com; デフォルトでは、たとえば www.bengo4.comのCookieはbbs.bengo4.comには送られない

    が、上記の設定をするとサブドメイン全てに送られるようになる かなり危険な設定 なので、よほどのことがない限り使用しないこと これがあるだけで、サブドメインを増やすことがリスクになる 112
  38. Bengo4.com, Inc. Path Cookieが送信される対象パスを指定 例: Set-Cookie: a=b; Path=/corporate/; デフォルトでは同一ドメイン上のどこでもCookieは読める この属性があると、指定したパスの外ではCookieが送られない

    一見、指定した方が安全そう だが、実はセキュリティ上は無意味 この指定がなくても問題がないようにしておく必要がある 安全であるかのような誤解を招くので、使用しないこと 113
  39. Bengo4.com, Inc. Secure この属性があると、HTTPSの場合のみCookieが送られる TLSが使われていない、平文のHTTPではCookieが送られない 例: Set-Cookie: a=b; Secure; 常時HTTPSが常識になった現在では常に指定するべき

    この属性がついていないと、脆弱性として指摘される なお、平文のHTTPでもSet-Cookieでセットすることはでき、 セットされたCookieはHTTPSでも送られる 114
  40. Bengo4.com, Inc. SameSite属性 「クロスサイト」アクセス時のCookie送信の挙動を制御 例: Set-Cookie: a=b; SameSite=strict; • none:

    送る • strict: 送らない • Lax: トップレベルナビゲーション (ページ遷移) の時だけ送る 未指定時は、Lax に近いが微妙にゆるい Lax-allowing-unsafe というモードで動作することがある 119
  41. Bengo4.com, Inc. Cookie Prefix Cookieに特別な名前がついている場合、発行を抑制する • Cookieの名前の先頭に __Secure- とつけると ◦

    CookieにSecure属性がついていない場合、拒否される ◦ 平文HTTPで発行された場合、拒否される • Cookieの名前の先頭に __Host- とつけると、上記に加えて ◦ CookieにDomain属性がついている場合、拒否される ◦ CookieにPath属性がついている場合、拒否される 開発者の設定ミスや、攻撃者によるCookieの発行を防ぐ 120
  42. Bengo4.com, Inc. Cookie • ステートレスなHTTPにセッション管理機能を追加するもの ◦ RFC 6265に仕様が書かれている ◦ Cookieはサイトごとに記憶され、他サイトには送られない

    ◦ ユーザーは自身のCookieを書き換えられる • セッションIDの漏洩、推測、強制が問題になる • Cookieにはさまざまな属性がある • 最近、セキュリティ関連の機能が追加されている 122
  43. Bengo4.com, Inc. 他サイトの情報が読み取れない理由 iframe内の自サイトのコンテンツは読み取れるのに、 他サイトのコンテンツは読めなかった これは、Same Origin policy (同一生成元ポリシー、 SOP)

    と呼ばれる制約によってブラウザ側の挙動が制限されているため 攻撃者が他サイトの認証後画面の情報を読めないように、 このような制約が設けられている 133
  44. Bengo4.com, Inc. オリジンの条件 以下の全てを満たす場合、「オリジン」が同一とみなす • URLのホスト(FQDN; Fully Qualified Domain Name)が一致

    • スキームが一致 • ポート番号が一致 Cookieのサイト・ドメインの判定とは異なり、 スキームの一致も求められる また、パス (ディレクトリ) は考慮されない 136
  45. Bengo4.com, Inc. オリジン比較の例 https://www.bengo4.com/ から見た時、以下は別オリジン • https://bbs.bengo4.com/ • http://www.bengo4.com/ •

    https://www.bengo4.com:8080/ 以下は同一オリジン • https://www.bengo4.com/corporate/ • https://www.bengo4.com:443/ 137
  46. Bengo4.com, Inc. Cross-Origin Resource Sharing ( CORS ) 140 正規の理由で他オリジンのコンテンツにアクセスしたいこともある

    そのために Cross-Origin Resource Sharing ( CORS ) という仕組みがある クロスオリジンでアクセスしようとしたとき、 アクセスを受ける側がHTTPヘッダに 適切な Access-Control-Allow-Origin: を出力していると、 ブラウザ側は読み取りを許す
  47. Bengo4.com, Inc. Same Origin policy • 同一生成元ポリシー、SOPとも呼ばれる • オリジンという単位で制御される ◦

    スキーム、ホスト、ポートの全てが一致すると同一オリジン ◦ パスが異なっていても同一オリジン ◦ 他オリジンのコンテンツはユーザーには表示されるが、 サイト側では読み取れない ◦ 同一オリジン上にコンテンツを置くと、強い権限を与えることに • CORSという仕組みでこの制限を突破することもできる 143
  48. Bengo4.com, Inc. クロスサイトスクリプティングとは Cross-Site Scripting XSS と略される (CSSと略すとCSSと紛らわしいため) 脆弱性の王 ほとんどのWebアプリケーションには、

    外部からの入力に応じて表示が変化する箇所がある 入力を工夫することで、この部分の構造を破壊して 攻撃者が意図したHTMLを出力させられる場合がある 146
  49. Bengo4.com, Inc. 属性でリンク先を表現 <p>詳しくは<a href="https://html.spec.whatwg.org/">HTML Living Standard</a>をご覧ください。</p> hrefが「属性名」 https://html.spec.whatwg.org/ が「属性値」

    属性名 = 属性値 の形で書き、属性値は引用符で括る 括らなくて良い場合もあるのだが、必ず引用符で括るべき これはセキュリティの観点からも非常に重要 149
  50. Bengo4.com, Inc. 参考: UTF-8の冗長符号化 UTF-8は各文字を1〜4バイトの可変長で表現する 「/」( U+002F) は0x2Fというバイト列になるが、 昔は2〜4バイトで表現することも可能だった (今の仕様では禁止)

    • 0xC0 0xAF • 0xE0 0x80 0xAF • 0xF0 0x80 0x80 0xAF このようなバイト列は、/ と解釈されたりされなかったりした かつて IIS にこの脆弱性があり、Nimdaウイルスに悪用された 163
  51. Bengo4.com, Inc. Webアプリケーションの脆弱性 実事例も含め、さまざまな脆弱性を紹介した • クロスサイトスクリプティング ◦ DOM Based XSS

    • SQLインジェクション • CSRF • アップロードファイルによるサーバー側スクリプト実行 • 認可制御の不備 • キャッシュからの情報漏洩 • セッションIDの推測 190
  52. Bengo4.com, Inc. 常にセキュリティを意識する 193 システム開発においてセキュリティは非機能要件 機能としては明確に要求されない ことが多い 誰も意識していないと、セキュリティが完全に欠落 してしまう 常に頭の片隅には置いておく必要がある

    セキュリティ事故の多くは人為ミスや、組織の問題で起きる 実際のところエンジニアの責務ではないことが多いが、 エンジニアでなければフォローできないことも多い エンジニアは、セキュリティについて常に意識しておくべき
  53. Bengo4.com,Inc. VISION まだないやり方で、世界を前へ。 Drive a paradigm shift for the better

    world. MISSION 「プロフェッショナル・テック 」で、次の常識をつくる。 Be the Professional-Tech Company. プロフェッショナルだからできること。専門知とテクノロジーで、社会に貢献する。
  54. Bengo4.com, Inc. OUR SERVICE 税理士に無料で相談・検索できる日本最大級の 税務相談ポータルサイト 最新の法改正や実務について分かりやすく解説する 日本最大級の企業法務ポータルサイト 日本最大級の無料法律相談ポータルサイト 時事問題の弁護士解説を中心としたメディア

    弁護士事務所、企業法務職向け人材紹介事業 AI基盤技術「 LegalBrain 1.0」を組み込んだ リーガル特化型 AIエージェント 契約の締結から管理までデジタルで完結させる 契約マネジメントプラットフォーム