ikepyonのお気楽な日々〜技術ネタ風味〜 このページをアンテナに追加 RSSフィード

気になった日々のニュースとメモのためのリンクと戯言のページ

To Do(というかやりたいこと。何時終わることやら)
-ITIL導入のための成熟度チェックシートみたいなの(あると便利だよね?)
-Hacknotes Web Security Portable Reference和訳(出版社募集中)
-Webアプリケーションセキュリティ検査ツールの改良(一応完成)
-Hacker HighSchoolの資料の日本語訳
-OSSTMMの日本語訳
-「燃えるセキュアプログラミング」若しくは「サルでも分かるセキュアプログラミング」とか書いてみたいなぁみたいな。

これだけはチェックしときなはれ!!受入れテスト用セキュリティチェックリスト公開中
Webアプリケーションセキュリティはてなぐるーぷ(テスト中やで)
SQL Injectionの仕組みと対策公開中
RSS feed meter for http://d.hatena.ne.jp/ikepyon/
Secure Coding に入ろう!! [MLの詳細]
メールアドレス
SKUF Meeting なかのひと

2010-04-21 あつい、ねむい

2010-03-25 わふぷらす

2010-03-16 あつ〜

[]サニタイズ脳? サニタイズ脳? - ikepyonのお気楽な日々〜技術ネタ風味〜 を含むブックマーク サニタイズ脳? - ikepyonのお気楽な日々〜技術ネタ風味〜 のブックマークコメント

某所にて以下のようなコードを見つけてしまった。

<?php

$name = htmlspecialchars($_post["name"], ent_quotes);
$mail = htmlspecialchars($_post["mail"], ent_quotes);
$mail = mb_convert_kana($mail, "a");
$sub = htmlspecialchars($_post["sub"], ent_quotes);
$freeans = htmlspecialchars($_post["freeans"], ent_quotes);
$check = htmlspecialchars($_post["check"], ent_quotes);

if(!(($check == "1") || ($check == "0"))){
$error = "変数checkが予測されている値ではありません。";
}

//入力チェック
if(strlen($name) == "0"){
$error = "氏名を入力してください。";
}if(strlen($mail) == "0"){
$error = "メールアドレスを入力してください。";
}if(preg_match("/^[^@]+@([-a-z0-9]+\.)+[a-z]{2,}$/",$mail)){
$error = "メールアドレスの形式が正しくありません。";
}if($check == "0"){
$error = "個人情報の取り扱いについてに同意してください。";
}
if(count($error)){
exit;
}

//入力情報をメールで送信
if (mb_send_mail("hoge@example.com", $sub, $final, $from)){
}else{
$error = "ご記入頂いた情報の転送に失敗しました。";
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<body>
<form method="post" action="<?=$_server["php_self"]?>">
<p>氏名:</p>
<input class="form" type="text" name="name" value="<?=$name?>" />
<p>返信用メールアドレス:</p>
<input class="form" type="text" name="mail" value="<?=$mail?>" />
<p>件名:</p>
<input class="form" type="text" name="sub" value="<?=$sub?>" />
<p>お問い合わせ内容:</p>
<textarea class="form" name="freeans" rows="4" cols="40"><?=$freeans?></textarea>
<input name="check" type="checkbox" value="1" <?if($check == "1"){echo"checked";}?> />個人情報の取り扱いについて同意する。<br>
<input type="submit" name="send" value="送信" />
</form> 
</body>

これって、XSSの対策はhtmlspecialchars()使えばいいという知識だけがあって、何のためにやるのかを理解してないんだろうなぁ。いろいろ脆弱性対策の解説はあるけど、実際のコードではどうすればいいのか?ってのが抜けているのかもしれないなぁとこれを見て思った。

通りすがり通りすがり 2010/04/20 15:04 このコードの問題点(!?)はhtmlspecialcharsするのはhtml出力のとこだけでいいんじゃない?ということでしょうか??xssは無理ですよね?

ikepyonikepyon 2010/04/20 15:59 そうです。XSSはムリですが、全てのパラメータにする必要が無いですよね。例えば、mailなんかhtmlspecialcharsを使っちゃいけない(メールアドレスが変わる)し、checkはその内容をそのまま表示しているのにいらない。

2010-02-25 だるい

[]mod_wafful mod_wafful - ikepyonのお気楽な日々〜技術ネタ風味〜 を含むブックマーク mod_wafful - ikepyonのお気楽な日々〜技術ネタ風味〜 のブックマークコメント

というのがあったなんて知らなかった。

これを使えば、中途半端な文字コードを使った脆弱性を防げそう。

http://wafful.org/mod_wafful/mod_wafful.c

http://lc.linux.or.jp/lc2008/slide/lt-02.pdf

こんなことで嘆かなくてよいかも

http://blog.ohgaki.net/char_encoding_must_be_validated

2010-02-24 遅くなった

[]XHRのその後のその後 XHRのその後のその後 - ikepyonのお気楽な日々〜技術ネタ風味〜 を含むブックマーク XHRのその後のその後 - ikepyonのお気楽な日々〜技術ネタ風味〜 のブックマークコメント

http://d.hatena.ne.jp/ikepyon/20091119#p1

の件だが、Wininet.dllのバージョン8.00.6001.18876 (longhorn_ie8_gdr.091218-1700)で直っている模様。

やっとって感じだなw

2010-02-17 カマ掘りたい

[]コードによる脆弱性が発生する仕組み コードによる脆弱性が発生する仕組み - ikepyonのお気楽な日々〜技術ネタ風味〜 を含むブックマーク コードによる脆弱性が発生する仕組み - ikepyonのお気楽な日々〜技術ネタ風味〜 のブックマークコメント

コードによる脆弱性が発生する原理は、XSSにしろ、SQLインジェクションにしろおんなじ何だが、理解できてない人には理解できないみたいなようなのでつれづれに書いてみる。

どんなアプリケーションも以下のような構造をしている。

入力データ→モジュールA→データ1→モジュールB→データ2→モジュールC→データ3→・・・・・→モジュールX→出力データ

要するに、どこかしらから入力データを受け取ったモジュールが、そのデータをごちゃごちゃ処理を行い、その結果をデータとして別のモジュールに渡す。そしてデータを受け取ったモジュールが今度はそのデータを元に処理を行って、また新しいデータを出力する。これを延々伝言ゲームのように繰り返すわけだ。

まあ、大きく考えると一つのモジュールはブラウザ、RDBMS、Webアプリケーションといったものになるし、粒度を小さくして関数やメソッド単位にして考えてもいい。どっちにしろ、あらゆるアプリケーションは複数のモジュールを組み合わせて作られている。

さて、伝言ゲームでは、受け取った情報を隣の人に伝えてるだけなのに、最初の人が受け取った内容と、最後の人が受け取った内容がまったく異なることが多々ある。これは、各人が受け取った情報の伝達にミスがあるとか、勝手に解釈するからというのがあるために発生するわけである。コードによる脆弱性もまったく同じようなことが起こっているために起こる。

つまり、モジュール内では問題なく解釈し処理を行っているのだけれど、他のモジュールに渡すデータが受け取るモジュールからするとあいまい(正確に言うと違うのだけれど)というか別の意味に解釈できるようなデータを渡してしまう。この結果、開発者が意図しない処理を行ってしまう。これが、脆弱性として表面化するのである。受け取るデータが明確におかしなもの(伝言ゲームの例で言えば、出題内容が日本語とされているにもかかわらず日本語の文法に沿ってないものとか)であれば、受け取る側で「コレはおかしい!」と判断して、エラーなり、なんなり処理ができるんだけれども、たまたまデータはおかしくないけれど、別の意味に取れるようなものであれば、別の意味として処理を行ってしまう。

日本語で言えば、例えば次のような文章があったとする。

ここではきものをぬいでください

コレを書いた人(開発者)は「ここで履物を脱いでください」という意味でこの文章を書いたにもかかわらず、受け取った人(RDBMSとか他のモジュール)は「ここでは着物を脱いでください」ととって服を脱ぎだすということが起こっているかもしれない。

元の文は「は」を「HA」と読むか、「WA」と読むかで大きく意味が違ってくる。

日本語では「は」という文字は特別な意味を持っており、「WA」と読むことで「助詞?」になったり、「HA」と読むことでただの「は」という文字になったりする。先の文を一意の意味を持つようにするためには以下のようにすればいい。

ここで、はきものをぬいでください

こうすることで「は」は「HA」としか取れなくなる。もちろん「はきもの」を「くつ」に変えてしまって、「ここでくつをぬいでください」としても日本語としてはほぼ同じ意味を持つので問題ないと言うかもしれない。しかし、文章が改変されてしまい、もとの文章とは違うものになってしまっている。「くつ」をぬげとあるが、では「げた」は脱がなくてもいいのか?とか「さんだる」は?という具合に厳密に考えると不具合が起こる。もっとも、人間はいい加減なので「くつ」=「はきもの」と解釈するので現実社会では問題は起こらないだろう。


これと同じこと(「は」を「WA」でなく「HA」と読んでしまうこと)がコードの脆弱性でも起こっている。例えばSQLインジェクションであれば「'」は文字列リテラルの区切りを意味するので「Tully's」といった文字列リテラルをそのまま検索しようとすると「'」が文字列リテラルの終了とみなされて、SQL文法エラーが発生してしまう。

これを防ぐには「は」を「HA」と確実に読ませるように「、は」としたように、「'」を文字列リテラルの区切りをいう意味を持たないただの文字データ「'」として表す必要がある。そのためには「'」を「''」にするという処理を行う。こういった特別な意味を持つデータを特別な意味を持たないデータにする処理をエスケープ処理と呼ぶ。この処理を行うことで、RDBMSは、開発者の意図どおりの意味を解釈することができる。

こう理解するとコードの脆弱性対策って当たり前のことと思えないかなぁ?

2010-02-10 あと一日

[]iモードのセキュリティガイドライン iモードのセキュリティガイドライン - ikepyonのお気楽な日々〜技術ネタ風味〜 を含むブックマーク iモードのセキュリティガイドライン - ikepyonのお気楽な日々〜技術ネタ風味〜 のブックマークコメント

http://www.nttdocomo.co.jp/service/imode/make/content/browser/

ガイドラインといっておきながら、内容が無いようw

せめてリンクもIPAのトップページじゃなくて、安全なWebサイトの作り方とか、セキュアプログラミング講座とかへのリンクにしとこうよ。

IPAのトップページのリンクなんかじゃきっと見つけられない人出てくるよw

まあ、auとかソフトバンクはこういったガイドラインを出そうという気がないようなので、それよりましだけどさ


1900 | 01 | 06 |
2003 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 02 | 03 | 04 |
2011 | 01 | 02 |