⑧ 発見したソースコードを読み、ユーザーの入力からレスポンスまでの処理の流れを調査 a. ⑥で確認したリクエストパラメータ からurlの値を取得 b. ユーザーから受け取ったurlを messageに格納 c. reply.view() にてmessageを受け取り search.ejsを用いて ブラウザに返すレスポンスを作成する 78
エラーの出る箇所は、以下の2箇所でした。 ログインページ http://localhost:5000/login ① いずれかに「'」を入力 検索ページ http://localhost:5000/posts/search ① いずれかに「'」を入力 ② ログイン ③ SQLエラーが表示される 124 ③ SQLエラーが表示される ② 検索
UNION句を利用する ヒント2: UNION句では結合元とカラム数を一致させる必要がある 5-1で調査したソースコードより、赤字の部分に 任意の文字列を差し込めることがわかる (urlのみを入力した場合) SELECT id, comment, <中略> FROM posts LEFT JOIN users <中略> WHERE urls.url LIKE '%<入力可能>%' ORDER BY posts.created̲at DESC 129 ← usersテーブル自体は読み込まれている ←ここで何らかの形でpasswordカラムを 取得するようにしたい 演習解説
① 検索ページ http://localhost:5000/posts/search にアクセス ② いずれかに以下のクエリを入力 ③ 検索 %' UNION SELECT 1, password,1,username,1,1,1,1,1,1,1,1 FROM users; # 131 ④ 通常の検索結果の後までスクロールすると、 全員のusernameとpasswordが表示されている UNIONにより 元の検索結果にパスワードの行が追加された!
'%ユーザーの入力%' 「'」で囲われた部分は文字列として解釈 ユーザーの入力の途中に「'」が含まれていたら・・・? SELECT * FROM users WHERE comment LIKE '%' UNION SELECT * FROM users;-- '%' ここで文字列としては終わり 文字列ではない部分として解釈される 好きなクエリ文を追記できる 135
1つ上の階層に戻る「..」ディレクトリを活用し ルートディレクトリまで上がった上で好きなディレクトリを指定すれば良い ② http://localhost:5000/uploads?path=../../../../../../../../../../../../etc/passwd にアクセス ④ 以下のようなテキストファイルが取得できていることを確認 ③ ダウンロードされたファイルを開く 141