GUiLZ Project Personal & Experimental Blog

Monthly Archives: 2月 2011

■ [ネット] BaserCMS colorbox が動かなかった問題に対処してみた

今回も BaserCMS ネタ。ほぼ全ての修正作業も終わったので、テストしてみようといろいろ更新したりしていたら、colorbox がうまく動かないことが判明。悩んだ結果、動作するようになったのでメモ。

 

■ 問題など

環境によるのかもしれないけど、BaserCMS 1.6.9.1 にて、Baser標準タグを入れているにもかかわらず、画像のポップアップが行われなかった。

 

■ 解決策

colorbox のサンプルを見れば一目瞭然だったが、以下のようなコードをレイアウトファイルに追加することで解決。


 

単純にBaser標準タグで jquery.colorbox-min.js だけを呼んでも、そりゃ動くわけないよね。他のライブラリも同じようなものなんだし。つい、BaserCMS の FAQ を見て、それだけで大丈夫だと勘違いしちゃったんだ・・・。

ということで、問題に対処と言うよりは、単なる自分の無知ぶりを晒しただけだったとさ。まあいいか、このブログの名前は「恥=下記」なんだし。

 

■ [ネット] PivotX ハッキングによる改ざん点まとめ

現在も事態は進行中のため詳細には触れられないが、取り急ぎサイトの全データを取得できたため、簡単に解析した結果について書いておく。同様の被害に遭われた方の復旧の参考になれば。(ただし、全ての改ざんされたサイトで同様の手口だったかどうかは定かでありません。下記ハッキングチームであれば似たような手法を採るものと思われますが、あくまで参考にとどめ、必ず詳細な解析を行ってください)

 

■ 改ざんしたハッキングチーム

画像ならびにタイトル等に、Hacked By BoZKuRT という名称が見られ、かつ画像にはトルコ国旗があることから、トルコのハッキングチームによる可能性が高い。また、ログ解析結果を聞いたところによると、改ざんされたと思われる日時にトルコから複数のアクセスがあったとのこと。

 

■ 改ざん点

以下全て、PivotX の管理画面より

・サイト管理?設定

サイト名

サイトホームページ

サイト名が Hacked By BoZKuRT に変更されていた。サイトホームページは、次に記載する改変されたページがテンプレートとして指定され、表示されるようになっていた。(トップページとして表示されるようになっていた)

・エントリとページ 画面の、先頭カテゴリのインデックスページ

該当ページのテンプレートが

pivotx/templates/index.html

(不正にアップロードされたファイル)

を呼ぶように改変されていた。

ページ内容自体に変更はなかったが、タイトルが Hacked By BoZKuRT に変更されていた。

pivotx/templates/index.html は以下の通り

[html]
<HTML><HEAD><TITLE>||| Hacked By BoZKuRT|||</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-9">
<META content="MSHTML 6.00.6001.18294" name=GENERATOR></HEAD>
<BODY bgColor=#000000 onload=teclear();>
<embed src="http://www.fileden.com/files/2011/1/28/3068886/023_Hucum_Marsi.mp3" height="0"
type="audio/x-ms-wma"> </embed>
<center>

<img border="0" src="http://img.webme.com/pic/b/byarsslan/hackked.jpg" >

</center>
</body>
</html>
[/html]

!注意!

上記リンク先のファイルに、何らかのマルウェアがないとも限りません! アクセスする際には細心の注意を払ってください!!

 

以上の改変により、トップページにアクセスすると、上記 index.html の内容が表示されるようになっていた。

また、このほかに不正なファイル等が混入していないか確認してみたが、現時点では確認できていない。

 

■ 今回突かれた脆弱性

海外では 2011/02/18、日本では 2011/02/21 に公表された、パスワードに関する脆弱性の可能性が高い。

http://jvn.jp/cert/JVNVU175068/

理由として、スーパーユーザーと推測されるIDのパスワードが変更され、ログインできなくなっていた。かつ、推測されにくいスーパーユーザーのIDは問題なくログインできたことから、この脆弱性が最有力と思われる。

! この他にもXSSなどいくつかの脆弱性が存在しますので、PivotXユーザーの方は、至急 2.2.5 へのアップデートを検討してください !

 

■ 復旧方法などのリソース

・ PivotX 開発者による復旧手順等

http://forum.pivotx.net/viewtopic.php?f=2&t=1967

・ 改ざんの被害を受けたユーザーによる情報

http://forum.pivotx.net/viewtopic.php?f=2&t=1958

http://forum.pivotx.net/viewtopic.php?f=2&t=1949

・ パスワードリセットの方法

http://ufuso.dip.jp/faq/?paged=7

■ このような攻撃への対応策

今回の攻撃は脆弱性の公表前に攻撃が行われる、いわゆるゼロデイ攻撃であり、セキュリティ情報に網を張っていても防ぐことは簡単ではないと考えられる。

しかしながら、それでも常に迅速なCMSのバージョンアップを行っていれば防ぐことができた可能性もあり(とはいえ、脆弱性対応がされた PivotX 2.2.4 公開後、攻撃を受けるまでの猶予は1週間もなく、かつ 2.2.4 公開のリリースは公式サイトで流されさえしなかったのだが)、迅速なパッチ当てが重要という、セキュリティの常道を守る大切さを身にしみて学習できた。

よく使われるIDの使用も考え直した方がいい。確かに役割が分かりやすいが、ブルートフォースアタック対策にもなるため、スーパーユーザーに類するアカウント名は推測されづらいものに変えようと思う。

そして、CMSの開発チームや開発元に対する精査も今後はより重要となっていくだろう。今回のように重要な脆弱性対応であるにも関わらず、リリース情報すら流していない PivotX 開発チームは、個人的には信頼できない(開発チームは、今回の件を大事にしたくなかったという声もある)。そのようにリスキーと考えられるCMSは、いかに魅力的であろうとも利用する前によくよくの検討が必要だろう。

またWAFの導入など、今回のような脆弱性には対応できないとしても、事前にできる限り大きく網をかけておく事も大切だ。今回はサーバー側の事情でそれが許されなかったが、今後のサーバー契約の際にはWAFを重要な設備として検討したい。

 

■ 最後に

下記サイトによると、未だトルコより日本を狙った攻撃が観測されているとのこと。

http://blog.abacustech.co.jp/blogx/entry/70

トルコは親日国だと思っていたが、私自身考えが変わった。トルコに限らず、親日・反日などと国単位で考えても意味がない(まあ当然の話だが)。自分以外の全ては敵なのだというくらいでなければ、自分自身のサイトは守れない。

とりあえず自分が運営しているサイトは、中国・韓国・台湾に加えて、トルコのIPアドレス帯もiptablesで全拒否にしておきます。

そして、今年のクリスマスは七面鳥を食べまくるよ! ターキー死ぬほど食うよ!!

 

■ [ネット] BaserCMS についての小ネタ

激しく間が空いたけれども、今回はBaserCMSネタを。Twitterでも書いたけれど、PivotXで作ってたサイトがハクられてしまったので、もうPivotXは使いたくない、というクライアントや私の個人的心情を踏まえ、BaserCMSに乗り換えるための作業を行っていた。

デザインや機能自体は、PivotXで実現していたものとほぼ同じものが2日(実質1日半くらい) でできたのだけど、若干デフォルトのテンプレートやコードを使うだけではうまくいかなかった点を備忘録としてメモしておく。

 

■ カテゴリーごとにバナー画像を自動で貼りたい

単純に、各カテゴリーごとに表示させるバナー画像を変えるためのテクニック。たかだかそれだけのためにレイアウトファイルを複数作るのも無駄だし、現在のBaserCMSでページごとに特定のレイアウトを適用する為には、ソース表示をして

layout = 'layout_file' ?>

のようにコードを埋め込む必要があるため、詳しい人ならまだしも、あまり詳しくない人がこの作業を新規ページ作成の度に行うのも難しいだろうということで、以下のようなコードをlayouts/default.ctpに書いた。

ページカテゴリ名をcategory、ページカテゴリタイトルをカテゴリーとした場合。

getContentsName().'.jpg'; $category = $page->getCategory(); $catname = $category['title'].'バナー'; echo $html->image("$bannerimg", array('alt'=> "$catname", 'width'=> "700", 'height'=> "150")); ?>

書き出されるコードはこんな感じ。

カテゴリーバナー

注意点としては、ページカテゴリ名が英文字の場合、先頭文字が大文字になるため、imgにアップする画像名も先頭文字を大文字にしなければいけない事くらいかな。画像以外にも、カテゴリをトリガーとして、何か変化を付けたい場合には応用できるかも。

 

■ カテゴリごとのローカルナビゲーションにアクティブ表示をしたい

自分がいるページを示すために、ローカルナビゲーションにid等を割り振ってCSSで表示を変えるというのはよく行われているけど、デフォルトのローカルナビゲーション用コードでは、アクティブ表示ができないようだったので、coreから以下のファイルを持ってきて書き換えてみた。

・ elements/submenus/local_navi.ctp を、自分のテーマのelementsにコピーして編集

getCategory();
?>

element('page_list',array('categoryId'=>$pageCategory['id'])) ?>

単純に<h2>が要らなかったので消しただけ。コメント部分は省略。

・elements/page_list.ctp を、自分のテーマのelementsにコピーして編集

getPageList($categoryId);
?>
    getContentsTitle(); if(!empty($pages)){ foreach($pages as $key => $page){ $no = sprintf('%02d',$key+1); if($curcheck == $page['title']){ $class = ' class="current"'; }else{ $class = ' class="page'.$no.'"'; } if($this->base == '/index.php' && $page['url'] == '/'){ echo ''.str_replace('/index.php','',$baser->getLink($page['title'],$page['url'])).''; }else{ echo ''.$baser->getLink($page['title'],$page['url']).''; } } } ?>

このコードで、ページのタイトルが一致したら、該当の<li>にclass=”current”が付き、それ以外にはpageXX(XXは連番) がクラスとして割り当てられる。idでもいいんだけど、元々がクラスだったので合わせてみた。(本当は番号のクラスも要らないけど、何かに使うかもということで、その部分のコードは元のまま残してある。要らなければelse以下を削れば桶)

レイアウトファイルからの呼び出しは、以下のようにする。

element('local_navi') ?>

書き出されるコードは、こんな感じ


これでカテゴリさえきちんと作っていれば、アクティブ表示も可能となる。

以上の事以外は、特に難しいことをしなくてもパンくずリストも出せるし、かなりテーマのカスタマイズはやりやすかった。ただ、惜しむらくはIEで重いことかな・・・。何故か今回作った、カテゴリごとに画像を読ませるところで、画像表示が遅い。テーマの作りやすさや柔軟さ、各種機能と使い勝手は素晴らしいので、今後の改善に期待しています。

■ 2011/02/28 追記(IE6への対応)

CSSの書き方にもよるのだろうけど、IE6ではクラスではなくIDでアクティブとなる要素を指定しないとうまく動作しなかった。よって、elements/page_list.ctp を以下のように再度編集した。

・elements/page_list.ctp

getPageList($categoryId);
?>
    getContentsTitle(); if(!empty($pages)){ foreach($pages as $key => $page){ $no = sprintf('%02d',$key+1); if($curcheck == $page['title']){ $class = ' id="current"'; }else{ $class = ''; } if($this->base == '/index.php' && $page['url'] == '/'){ echo ''.str_replace('/index.php','',$baser->getLink($page['title'],$page['url'])).''; }else{ echo ''.$baser->getLink($page['title'],$page['url']).''; } } } ?>

先のコードではアクティブ要素以外に出力されていた連番要素も排除した。このコードでは以下のように出力される。


IE6以外のブラウザ(IE7、IE8、Chrome、Firefox、Opera、Safari) では、IDでなくクラスで正常動作した。

今時IE6への対応なんて必須じゃなくなりつつあるけど、それでも対応せざるを得ない場合があるので追記。ほんと、もう、やりたくないんだけどね・・・。

スポンサードリンク

Twitter
利用中のサービス

GUiLZ Project では、以下のサービスを利用しています。


関連サイト
巡回先サイト様
アーカイブ