CryptographpにXSS(クロスサイト・スクリプティング)脆弱性
コメントスパム対策として、WordPress 2.5.1には最初からAkismetプラグインが同梱されているのは、既に周知の事実だと思うんだけど、コメントスパムの中には、Akismetを通過してしまうものもあるらしいね。
その場合は、都度、コメントスパムを削除して、コメントモデレーションやコメントブラックリストに単語を追加してやれば良いんだけど、スパムの為にわざわざアクションを起こすのは、スパムにしてやられた感があって、もやもやとさせられるのではないかと思うと、事前に何とかしておきたいよね。
という事で、機械的なコメントポストを防止する為に、Captchaを導入する事にしたよ。
導入したのは、Cryptographpというプラグイン。ダウンロードしたものを、pluginディレクトリに格納し、管理画面からアクティブにする。その後、Captcha画像を表示させたい場所に、<? php display_cryptographp(); ?>と記載するだけ。導入は非常に簡単だったよ。
ただ、このプラグインには問題があるんだ。そう、セキュリティ上の問題点(脆弱性)を持っているんだよ。
Cryptographp <= 1.2 WordPress plugin multiple persistant crossite
scriptingsOriginal article: http://websecurity.com.ua/1596/
Original articleを読むと、Captchaを生成するロジックそのものではなく、管理画面内の設定を行う画面に脆弱性が存在するのがわかるよ。
どうやら、攻撃者が用意したページ※1にこのプラグインの利用者をアクセスさせると、管理画面でXSSが発生するみたい※2。確認してみたら、確かにタグ文字がエスケープされてなかったよ。
もしもこの脆弱性を悪用されると、攻撃者にCookieを盗まれて、管理画面へのログインされる危険性があるよ。
本来なら脆弱性の無いバージョンを使うのが一番なんだけど、このプラグインは1.2が最新バージョンでまだ脆弱性を抱えたままなんだよ。だから、自分で直してみる事にしたよ。
修正したのは、admin.php。問題となっているパラメータ※3を出力している箇所※4で、格納している値をそのままechoで出力するのではなく、htmlspecialchars()でエスケープしてやれば良いよ。
具体的なコードは
<input name="cryptwidth" type="text" id="cryptwidth" value="<?php echo htmlspecialchars($cryptwidth, ENT_QUOTES); ?>" size="2" />
ファイルにタグ文字が記録されるのは仕方ないとして、とりあえずは、これでXSS対策は出来たんじゃないかと思う。もしも対策が足りない場合は、こっそり教えてくれるとうれしいよ。
- アクセスすると、問題のあるパラメータに自動的に値をPOSTする様な処理を行わせるページ[↩]
- よく見ると、XSSだけではなく、CSRF脆弱性があるとも言えるね[↩]
- cryptwidth, cryptheight, bgimg, charR, charG, charB, charclear, tfont, charel, charelc, charelv, charnbmin, charnbmax, charspace, charsizemin, charsizemax, charanglemax, noisepxmin, noisepxmax, noiselinemin, noiselinemax, nbcirclemin, nbcirclemax, brushsize[↩]
- 具体的には、24行,25行,32行,33行,34行,41行,55行,56行,57行,76行,83行,89行,95行,101行,108行,109行,116行,123行,124行,131行,138行,139行,146行,147行,154行,155行,172行に存在する[↩]



最近のコメント