1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[writeup] picoCTF "Local Authority"

Posted at

今回の問題

picoCTFより"Local Authority"を解いていきます。

実際に解いていく

1. 問題文にあるWebサイトに移動する

Local Authority_1.png
ふむふむ。ユーザー名とパスワードには、文字と数字のみが使用できるみたいです。

2. 適当な答えを入力してみる

Local Authority_2.png
正しいユーザー名とパスワードがわからないので、とりあえず適当な答えを入力して、Webサイトの動きを確認してみます。
もちろん、ログイン失敗です。
これ以上Webページも進めそうにないですね。

3. Webインスペクタを開く

Local Authority_3.png
Webインスペクタを開いて、ソースコードを確認します。
すると、HTMLファイルの中にsecure.jsを発見!!
怪しいですな。見てみましょう。

4. secure.jsを確認する

Local Authority_4.png
[Elements]タブから[Sources]タブに移動します。
そして、先ほどのsecure.jsの中身を確認します。
なんと、ユーザー名とパスワードを発見しました。

5. 見つけたユーザー名とパスワードを入力する

Local Authority_5.png
ユーザー名とパスワードを入力して...
FLAG獲得!!やったーーー!!
...と、喜びたいところですが結局この問題は何だったのか?疑問が残ります。

もう少し考えてみる

さて、ここからが本題です。この問題のカラクリを解き明かしていきますよ。

1. まず初期状態の[Sources]タブを確認してみる

Local Authority_6.png
[Sources]タブには、index.htmlとstyle.cssの2つのファイルがありました。
このうち、style.cssはWebサイトの背景色について3行のみの記述でした。
index.htmlの16行目のformタグに注目!
login.phpというURLに、POSTメソッドで入力されたユーザー名とパスワードを送信しています。

2. 次に適当な答えを送信後の[Network]タブを見てみる

サーバーとのやりとりは[Network]タブを見ることで確認できます。[Network]タブは、Webブラウザとサーバーの間でどんな通信が行われたかをリアルタイムで見られる機能です。せっかくなので見てみましょう。
Local Authority_7.png
login.phpにリクエストを送信、レスポンスとしてstyle.cssとsecure.jsが返ってきたことを確認できました。

3. [Sources]タブを確認する

Local Authority_8.png
一目見てわかるように、HTMLが変化しています。
そして、HTMLファイルにも書かれているように、style.cssとsecure.jsも新しく返ってきています。

4. 核心に迫る

ここで、この問題の重要なポイントに気づきました。
それは、パスワード検証をサーバー側ではなく、クライアント側で行っていることです!
本来、パスワード検証は「サーバー側で受け取って、データベースと照合して成功→セッション発行、失敗→エラー」のようにすべきです。
しかし、今回のようにクライアント側で行ってしまうと、誰でも見られる&改ざんできてしまいます。まさに、これが今回の脆弱性でした。この脆弱性を利用してFLAGを獲得していたのです。

5. FLAG獲得までの流れ

変わった後のHTMLファイルを見てください。
Local Authority_9.png
windowオブジェクトに、自分が入力したユーザ名とパスワードが保存されています。
そして、その2つを利用してsecure.jsのcheckPasswordを実行→パスワード検証をしています。
(繰り返しになりますが、今回はパスワード検証がサーバー側ではなく、クライアント側で行われていることがわかるかと思います。)
パスワード検証の結果が
不正解→そのまま現在のページ(Log In Failedと書かれている)で処理が終わる。
正解→login.phpからadmin.phpにリクエストを送信する。

admin.phpにリクエストが送信されると、FLAGが書かれたHTMLに変わります。
Local Authority_10.png

まとめ

システムの流れはざっとこんな感じになります

  1. ユーザー名・パスワードを入力
  2. login.phpに送信
  3. ログイン失敗のhtml, secure.java, style.cssが返ってくる
  4. 同時に、入力された答えが正しいかどうかをチェック(secure.javaをもとに、クライアント側でチェック)
  5. 不正解ならば、ここで終了
  6. 正解ならば、admin.phpにリクエストを送信
  7. FLAGの書いてあるhtml, style.cssが返ってくる

以上です。お疲れ様でした。

補足

・JavaScriptは基本、クライアント側で実行されます。つまり、JavaScriptに書いた時点で誰でも読めるかもということです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?