XSSタグの投稿

2009-02-26
くもり

つくば観光協会に電話した

ゆりこ による 10:23:36 の投稿
カテゴリー: ソフトウェア,社会問題
タグ: , ,

つくば方面で素の Mobile Eye+ を使っているサイトがある」という報告を発見したのですが、執筆者は「サイト運営者に連絡していない」ようでした。「それはあかんやろ」と思ったので、つくば観光協会にサイトについて電話で質問してみました。すると、以下のような回答でした。

  • ウェブサイトの更新は、観光協会の職員さんが行なわれている。
  • サイトの構築は業者に発注。
  • 携帯対応は、業者からの提案で、設置作業も業者が実施。
  • 発注先の業者がどこかは教えられない。

その後、Mobile Eye+ の脆弱性についてしゃべってサイトが危険なことを伝え、口頭では分かりにくいため、回避策・対応策についてはメールいたしました。ウェブサイト担当者の方には真摯に受け止めて頂けました。ありがとうございます。

つくば方面というと、わたしが以前叩いた「ある業者」がありますが、わたしの指摘以降、ちょっとはマシになったかと思っていました。もし、梅まつりウェブサイトの構築が「そこ」ならば、やっぱしまだスキルが低いままなのかなーということですね……。そういう業者は、市や観光協会が「指名停止処分」にするべきでしょう ;-) 土木や建築だったら、欠陥工事レベルですから、指名停止になってておかしくないわけで、IT 関連でも同じ措置があってもよいかと。

[追記 18:35] 昼すぎに観光協会から連絡があり、業者に対応を取って頂いたそうです。こちらでも、脆弱性が回避できていることを確認できました。さすがに「直接電話する」のは効果がありますね。もちろん、観光協会および業者さんの対応が早かったことは特筆すべきことだと思います。(業者さんは) 知識や情報収集能力が足りないっぽいですが、それを行動力でカバーといったところでしょうか ;-)

2009-02-14
晴れ

HTML エスケープなしの出力は怖い

ゆりこ による 01:13:47 の投稿
カテゴリー: WordPressハック
タグ: ,

Ktai Style 1.61-rc1に同梱した Photolog テーマは、WordPress のメディアライブラリに登録された画像を探して、投稿一覧に貼り付けるという動作をしています。こういう動作は最近人気があるようで(?)、ひろまささんが wp-kougabu に機能追加したりしています。さきほど見つけたのは「WordPressの最新の記事から画像を一覧表示する」というコードでした。

<?php  
query_posts('showposts=10');  
if ( have_posts() ) : while ( have_posts() ) : the_post();  
$files = get_children("post_parent=$id&post_type=attachment&post_mime_type=image");  
if (!emptyempty($files)){  
$keys = array_keys($files);  
$num=$keys[0];  
$thumb=wp_get_attachment_thumb_url($num);  
print "<a href=\"".get_permalink()."\" title=\"$post->post_title\">
<img src=\"$thumb\" width=\"80\" height=\"80\" alt=\"$post->post_title\" /></a>\n";  
}  
endwhile;else:  
endif;?>

しかし、このコードを見てびっくりしました。一切 HTML エスケープがされていないからです!! まあ、表示するのは「サイト運営者が入力した情報」である、投稿のパーマリンクとタイトル、画像の URL だけなので、XSS 脆弱性とは言いにくいですが……。ただし、投稿タイトルとして「大阪 -> 京都のきっぷ」というのがあれば、HTML のパースエラーが発生してしまいます。

さて、先方に連絡しようにも、当該の投稿にはコメントフォームがありません。ウェブサイトを見てもコンタクトフォームも連絡先も見つかりません。最後の手段としてピンバックが動作することを期待して、このエントリーを書いたわけです ;-)

素人ならともかく、WordPress のカスタマイズを業務として行なっている方が、こういうコーディングをしてしまうのは不安になってしまいます。HTML エスケープなんて基礎の基礎ですよ!!

さて、改善方法ですが、URL を出すところに WordPress のエスケープ関数である attribute_escape(), clean_url() を使うのがよいですね。post_title を出しているところは、API 関数の the_title_attribute() を使った方がよいでしょう (ただし、事前に global $post; しておくことが必要)。HTML を組み立てるクォート文字列もシングルクォートにしておけば、HTML 内で使うダブルクォートをバックスラッシュでエスケープしなくて済むので見通しがよくなりますね。

print '<a href="' . clean_url(get_permalink()) . '" title="' . 
the_title_attribute('echo=0') . '"><img src="' . clean_url($thumb) . 
'" width="80" height="80" alt="' . the_title_attribute('echo=0') . '" /></a>' . "\n";

WordPress のテクニックをいろいろ公開されるのは素晴しいことですが、こういうセキュリティーの甘いコードを公開するのは困りますね〜〜。せめてツッコミを入れられるようにコメントフォームを開けておいてもらえると助かります。