My Photo

« December 2013 | Main | February 2014 »

January 23, 2014

メールヘッダ・インジェクション脆弱性

発生箇所 メール送信機能のあるページ
影響を受けるページ 直接影響を受けるページはない。メールを送られたユーザが被害を受ける。
影響の種類 迷惑メールの送信、メールの宛先や件名・本文の改ざん、ウイルス添付メールの送信
利用者の関与の度合い 不要

概要

メールヘッダ・インジェクションは宛先(To)や件名(Subject)などのメールヘッダを外部から指定する際に、改行文字を使ってメールヘッダや本文を追加・変更する手法である。
影響は以下。

  • 件名や送信元、本文が改変される。
  • 迷惑メールの送信に悪用される。
  • ウイルスメールの送信に悪用される。

攻撃手法

以下のようなメール送信フォームを考える。

<form action="mail.php" method="POST">
メール:<input type="text" name="from"><br>
本文:<textarea name="body"></textarea>
<input type="submit" value="送信">
</form>

フォームからのリクエストを受けてメールを送信するスクリプトは以下になる。

$from = $_POST['from'];
$body = $_POST['body'];
mb_language('Japanese');
mb_send_mail(
  "aaa@example.jp", "問い合わせがありました。",
  "以下の問い合わせがありましたので対応をお願いします\n\n" . $body,
  "From: " . $from);

上記スクリプトで使用している mb_send_mail() の第4引数は追加のメールヘッダで、これを利用してFromアドレスを設定している。
この引数は改行で区切ることで複数のヘッダを指定可能である。しかし、上記のスクリプトでそのことを考慮されておらず、メールヘッダインジェクション脆弱性がある。

最初に示したメール送信フォームでFromアドレス用のinputタグをtextareaタグに変えたフォームを考える。
このフォームで先のスクリプトのメールヘッダ・インジェクション脆弱性を利用して宛先を追加することができる。Fromアドレスのtextareaに

aaa@example.jp
Bcc: bbb@example.jp

と入力すると、スクリプトで指定した宛先の他にBccヘッダが追加され、Bccヘッダで指定したメールアドレスにもメールが送信される。
他に添付ファイルを追加したり、ヘッダの下に空行を1行入れてさらに入力すれば本文を改ざんすることも可能である。

脆弱性の原因

メールのメッセージヘッダは各フィールドが改行で区切られている。
アプリケーションが外部から指定するパラメータの改行をチェックしていない場合、ヘッダや本文を追加・変更できることになる。これがメールヘッダ・インジェクション脆弱性の原因である。

対策

以下の対策が推奨される。

  • メール送信に専用のライブラリを使用する

メール送信に専用ライブラリを使用せずにsendmailコマンドを使用すると、アプリケーションがメールのメッセージ組み立ての責任を持たなければならず、メールヘッダ・インジェクション脆弱性が入り込みやすい。また、OSコマンド・インジェクション脆弱性が混入する可能性がある。
また、メールヘッダ・インジェクション脆弱性は本来はメール送信ライブラリで対策されるべきものである。
しかし、多くのメール送信ライブラリにメールヘッダ・インジェクション脆弱性が見つかっているため、さらに以下のいずれかの実施が推奨される。

  • 外部からのパラメータをメールヘッダに含ませないようにする。
  • 外部からのパラメータには改行を含まないようにチェックする。

mb_send_mail()のようなメール送信ライブラリの関数のラッパー関数を作成し、ラッパー関数側で改行文字をチェックするとよい。

また、予防的対策としてメールアドレスと件名のチェックがある。メールアドレス・件名には本来、改行は含まれないので、入力値の妥当性検証でチェックされるべきものである。よって、適切に入力値の検証がなされれば予防的な対策となる。
RFC5322で定められたメールアドレスの規定はかなり複雑なので、WEBアプリケーションの要件としてメールアドレスの仕様を定め、その要件にマッチしているか入力値を検証すればよい。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.9.2 メールヘッダ・インジェクション脆弱性

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

January 18, 2014

2014冬アニメ第1話感想

視聴予定だった
となりの関くん
生徒会役員共*
鬼灯の冷徹
世界征服~謀略のズヴィズダー
に加えて3作品を見た。

となりの関くん
10分のショートアニメなのね。続けて見たいと思わなかったので第1話で視聴終了。

生徒会役員共*
1期と変わらず、バカ、シモのオンパレード。期待通り。
シノのライバルキャラが出てきてラブコメ要素が少し強くなるのかな。
視聴継続。

鬼灯の冷徹
第1話は「世界ふしぎ発見」のパロディが山盛り。
特にED歌(第1話のみで第2話から上坂すみれの歌)が最高にバカで良かった(笑)
第2話も別作品のパロディは面白いのだが、この作品のオリジナルなネタはイマイチ。
事前に聞いていた「腐向け、「聖お兄さん」が面白いと思う人は面白い」というのはその通りだった。
第2話で視聴終了。

世界征服~謀略のズヴィズダー
まだなんとも言えない。全然話の全容がわからない。
岡村監督の傾向からして、最後までこんな感じで「んー、よくわからなかった」で終わりそうな気がする^^;
とりあえず視聴継続。

攻殻機動隊入門あらいず
「攻殻機動隊ARISE」の宣伝用ショートアニメ。
宣伝用なので面白いも何もないが、ARISEはいずれ見たいと思っているので事前知識を入れるという意味で見ている。

ウィッチクラフトワークス
ヒロインがいい。あとコミカルなエンディングは好き。
水島努はなんとも言えない監督だ。「よんでますよ、アザゼルさん」はなかなか面白かったが、「BLOOD C」は最悪だった。原作がある作品ならいいものつくるけど、オリジナル作品は暴走して失敗しているという感じだろうか。
視聴継続。

ニセコイ
新房監督というので絶望先生やまりあほりっく的なのを想像していたのだが、全然違った。普通のラブコメ。
そもそも「新房監督」ではなく「新房総監督」。監督は龍輪さん。
思てたのと違うー、ので視聴終了。


この結果、視聴するアニメは秋から続いている「ログ・ホライズン」、「キルラキル」と冬アニメの「生徒会役員共*」、「世界征服~謀略のズヴィズダー」、「攻殻機動隊入門あらいず」、「ウィッチクラフトワークス」。
「あらいず」はショートアニメなので、実質4作品に落ち着いた。
アニメではないが「軍師官兵衛」を見ているので、4作品くらいが負担なく見れるちょうどいい数だと思う。

January 16, 2014

「鹿男あをによし」読了

年末年始の休みに読もうと思って買ったが読んでなくて、今週読んだ。
話の本筋じゃないところでいろいろ突っ込みたいところがあったが、本筋は非常に面白かった。
そしてかりんとうを食いたくなったww
ドラマ化されたが、わかる。映画がドラマにしたくなる。エンターテインメントとして一級品だ。
「鴨川ホルモー」、「プリンセストヨトミ」は映画化され、「偉大なる、しゅららぼん」も今年公開。
万城目学、すごい作家だ。
ちなみに読み終わるまで「まんじょうめまなぶ」だと思ってた^^;

鹿男あをによし (幻冬舎文庫)鹿男あをによし (幻冬舎文庫)
万城目 学

幻冬舎 2010-04
売り上げランキング : 5559

Amazonで詳しく見る
by G-Tools

January 13, 2014

WordPressから呼ばれているかどうかを判定する

前の記事はこの記事の処理を実装しているときに躓いたことから書いので。

ある関数がWordPressから呼ばれる場合だけ特別な処理を追加しなければならなくなった。WordPressはまったくわからんのに^^;
で、考えたのがWordPressで定義される定数やグローバル変数が存在するかどうかを調べるという方法。
以下のようなコードでWordPressから呼ばれた場合だけ実行される処理を加えることができた。
適切な方法かどうかはわからない。というかやっつけ対応。

定数で判定:
if (defined('WP_DEBUG')) {
	// WordPressから呼ばれた場合だけ実行する処理
}
グローバル変数で判定:
global $wp_version;
if ($wp_version) {
	// WordPressから呼ばれた場合だけ実行する処理
}

参考サイト:
PHPXref 0.7: WordPress
Global Variables << WordPress Codex

PHPメモ035:defined()の引数は文字列

定数が定義済みかどうか調べる defined() で少しハマったのでメモ。
例えば、HOGE という定数があるかどうか調べるコードを以下のように書いた。

if (defined(HOGE)) {
	print 'HOGE あります';
}

これを実行すると、HOGE が定義されていてもいなくても defined() がFALSEを返す。
しばらく悩んだが、リファレンスで defined() をみたら、こう書いてあった。

bool defined (string $name)

defined() の引数は文字列型だった。
上のコードだとHOGEは未定義の定数として空文字列とみなされたのか?
下記のようにHOGEをシングルクウォートで囲ったら想定どおり動いた。

if (defined('HOGE')) {
	print 'HOGE あります';
}

January 12, 2014

「軍師官兵衛」第1話感想

見終わって、嫌な予感しかしなかった。

小田原城攻め、官兵衛が馬に乗って登場。は?官兵衛は足を悪くしてからは馬に乗れず輿に乗っていたはずでは?
さらに小田原城の城門前、バンバン発砲され弓を射られるが顔をかすめるだけ。ファンタジーですか?

大河ドラマにフィクションを全く入れるなとは言わない。
けれど、フィクションを入れるにしても史実と矛盾しない範囲内にして欲しい。

見終わった後、他の人の感想も見たが概ね同意。
なぜ主人公の少年時代から始めるのか。成人してからでいいだろう。
なぜ信長と秀吉の出会いのシーンをやるのか。もう信長、秀吉を主人公にした過去の大河ドラマでさんざんやったのに、またやる意味があるの?桶狭間も同様。
ナレーションについては特に聞きづらいとは思わなかったが、戦国時代の話には合っていないというのは確か。

やはり、すごく嫌な予感がする。
「天地人」は七尾城攻めで現実にはありえないシーンがあって、そこで見るのをやめた。
「軍師官兵衛」はいつまで見続けられるだろうか。

ゼロ・グラビティ

昨年末、映画「ゼロ・グラビティ」を3D上映で見てきた。

初めての3D映画鑑賞。懸念していた3D酔いはしなかったが、立体視に感動もしなかった。
3Dであることによって+400円(3Dメガネ持参なら+300円)は正直高い。
この映画自体は悪くなかった。1800円で見ていたら「普通に面白かった」という評価になると思うのだが、2200円で見ると「ちょっと高い」という評価になる。

自分はもしかしたら遠近感とか立体視の能力に問題があるかもしれない。
一時期流行った「3Dステレオグラム」は全く立体視できなかった。
大昔、ディズニーランドで「キャプテンEO」を見た時も周りの客はキャーキャー言ったり仰け反ったりして大興奮していたが、自分は「そんな興奮するほどすごいかなあ」とぼんやり見ていた。

3Dを別として、映像は良かった。無重力なISSのシーンはどうやって撮影したんだろうと思った。ブルースクリーンの前で役者がワイヤーで吊るされたまま演技して、それにCGを合成したんだろうか?

今後、映画が2Dと3Dの両方で上映していたら、2Dで見る。

以下、ネタバレを含む内容。
ちょっと嫌だった点が1つ。
映画の中で事故の大元の原因である衛星の破壊。ロシアがやったということだが、現実世界で最近こういうことをやったのは中国。
#ずいぶん前ならロシアやアメリカもやってるかもしれないけど。
ハリウッドにとってロシア市場より中国市場の方が重要だから、中国を悪者にしたくないんだろう。理由はわかるが、なんか嫌な感じだ。

January 06, 2014

2013秋アニメ感想

自分が視聴して昨年末に終わったアニメの感想。
面白かったのは「のんのんびより」と「物語シリーズセカンドシーズン」。
あとは見なきゃ良かった^^;


のんのんびより
実際田舎で生まれ育った自分からすれば「ファンタジーだな」と思った。それでも面白かった。というか癒された。
夏休みにれんげが東京から親戚の家に遊びに来た少女と友達になる話と、れんげと駄菓子屋の話とかは本当に良かった。泣いたり、ほっこりしたりした。
とにかくれんげです。ああ、あと越谷兄がポイントポイントでいい味出しているww
WEBラジオを何回か聞いてみた。村川梨衣が薬をキメてるか病気じゃね?と思うほどテンション高い。キャラ作ってるとしてもキツイww

物語シリーズセカンドシーズン
原作が面白く、それを監督が上手にアニメしている。安心して見れる。
しかしコマ送りして見るところが多いので、30分アニメなのに実際見ると絶対に30分以上かかる^^;
原作の最終章で「まさかの中巻発売」とか言ってるが、ちゃんと終われるのだろか?話をたためなくなって苦し紛れで引き伸ばしてるだけだったり。

境界の彼方
3話か4話あたりで視聴中止。
ヒロインが好きになれなかった。というか、嫌悪感を抱いた。主人公のことを「半妖だから」と容赦なく刺し殺そうとするくせに、普通の妖夢相手では止めをさすのをためらったり、かわいいと思えるところや理解できるところが1つもない。
作画は京アニ品質で素晴らしかったが、ヒロインが合わないしストーリーも面白いと思えなくって見続けることができなかった。
京アニとしては自分たちで権利関係を幅広く押さえたいという理由で自社のライトノベルレーベルの作品を原作にしてるんだろうけど、にしてももうちょっとマシな原作はなかったんだろうか。

革命機ヴァルヴレイヴ
1期はひどかった。
2期は全く期待してなかったが前半は意外と面白かった。が、サキが捕まってマギウスだって世界にばらされたところから1期と同じバカアニメに戻ってしまった。
そこからは一応見ていたが早送りで済ませた。
「カインを倒した後に世界が混乱し、その後に第三銀河帝国が誕生した」とかってのも、SFっぽい感じを出そうしているだけで、きちんとした設定なんてないんだろうなあ。

コッペリオン
原子力、バイオテクノロジーを考証したSF+アクションだと思ってた自分がバカだった。
「デンキウナギの遺伝子を持った発電人間。だけど水のそばでは感電するか電撃使えません。」というのが出てきたところ見る気が失せた。それ以降は早送り視聴。
原作はただの能力バトル物になってるらしい。それならわかる。自分は読みたいと思わないが。


続いている作品は「ログ・ホライズン」と「キルラキル」。「キルラキル」は1クールかと思ってた。
どちらも今のところ楽しく見ている。

January 05, 2014

confirm()をjquery.alerts.jsで代替する

WEBアプリケーションで確認ダイアログにはJavaScriptの window.confirm() を使うが、表示されるダイアログのデザインやボタンの文言を変更などいったカスタマイズはできない。
そこで jquery.alerts.js の jConfirm() で代替する。

jquery.alerts.js は公式ページがすでになくなっていてるので開発は停止しているようだ。しかし、404ページの下にarchivesというリンクがあって、その先のページでダウンロードできる。
注意点は以下。
・要jQuery UI。
・新しいjQuery(1.9.0以降?)では動かない。廃止されたメソッドを使用しているのが原因のようだ。

<link rel="stylesheet" href="css/jquery_ui/jquery-ui.css" type="text/css" />
<link rel="stylesheet" href="css/jquery_ui/jquery.alerts.css" type="text/css" />
<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="js/jquery_ui/jquery-ui.custom.js"></script>
<script type="text/javascript" src="js/jquery.alerts.js"></script>
<script type="text/javascript">
function customConfirm(param) {
	jConfirm('Can you confirm this?', 'タイトル', function(r) {
		console.log("param=[" + param + "],r=[" + (r == true ? "true" : "false") + "]");
	});
}
</script>
</head>
<body>
<form name="form" action="/test.php" method="post">
<input type="button" value="確認1" onclick="customConfirm('abc');" /><br />
</form>

ダイアログのデザインは jquery.alerts.css を編集してカスタマイズできる。
ただし、ボタンの「OK」、「Cancel」の文言は jquery.alerts.js に書いてあるのでそれを編集する。
以下、jquery.alerts.css の一部を抜き出してシンプルにしたサンプル。

<link rel="stylesheet" href="css/jquery_ui/jquery-ui.css" type="text/css" />
<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="js/jquery_ui/jquery-ui.custom.js"></script>
<script type="text/javascript" src="js/jquery_ui/jquery.ui.draggable.js"></script>
<script type="text/javascript" src="js/jquery.alerts.js"></script>
<script type="text/javascript">
function customConfirm(param) {
	jConfirm('Can you confirm this?', 'タイトル', function(r) {
		console.log("param=[" + param + "],r=[" + (r == true ? "true" : "false") + "]");
	});
}
</script>
<style type="text/css">
#popup_container {
    min-width:300px; /* Dialog will be no smaller than this */
    max-width:600px; /* Dialog will wrap after this width */
    border:solid 5px #999;
    background:#fff;
    color:#000;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radius:5px;
}
#popup_title {
    margin:0; padding:0;
    border:solid 1px #fff;
    border-bottom:solid 1px #999;
    background:#ccc;
    color:#666;
    font-size:14px;
    font-weight:bold;
    text-align:center;
    line-height:1.75em;
    cursor:default;
}
#popup_content {
	margin:0; padding:1em 1.75em;
/*	background:transparent url("img/icon/color/information.png") no-repeat 16px 16px;	*/
}
#popup_message { padding-left:20px; }
#popup_panel { text-align:center; margin:1em 0 0 1em; }
</style>
</head>
<body>
<form name="form" action="/test.php" method="post">
<input type="button" value="確認1" onclick="customConfirm('abc');" /><br />
</form>

jQueryUIについての参考サイト:
jQuery UI
jQuery UI 導入方法

参考サイト:
ウィンドウ、モーダル|jQuery plugin|Ajax|PHP & JavaScript Room
非常にきれいなアラートを表示する「jQuery Alert Dialogs」-JavaScript Library Archive
">

« December 2013 | Main | February 2014 »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof