nikkie-ftnextの日記

イベントレポートや読書メモを発信

これがSQLインジェクション! やられサイトBad Todo Listで体験し、湯婆婆に対する防衛術を習得しました!

はじめに

贅沢な名だね、とは言わせねーよ! nikkieです。

実習として、やられサイトにSQLインジェクションしました。
これで湯婆婆と遭遇しても身を守れます!

目次

やられサイトBad Todo List

Webセキュリティでおなじみ、徳丸さんが公開されている脆弱性診断実習用アプリです。

インストール方法はこちら:
https://github.com/ockeghem/badtodo/blob/90966d999b258e7cf458bf9b6a6fdfb828c71407/docs/install.md

  • リポジトリをclone
  • docker compose up -dで立ち上がります!(簡単👏)
    • macOS(M1 Mac)ですが、特にハマりませんでした
  • 私は「PROXYを経由しない設定方法」でアクセスしています:http://127.0.0.1:4080/todo/

脆弱性の概要はこちら:
https://github.com/ockeghem/badtodo/blob/90966d999b258e7cf458bf9b6a6fdfb828c71407/docs/vulnerabilities.md
SQLインジェクション」もサポート1しています

脱線:湯婆婆とSQLインジェクションってなんの関係があるの?

湯婆婆は『千と千尋の神隠し』に登場する、名前を奪う魔女です(※すごーく語弊のある紹介)。
元画像:https://www.ghibli.jp/works/chihiro/#&gid=1&pid=16ジブリさんの公開に感謝)

技術要素とどんな関係があるかというのは、当然の疑問ですね。

千尋が名前を伝えるときにSQLインジェクションするというツイートがあるんです!

Bad Todo ListがSQLインジェクションをサポートしていると知ったとき、「これやってみたい!」とテンションが上がりました(念のためですが、あくまでやられサイトへの実習としてです)

実習 SQLインジェクション

検索画面を触っていきます。

この検索画面はtodoを検索できるのですが、

  • デフォルトで文字列の完全一致
  • 「あいまい検索」にチェックを入れると部分一致

です。
ログインせずに進めています。

ツイートを元に「パソコンを買う'」と末尾にシングルクォートを付けて検索。

検索時にエラーが発生しました SELECT todos.id, owner, users.userid, todo, c_date, due_date, done, org_filename, real_filename, public FROM todos INNER JOIN users ON users.id=todos.owner AND (todos.owner=-1 OR ?) AND (todos.owner = ? OR todos.public > 0 OR ? > 0) AND todo = 'パソコンを買う'' SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''パソコンを買う''' at line 1

あっれー?? SQL文全部見えちゃってるじゃないですか!!!!(おいおいおいおい)

「パソコンを買う';」だと普通に検索できます。

でもSQL文としては完結しているはずだから、この後にDROP TABLEを入れると...

「パソコンを買う'; DROP TABLE todos;」

検索結果が表示されますが、これでtodosテーブルが消えたので、トップに戻るとぶっ壊れてます!

検索時にエラーが発生しました SELECT todos.id, owner, users.userid, todo, c_date, due_date, done, org_filename, real_filename, public FROM todos INNER JOIN users ON users.id=todos.owner AND (todos.owner=-1 OR ?) AND (todos.owner = ? OR todos.public > 0 OR ? > 0) SQLSTATE[42S02]: Base table or view not found: 1146 Table 'todo.todos' doesn't exist

これがSQLインジェクション...!!

ぶっ壊しておいてなんですが、初期状態に戻すのにちょっとハマりました。
ボリューム込みで落とす(down)必要があります。

% docker compose down --volumes

終わりに

やられサイトBad Todo Listの実習でSQLインジェクションしました。

これで湯婆婆に遭遇しても名前を取られずに身を守れるぞ〜

徳丸本など参照して、今後理解を深めていきたい!

⚠️最後に。ローカル環境のやられサイトだから嬉々として実習していますが、これを同じテンションで実サイトにやったら、攻撃したことになっちゃうぞ❤️(よいハッカーはやらないでね)


  1. サポートという言い回しは適切なのかな?