WordPressの脆弱性スキャンwpscanでログインID取得

全く空気を読まずに、またKali Linuxを使って(自宅サーバの)WordPress脆弱性を突いてみようと思う。前回やってみた際、「ニックネームを付けていても、どうしてログインIDを取得できてしまうのか?」が宿題になっていた。

予備知識

前回の記事(http://d.hatena.ne.jp/ozuma/20130820/1376927068)に書いたけど、おさらい。

  • WordPressは、ログインに用いる「ユーザ名」と、ブログの投稿者として表示される「表示名」がある。
  • ユーザ作成直後は、ユーザ名と表示名が一致している。
  • 表示名は閲覧者が目で見てすぐ分かるため、変更することが望ましい。そのままにしているとログインIDとしてブルートフォースの餌食となりやすい。
  • しかし表示名を変更しても、wpscanをかけるとユーザ名は取得できてしまう。Why?

テスト環境

まずWordPressは最新版の3.6を用いた。対象ユーザは新しく作ったjohnというユーザで、以下のように設定されている。

ユーザ名 表示名 ユーザ番号
john honey 2

表示名を"honey"にしているので、以下のように投稿者ページを見てもjohnという名前はどこにも無く、honeyしか見えない……パっと見は。

では、おもむろにwpscanをKali Linuxからかけてみよう。前と同じならば、johnが出てくるはず……。

ふーむ。やっぱり、元のユーザ名"john"がちゃんと盗られている。

ユーザ名はbodyタグにある

どうやってユーザ名を取得するのかを地道に探してみようかと思ったが、なんか面倒くさくなってきたので、wpscanのソースの方を読んでみることする。

どうやら lib/common/models/wp_user/existable.rb にて、以下のようにusernameを取得しているようだ。

login = body[%r{<body class="archive author author-([^\s]+) author-(\d+)}i, 1]

ほほう。と思ってこちらのHTMLを見ると、確かにbodyのところに "john" が入っている。

つまりWordPressのbodyタグにはclass属性があるが、その中に "author-${username}" という項目がある。ここはユーザ名そのままが入っており、表示名を変えても更新されないため、この値がそのままログインIDとしてブルートフォースアタックに使われてしまうようだ。なんてこったい。

では対策としては……うーん、無いね。少しいじってみたけど、ここの値を隠蔽することはできなかった。WordPress本体が何らかの対策をしてくれないとムリそう。

結論

ということで結論としては、「WordPressのログインIDは、隠すことは不可能」なようです。残念!