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

こわくないOSWE

y0d3n
September 07, 2024
700

 こわくないOSWE

2024/09/07 OffSecLab MeetUp in 渋谷オフ会

y0d3n

September 07, 2024
Tweet

Transcript

  1. @y0d3n $ whoami 名前: 養⽥ 篤也 (よーでん) SNS : @y0d3n

    / @y0d3n.bsky.social 所属: GMOサイバーセキュリティ byイエラエ株式会社 興味: Web Security, Web Pentesting 2
  2. @y0d3n ご案内 - お⼿洗いは16Fフロアのゲートを出て右側にあります。 - 16Fゲートはゲストカードをタッチすれば⾃由に通れます。 - 飲み物の⾃動販売機は⾃由にご利⽤ください。 - ⼀部無料のものもあります。

    - 建物の外に出る際、ゲストカードは回収されます。 - 8Fのゲートはゲストカードをタッチしても空きません。 - ⼀番左のレーン、回収ボックスに⼊れることでゲートが開きます。 5
  3. 7

  4. 9

  5. 11

  6. 13

  7. @y0d3n OSWEとは - OffSec Web Expert - WEB-300: Advanced Web

    Attacks and Exploitation - Webペネトレーションテストやソースコード診断にフォーカスした資格 - Webアプリ内での権限昇格 35pt + RCE 15pt のマシンが2台 - 85pt 以上で合格 - 実技(48h) + レポート作成(24h) の最⻑72時間 15
  8. @y0d3n 扱う脆弱性 - XSS - SQL Injection - SSTI -

    LFI / RFI - Directory Traversal - Prototype Pollution - Insecure Deserialization - … 16
  9. @y0d3n このコード、どこが問題? <body> <form method="GET"> <input type="text" name="input"> <input type="submit"

    value="送信"> </form> <?php if (!empty($_GET["input"])) { print $_GET["input"]; } ?> </body> 26
  10. @y0d3n このコード、どこが問題? <body> <form method="GET"> <input type="text" name="input"> <input type="submit"

    value="送信"> </form> <?php if (!empty($_GET["input"])) { print $_GET["input"]; } ?> </body> XSS 27
  11. @y0d3n このコード、どこが問題? <?php try { $db = new PDO('mysql:host=mysql;dbname=db', $user,

    $pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $sql = 'SELECT age FROM users WHERE name=\'' . $_GET["input"] . '\';'; $stmt = $db->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); } 28
  12. @y0d3n このコード、どこが問題? <?php try { $db = new PDO('mysql:host=mysql;dbname=db', $user,

    $pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $sql = 'SELECT age FROM users WHERE name=\'' . $_GET["input"] . '\';'; $stmt = $db->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); } SQL Injection 29
  13. @y0d3n このコード、どこが問題? <body> <form method="GET"> <input type="text" name="file"> <input type="submit"

    value="送信"> </form> <?php if (isset($_GET['file'])) { $file = $_GET['file']; include($file); } ?> </body> 30
  14. @y0d3n このコード、どこが問題? <body> <form method="GET"> <input type="text" name="file"> <input type="submit"

    value="送信"> </form> <?php if (isset($_GET['file'])) { $file = $_GET['file']; include($file); } ?> </body> Directory Traversal 31
  15. @y0d3n このコード、どこが問題? <body> <form method="GET"> <input type="text" name="file"> <input type="submit"

    value="送信"> </form> <?php if (isset($_GET['file'])) { $file = $_GET['file']; include($file); } ?> </body> Directory Traversal Local File Inclusion Remote File Inclusion 32
  16. @y0d3n 目標は? 認証回避 情報盗取 情報更新 RCE … DBMSは? MySQL MSSQL

    PostgreSQL Oracle DB … 対策は? 無し クォート禁止 数字のみ 空白禁止 前提は? 非エスケープ クォートで 囲まれない エスケープ済 SQL Injectionの思考 … … SQL操作不可 43
  17. @y0d3n 目標は? 認証回避 情報盗取 情報更新 RCE … DBMSは? MySQL MSSQL

    PostgreSQL Oracle DB … 対策は? 無し クォート禁止 数字のみ 空白禁止 前提は? 非エスケープ クォートで 囲まれない エスケープ済 SQL Injectionできないパターン … … SQL操作不可 44
  18. @y0d3n 目標は? 認証回避 情報盗取 情報更新 RCE … DBMSは? MySQL MSSQL

    PostgreSQL Oracle DB … 対策は? 無し クォート禁止 数字のみ 空白禁止 前提は? 非エスケープ クォートで 囲まれない エスケープ済 SQL Injectionできそうなパターン … … SQL操作不可 45
  19. @y0d3n レポート要件(⼀部) - local.txt を抜き出す - local.txt と proof.txt の両⽅を抜き出す

    - リバースシェルを⽣成する どれかを 完全⾃動化したPoC の作成が必要  → マシンに触れる実技48時間のうちにPoCを完成させないと 実質詰み 46
  20. @y0d3n 完全⾃動化ということ - ユーザ登録‧ログイン - ペイロード付きのリクエストを投げて攻撃 - CSRF token等を都度取得して利⽤ -

    複数セッションの使い分け - Blindで1⽂字ずつ情報を抜くのを全⾃動化 - bot が XSS を踏むまで待機して、セッションハイジャック これらが安定して動作するexploit 47
  21. @y0d3n 完全⾃動化ということ - ユーザ登録‧ログイン - ペイロード付きのリクエストを投げて攻撃 - CSRF token等を都度取得して利⽤ -

    複数セッションの使い分け - Blindで1⽂字ずつ情報を抜くのを全⾃動化 - bot が XSS を踏むまで待機して、セッションハイジャック これらが安定して動作するexploit めんどい!! 48
  22. @y0d3n スニペットの⽤意 できるだけ速やかに PoC を書くためのいろいろな準備 - 各攻撃の基本的な exploit の⽤意 -

    レスポンスの任意の箇所を取得する正規表現 - Blind SQL Injection は⼆分探索やスレッド化 - Webサーバを建て、bot からのリクエストを起点に exploit 49