WordPress login をちょっと工夫する

頭隠して、尻隠さずだったので、追記 7/26


ログイン画面だけから、ログインするわけではなくて、xmlrpcからも、ログインされる可能性があるので、


add_filter('xmlrpc_enabled', '__return_false');

外部編集ツールなどを使っていないなら、使っていないなら、停止しておきましょう

ここに書いてあるコードは、単にフィールドを追加しているだけなので、一度ログインフォームを読み込んで、フォームにあわせて適当な値をPOSTしてこられると、何の意味もなくなってしまいます。


クッキーとか、ローカルストレージとかと組み合わせたり、追加したフィールドの値を、日本語にして、コピーしようとしても、文字化けして再現できないように工夫するとか、対策する人特有の設定を含めてください。


また、wp-includes/pluggable.php を読んでおくといいと思います。

WordPressのログインは、wp-login.phpというファイルにユーザー名とパスワードを入力してログインします。


ユーザー名には、adminを使わないほうがいいとか、諸説ありますが、むしろパスワードを十分に複雑にしておけば、adminを使ったからといって直ぐにに危険という事ではないだろうと、私は考えています。



ユーザー名は、変更できないので、ニックネームは、ユーザー名とは別にしておくといった事が、賢いやり方かもしれません。


ただ、「IDは、adminのままで、いいよ とか IDは、Admin以外でも意味がない」とは、言う元気はありません。

ワードプレスは、表示するのにブラウザがなければ見れないですが、ブラウザには、パスワードの保存機能があって、IDが合致するとパスワードを自動的に入力してくれたりする

依存するものが、たくさんあります。

FAQ/ハッキング・クラッキング被害 - WordPress Codex 日本語版 などを見ても、ローカルコンピュータをスキャンするだとか、サイトのセキュリティを高めるとか、依存するものへの対策が必要である事がわかると思う。


例えば、嫁さんから、旦那がブログでなんかやってる等と疑われて、「オリーブフォースアタック(冗談)」を、旦那が風呂に入っている間に仕掛けられたら、どうする?など、


個別の諸事情があるので、私は、adminだから、すぐ危険な状態ではないけど、目立たないようにしておくのがいいんじゃない。というぐらいがいいんじゃないかと思っている。



転ばぬ先の杖



そう考えると、世の中には Brute Force Attack とかいう いかにも恐ろしげな攻撃があるのだそうで、そういった怖いアクセスの形跡があったりすると(あるかもしれないって思ったりすると)、やっぱり保険?に入っておいたほうがいいのかな、なんて思ったりする方もいるのではないかと思います。

total time: 4.18 sと表示されているように、わずか4秒とちょっとで元のパスワード「itmedia」が復元されました。

 今回の実験に用いたレインボーテーブルは、7文字までの、英字小文字と数字の組み合わせによるパスワードに対応したものです。しかし市販されているレインボーテーブルを用いると、「8文字までのASCII文字全部」や「10文字までの英字小文字と数字」を用いたパスワードハッシュを復元できます。

本当は怖いパスワードの話

ワードプレスの、ログインフォームは、とてもシンプルで、ログインフォームをコピーしてどっかその辺にぺたぺた貼り付けたくらいでも、IDとパスワードが一致すれば、ログインできるほどなので、まさに、Brute Force Attack をしたい人からみれば、うってつけの材料なのかもしれません。



うってつけの材料なので、パスワードやIDは、類推されないようにする事が大事で、adminでパスワードがpassとかだったら、やってくださいと待っているようなものです。



ワードプレス本体は、オープンソースなので、常に膨大な人の目にさらされています。メジャーバージョンの変更の時には、500とか600とかのバグが修正されるほど、活発なコミュニティーなので、本体そのものは、簡単に、クラックされるようにはなっていないだろうと考えていますが、



それ以外の、プラグインや、テーマファイルというものは、それほど多くの人が関心を持ちバグの報告をしてくれるようなものでもないので、むしろ、そちらのほうにバグや、脆弱性が潜んでいたりする可能性は、むしろ高いと思っています。



私もテーマを作っていますが、どこまでいっても、バグは見つかります。( 私は、無能なので、すべてのテーマやプラグインがそうだという事ではありません )





ただ、外部から直接ポストして、動作するのもちょっとアレだし、オープンソースなので、ちょっとだけカスタマイズしてみようかなと思い立ち、なんちゃってなアイディアを書いてみました。

(このなんちゃって、が新たな脆弱性を生むなんてことも、よくあるんですが )


テーマファイルの、functions.phpにぺたりと貼り付けるだけの、ぜんぜん本気じゃない機械的なPOSTをよけるだけですが、以下にメモを残します。


以下のコードは、何をしているのか


WordPressには、カスタマイズ用のアクションフックというのが、数え切れないぐらいあります。

このフックを使って、ログイン画面のフォームにフィールドを一つ追加して、POSTにこのフィールドがセットされていなかったら、処理をしないで、ブログのトップページに遷移するというものです。



ブルートフォース攻撃を、単に機械的に行うだけなら、場末のWordPressのログインフォームに、変なフィールドがあって、それがセットされていないとダメだよなんて攻撃する御仁は、いちいち考えてないだろうな位の発想のものです。


決め打ちされたら、アウトですが



取りあえず、今自分の出来る工夫を楽しみましょう。


工夫すれば、IDとパスワードの他に、なぞなそ認証を引っ付けるとか、いろいろ出来ると思います。

add_action( 'init','my_init' );

function my_init(){
add_filter( 'login_head', 'my_login' );
	add_action ('login_form', 'my_add_form' );
	add_action( 'login_init', 'my_case_break' );
}

function my_login( $content ){
	if( isset( $_POST ) and !empty( $_POST ) and !isset($_POST['local_check']) ){
		exit;
	}	
}

function my_case_break(){
	if( isset( $_POST ) and !empty( $_POST ) and !isset($_POST['local_check']) ){
		wp_redirect( home_url() );
		exit;
	}
}
function my_add_form(){
?>
<input type="hidden" name="local_check" value ="<?php echo uniqid ();?>" />
<?php
}


TOP