TOWN(CGIゲーム)の脆弱性の案内

JVN (https://jvn.jp/) VN JVN#12513975

https://jvn.jp/jp/JVN12513975/

2013年11月01日作成

この度、使い方によって、任意のコードが実行できる脆弱性がtownにて報告され、確認されました。

これは、town の始めから現在(改造版 TOWN 5_9_3)に至るまでの継承性のあるバグと思われます。

town のプログラムによる発生で、他のゲームなどとは関係ない独自のミスによることが想定されます。

関係各位様は、管理人に連絡して、脆弱性の解消をお願いします。

変更箇所 town_lib.pl 最低限

cgi_lib.pl 使用の方

#デコード処理
sub decode {
local($buf, $key, $val, @buf,$get_in); #koko2013/10/31
if ($ENV{'REQUEST_METHOD'} eq "POST") {
&ReadParse;
while (($key,$value)=each %in){
if ($key ne "upfile"){
&jcode'convert(*value,"sjis");
# $value =~ s/,/,/g;
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;
}
$in{$key} = $value;
}
} else { $buf = $ENV{'QUERY_STRING'};$get_in = 1; } #koko2013/10/31
@buf = split(/&/, $buf);
foreach (@buf) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#koko2013/10/31
if($get_in){

$val =~ s/\"/&quot;/g;
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
}
#end2013/10/31
# 文字コード変換 (Shift-JISコード)
&jcode'convert(*val,'sjis');
$in{$key} = $val;
}


改造版townの方

} else {
$query = $ENV{'QUERY_STRING'};
if($query =~ m/town_no/ && $query !~ m/name/){&error("不正アクセスです。");}#koko20131029
$get_in = 1; #koko2013/10/31
}

if($query){$in_query = 1;}

foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
# 文字のデコード
$value =~ tr/+/ /;
if($key eq 'a_com' && $value !~ /%/){&error("日本語を含んでいない投稿はできません。"); }
$value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
#koko2013/10/31# エスケープ
if($get_in){

$value =~ s/\"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
}

#end2013/10/31

####################################
追加補強
town_lib.pl

# スクリプトの禁止(タグではありません)koko20131101
$kinnshi_scr = 0;#0で禁止1許可

#クッキーネームの変更
$COOKIE_NAME = 'town_maker2';

---------------------------------

} else {
$query = $ENV{'QUERY_STRING'};
$get_in = 1; #koko2013/10/31
}
if($query =~ m/town_no/ && $query !~ m/name/){&error("不正アクセスです。");}#koko20131101
if($query){$in_query = 1;}
foreach $pair (split(/&/, $query)) {


-------------------------------
if(!$kinnshi_scr && $value =~ m/script/i){ #20131101
$value =~ s/\"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
if(!$get_in){
$value =~ s/&lt;br&gt;/<br>/ig;
}
}

#end2013/10/31

-----------------------------------
while (($key,$value)=each %in){
if($value eq "\r\n" || $value eq "\n" || $value eq "\r"){&error("値がありません");}
$value =~ s/\<\>/&lt;&gt;/g;
# if(($flag && $key eq "title") || ($flag && $key eq "comento")){ #タグ許可のため
# next;
# }#end20131101 全てのタグが使えるのは不適当と判定
unless ($key eq "upfile" && $key eq "mode" && $value eq "dokuzi_settei_do" && $key eq "mode" && $value eq "gentei_settei_do"){

------------------------------------
top_pl

#####街のログを開いて画面展開
if($this_town_no =~ m/\D/){&error("Open Error : no_town");} #koko20131101
$town_data = "./log_dir/townlog".$this_town_no.".cgi";
open(TW,"< $town_data") || &error("Open Error : tawn_map");
------------------------------------

Open Error : $town_data にて書かれたものがそのまま書き出される。
これによって、不具合が発生する。

変更済みの明記

#####フッター
sub hooter {
・・・・・・・
<a href="http://shohei.heteml.jp/brassiere/02cgi/09.html" target="~_blank">- $version 2 script by brassiere -</a> <a href=$master_kb>■お問い合わせ</a>

$versionの後に半角空白2半角空白
にて、アップしたことを記録しておいてください。

参考ファイルのダウンロード
     バグ修正

最新情報・バージョンアップあり