KENT-WEB サポートコーナー 過去ログ [ 0016 ]


記事No: 9030
投稿日: 2011/08/27(Sat) 10:41:05
タイトルcart.cgi v1.2bの脆弱性と不具合
ID情報: c57g3z2h
投稿者: クロス
URLhttp://nanashi

【最速攻略 CGI/Perl 作り方入門 [CD-ROM付]
KENT (著) 2006年8月10日初版 第1刷発行 2011年4月10日初版 第6刷発行】付録の cart.cgi v1.2b について。

cart.cgi v1.2bのバージョンが新しいのか古いのか
把握出来ません。

つい最近、増刷と知らずに購入してしまいましたが
2008年にIPAがWEB MARTにXSS脆弱性があると勧告したWEB MARTと
同じ構造ですか?
cart.cgi v1.2bは脆弱性がある状態だと言う事でしょうか?
もしそうであるなら、増刷での古いcgi配布は道義的に問題です。
故意での配布にあたりますよ。

更にcart.cgi v1.2bは2バイト目が\の文字を弾き「申し込み」が
「垂オ込み」になってしまい、文字化けが酷く、特殊文字に
重複する文字の直後に「\」を付けるか、文字コードにEUCを
使えば回避出来るようですが、それとは別の問題もあり
電話番号・郵便番号の入力欄にひらがなを入力したものですら
実行される始末です。

KENT氏の最新のcgiも未だにそのような入力チェックが
無い状態なのでしょうか?


記事No: 9031
投稿日: 2011/08/27(Sat) 12:04:23
タイトルRe: cart.cgi v1.2bの脆弱性と不具合
ID情報: kent
投稿者: KENT

> 【最速攻略 CGI/Perl 作り方入門 [CD-ROM付]
> KENT (著) 2006年8月10日初版 第1刷発行 2011年4月10日初版 第6刷発行】付録の cart.cgi v1.2b について。
>
> cart.cgi v1.2bのバージョンが新しいのか古いのか
> 把握出来ません。
>
> つい最近、増刷と知らずに購入してしまいましたが
> 2008年にIPAがWEB MARTにXSS脆弱性があると勧告したWEB MARTと
> 同じ構造ですか?
> cart.cgi v1.2bは脆弱性がある状態だと言う事でしょうか?
> もしそうであるなら、増刷での古いcgi配布は道義的に問題です。
> 故意での配布にあたりますよ。
>
> 更にcart.cgi v1.2bは2バイト目が\の文字を弾き「申し込み」が
> 「垂オ込み」になってしまい、文字化けが酷く、特殊文字に
> 重複する文字の直後に「\」を付けるか、文字コードにEUCを
> 使えば回避出来るようですが、それとは別の問題もあり
> 電話番号・郵便番号の入力欄にひらがなを入力したものですら
> 実行される始末です。
>
> KENT氏の最新のcgiも未だにそのような入力チェックが
> 無い状態なのでしょうか?

ご指摘をありがとうございました。
WEB MARTと書籍サンプルのcart.cgiとは構造は異なります。
(WEB MARTのかつての脆弱性が発見されたロジックは、cart.cgiには存在しません)
書籍サンプルはプログラムの勉強のためのものですので、あえて機能も簡易的なものになっており(紙面の都合やプログラム構造の分かりやすさの観点から)、入力チェックとして数字や郵便番号の規則性などは行っておりません。
文字化けの件は、確認して早めに対応するようにします。


記事No: 9032
投稿日: 2011/08/27(Sat) 13:33:04
タイトルRe^2: cart.cgi v1.2bの脆弱性と不具合
ID情報: c57g3z2h
投稿者: クロス

KENTさん

ご回答有り難うございます。
それでは文字化けを修正し、入力チェック・XSS対策・サニタイジングを施したFIX版をアップして頂きたいので宜しくお願いします。

それと最新のWEB MARTと付録のcart.cgiとでは機能的(入力チェック)・セキュリティー面でどちらが良いのでしょうか?

またcart.cgi v1.2bとはいつのものですか?v1.2b以上のバージョンは存在しますか?

以上ですが宜しくお願いします。


記事No: 9033
投稿日: 2011/08/27(Sat) 14:26:34
タイトルRe^3: cart.cgi v1.2bの脆弱性と不具合
ID情報: kent
投稿者: KENT

> KENTさん
>
> ご回答有り難うございます。
> それでは文字化けを修正し、入力チェック・XSS対策・サニタイジングを施したFIX版をアップして頂きたいので宜しくお願いします。
>
> それと最新のWEB MARTと付録のcart.cgiとでは機能的(入力チェック)・セキュリティー面でどちらが良いのでしょうか?
>
> またcart.cgi v1.2bとはいつのものですか?v1.2b以上のバージョンは存在しますか?

現在手元に第4刷があり、確認してみましたが、分かりませんでしたので質問します。

(1)「cart.cgi v1.2b」というバージョン情報は、どこに書いてありますか? cart.cgiのヘッダー部分でしょうか?

(2)「申し込み」という文字は何行目に書かれてあるものでしょうか?

(3)「XSS対策・サニタイジングを施したFIX版」と書いていますが、最初からそのつもりです。何か(未知の部分として)脆弱性を発見しているという意味でしょか?


記事No: 9043
投稿日: 2011/08/28(Sun) 13:54:36
タイトルRe^4: cart.cgi v1.2bの脆弱性と不具合
ID情報: c57g3z2h
投稿者: クロス

KENTさん

ご回答有り難うございます。

>(1)「cart.cgi v1.2b」というバージョン情報は、どこに書いてありますか? cart.cgiのヘッダー部分でしょうか?

はい、そうです。cart.cgiのヘッダー部分に記載されています。

>(2)「申し込み」という文字は何行目に書かれてあるものでしょうか?

こちらでcart.cgi v1.2bの<h3>ショッピングカート (1/4)</h3>
▼買物カゴの中身は以下のとおりです。←を"申し込み"に置き換えただけです。

>(3)「XSS対策・サニタイジングを施したFIX版」と書いていますが、最初からそのつもりです。何か(未知の部分として)脆弱性を発見しているという意味でしょか?

いえ、未知の部分の脆弱性と言う訳ではありません。
気になる点は、文字化けとバリデーションです。
他社製のフォームでは電話番号や郵便番号には整数しか入力出来ないよう入力チェックを掛けているので、KENTでも入力チェック・バリデーションがなされれば安全ではと提案致しました。



記事No: 9046
投稿日: 2011/08/28(Sun) 19:26:49
タイトルRe^5: cart.cgi v1.2bの脆弱性と不具合
ID情報: kent
投稿者: KENT

> >(2)「申し込み」という文字は何行目に書かれてあるものでしょうか?
>
> こちらでcart.cgi v1.2bの<h3>ショッピングカート (1/4)</h3>
> ▼買物カゴの中身は以下のとおりです。←を"申し込み"に置き換えただけです。

こういうのは、プログラムの「不具合」とは言いませんよ。
シフトJIS環境の特性です。以下のページをよく読んでください。

http://www.kent-web.com/support/faq/faq1.html#4
http://www.kent-web.com/pubc/jcode/index.html

> >(3)「XSS対策・サニタイジングを施したFIX版」と書いていますが、最初からそのつもりです。何か(未知の部分として)脆弱性を発見しているという意味でしょか?
> いえ、未知の部分の脆弱性と言う訳ではありません。
> 気になる点は、文字化けとバリデーションです。
> 他社製のフォームでは電話番号や郵便番号には整数しか入力出来ないよう入力チェックを掛けているので、KENTでも入力チェック・バリデーションがなされれば安全ではと提案致しました。

入力チェックの内容や考え方は、先に回答してるとおりです。
元々、ここでいうチェック内容をどこまで精緻化すると「安心」なのかは、ヒトによって基準が異なります。
たとえば、本文に日本語が含まれていないと危険という人もいますし、URLが複数含まれていると危険という人もいます。
その辺の考え方は、十人十色であり、それぞれが気になる箇所は、それぞれがカスタマイズするしかないと思います。

今回のご要件では、電話番号と郵便番号の内容を強化したということのようですので、
以下の改造内容でよろしいかと思います。
(メールアドレスの規則性と、電話・郵便番号は数字/ハイフンのみ有効)

(cart.cgi 295行目)
■変更前
my $err;
if ($in{'name'} eq "") { $err .= "名前が未入力です<br>"; }
if ($in{'email'} eq "") { $err .= "E-Mailが未入力です<br>"; }
if ($in{'tel'} eq "") { $err .= "電話番号が未入力です<br>"; }
if ($in{'addr'} eq "") { $err .= "住所が未入力です<br>"; }
if ($err) { &error($err); }

■変更後
my $err;
if ($in{'name'} eq "") { $err .= "名前が未入力です<br>"; }
if ($in{'email'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,}$/) { $err .= "E-Mailが不正です<br>"; }
if ($in{'tel'} =~ /[^\d\-]/) { $err .= "電話番号が不正です<br>"; }
if ($in{'zip'} =~ /[^\d\-]/) { $err .= "郵便番号が不正です<br>"; }
if ($in{'addr'} eq "") { $err .= "住所が未入力です<br>"; }
if ($err) { &error($err); }

もう少し念を入れるならば、上記の8行を、439行目の下にも入れる(追加)といいと思います。

(439行目)
# 住所入力画面に戻る
if ($in{'back_addr'}) { &addr; }

## ここに挿入追加

それから、最後に一言。
当初から、事実を確認することなく、「道義的に問題」「故意での配布」「文字化けが酷く」
「XSS対策・サニタイジングを施したFIX版」など、非常に失礼な発言が目立ちます。
ネットに限ったことではありませんが、初対面の者に対する言葉の最低限のマナーくらいは認識しましょう。ヒトを不愉快にさせてしまいますよ。


記事No: 9048
投稿日: 2011/08/28(Sun) 23:40:01
タイトルRe^6: cart.cgi v1.2bの脆弱性と不具合
ID情報: c57g3z2h
投稿者: クロス

KENTさん

ご回答有り難うございます、大変助かりました。
早速、ご指摘の通り記述しようと思います。

あと一つあるのですが、文字化けの件(2バイト目がPerlの特殊文字に重複したり正規表現にマッチする場合の回避)
こちらもお待ちしておりますので、宜しくお願い致します。

失礼な発言、申し訳無かったと反省しておりますがどうぞ今後ともご教示よろしくお願いします。


記事No: 9051
投稿日: 2011/08/29(Mon) 08:12:05
タイトルRe^7: cart.cgi v1.2bの脆弱性と不具合
ID情報: kent
投稿者: KENT

> KENTさん
>
> ご回答有り難うございます、大変助かりました。
> 早速、ご指摘の通り記述しようと思います。
>
> あと一つあるのですが、文字化けの件(2バイト目がPerlの特殊文字に重複したり正規表現にマッチする場合の回避)
> こちらもお待ちしておりますので、宜しくお願い致します。

文字化けの件ですが、最初の投稿でご自分で対策らしきことを書いておられるようでしたので、お分かりかと思っていました。

「申し込み」という文字は、シフトJISでは「申」の文字の2バイト目が「\」と同意義に扱われますので、プログラム内に記述する場合には、「申\し込み」と書くようにしてください。
シフトJISで2バイト目に「\」が重複する文字は、次のページに具体的に書いています。

http://www.kent-web.com/pubc/jcode/index.html

それから、シフトJISで「正規表現」を扱う場合ですが、以下のページが参考になります。

http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm

しかし、私の場合はシフトJIS環境では正規表現はなるべく避けるようにしています。例えば、文字列検索を行う場合には、正規表現を使わずに、index関数を使います。もし、どうしても正規表現が必要な際には、EUCコードで書きます。

(例)
$str = '表示';
$word = '掲示板を表示させます。';

if ($word =~ /$str/) # シフトJISではNG

if (index($word,$str) >= 0) # 正規表現ではないのでOK

KENT-WEBで配布するプログラムは原則としてシフトJISにしていますが、これは訪れる方に初心者の方が多いため、(シフトJISの欠点は重々承知していますが)敢えてそうしています。
ただし、時代の流れはUTFコードになってきていますので、いずれはUTF-8コードにしていこうと考えています。


記事No: 9053
投稿日: 2011/08/29(Mon) 12:18:25
タイトルRe^8: cart.cgi v1.2bの脆弱性と不具合
ID情報: c57g3z2h
投稿者: クロス

KENTさん

ご回答有り難うございます。早速参考にさせて頂きます。
それと66行目の特殊文字のエスケープに以下を追加しました。
先日のKENT氏のバリデーション記述も加え、かなり良い感じになった気がします。所で時間があればEUCコード
にしようかとも思いますが、今は「\」を重複文字直後に記述しようと思います。

66行目
# エスケープ
$val =~ s/&/&/g;
$val =~ s/"/”/g;
$val =~ s/</</g;
$val =~ s/>/>/g;

#追加エスケープ
$val =~ s/'/’/g;
$val =~ s/\/¥/g;
#追加エスケープ終わり

UTF-8コード楽しみにお待ちしております。


記事No: 9065
投稿日: 2011/08/29(Mon) 18:10:28
タイトルRe^9: cart.cgi v1.2bの脆弱性と不具合
ID情報: kent
投稿者: KENT

> ご回答有り難うございます。早速参考にさせて頂きます。
> それと66行目の特殊文字のエスケープに以下を追加しました。
> 先日のKENT氏のバリデーション記述も加え、かなり良い感じになった気がします。所で時間があればEUCコード
> にしようかとも思いますが、今は「\」を重複文字直後に記述しようと思います。
>
> 66行目
> # エスケープ
> $val =~ s/&/&/g;
> $val =~ s/"/”/g;
> $val =~ s/</</g;
> $val =~ s/>/>/g;
>
> #追加エスケープ
> $val =~ s/'/’/g;
> $val =~ s/\/¥/g;
> #追加エスケープ終わり

上記の改造ですが、「\」の置き換えコードは間違っていますね。
文法上は、

$val =~ s/\\/¥/g;

と書くべきですが、もしこのようなエスケープ処理を加えると、(シフトJIS環境では)「表」や「申」などの文字が入力された際に、文字化けを起こすと思います。
従って、最後の置き換え演算子(追加エスケープ)は削除した方がいいかと思います。


[検索ページ]