4.36.19 (2013.02.26)
: form 태그의 action 속성을 이용한 XSS 취약점 해결 (i2sec 13기 박성진님께서 직접 알려 주셨습니다.)
이 취약점은 ie 브라우저에서만 발생하는 것으로 알려져 있습니다.
lib/common.lib.php 의 bad_tag_convert() 함수중에서
return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>?/i", "<$1$2$3>", $code);
를
return preg_replace("/\<([\/]?)(script|iframe|form)([^\>]*)\>?/i", "<$1$2$3>", $code);
와 같이 수정 하였습니다.
4.36.18 (2013.02.22)
: iframe 태그에 주석문을 사용한 XSS 취약점 해결 (i2sec 13기 김태현님께서 직접 알려 주셨습니다.)
기존 코드의 위치를 바꿔서 해결 했습니다.
lib/common.lib.php 의 conv_content() 함수중에서
$content = bad_tag_convert($content);
이 코드의 위치가 변경 되었습니다.
4.36.17 (2013.02.22)
: 게시물 링크를 통한 XSS 취약점 해결 (서울 대원고등학교 현성원님께서 한국인터넷진흥원을 통하여 알려 주셨습니다.)
링크에는 HTML 태그를 사용하지 못하도록 조치 하였습니다.
bbs/write_update.php 에 아래와 같이 두줄 수정해 주시면 됩니다.
$wr_link1 = mysql_real_escape_string(strip_tags($_POST['wr_link1']));
$wr_link2 = mysql_real_escape_string(strip_tags($_POST['wr_link2']));
4.36.16 (2013.02.14)
: XSS 취약점 해결 (i2sec 황도경님께서 알려 주셨습니다.)
파일명에 특수문자가 포함되는 경우에 발생할수 있어 파일명을 필터링 하였습니다.
bbs/write_update.php 에 한줄 추가해 주시면 됩니다.
$filename = preg_replace('/(\s|\<|\>|\=|\(|\))/', '_', $filename);
4.36.15 (2013.02.06)
: SQL Injection 취약점 해결
김동현(Stealth) 님께서 한국인터넷진흥원(KISA)을 통하여 알려 주셨습니다.
※ php.ini 또는 .htaccess 에서 register_globals = On, magic_quotes_gpc = Off 으로 설정하였을 경우에만 해당됩니다.
bbs/memo_view.php 의 SQL 코드 위에 아래와 같이 한줄 추가해 넣으시면 됩니다.
$me_id = (int)$me_id;
bbs/memo_delete.php 의 SQL 코드 위에 아래와 같이 한줄 추가해 넣으시면 됩니다.
$me_id = (int)$me_id;
4.36.14 (2013.02.02)
: 오타로 인한 XSS 취약점 해결
㈜윈스테크넷 침해사고대응센터에서 한국인터넷진흥원(KISA)을 통하여 알려 주셨습니다.
lib/common.lib.php 를 다음과 같이 수정 하였습니다.
//$pattern .= "(i|(x6a|105);?)";
$pattern .= "(i|(x69|105);?)";
4.36.13 (2013.01.29)
: iframe 등의 tag 에 주석 처리가 되어 있는 경우의 (/**/) XSS 취약점 해결
장원용 님께서 한국인터넷진흥원(KISA)을 통하여 알려 주셨습니다.
lib/common.lib.php 를 다음과 같이 수정 하였습니다.
// tag 내의 주석문 무효화 하기
function bad130128($matches)
{
$str = $matches[2];
return '<'.$matches[1].preg_replace('#(\/\*|\*\/)#', '', $str).'>';
}
...
$content = preg_replace_callback("/<([^>]+)>/s", 'bad130128', $content);
4.36.12 (2013.01.09)
: XSS 취약점 해결, 패치된 내역 수정 보완
UN Security팀에서 한국인터넷진흥원을 통하여 알려 주셨습니다.
lib/common.lib.php 의 아래 코드가 추가 되었습니다.
$content = preg_replace_callback("#style\s*=\s*[\"\']?[^\"\']+[\"\']?#i",
create_function('$matches', 'return str_replace("\\\\", "", stripslashes($matches[0]));'), $content);
: session_unregister 는 PHP 5.3 이상 에서 더이상 사용되지 않고 PHP 5.4 에서 사라지는 함수입니다.
unset($_SESSION['const']) 로 대체합니다.
김선용 님께서 알려 주셨습니다.
bbs/formmail_send.php
bbs/member_leave.php
bbs/memo_form_update.php
bbs/password_lost2.php
bbs/register_form_update.php
bbs/write_comment_update.php
bbs/write_update.php
4.36.11 (2012.12.13)
: 글읽기에서 실행되는 XSS 취약점 보완
UN Security팀에서 한국인터넷진흥원을 통하여 알려 주셨습니다.
lib/common.lib.php 에 아래와 같이 추가합니다.
// 와 같은 코드에 취약점이 있어 수정함. 121213
$content = preg_replace("/(?<=style)(\s*=\s*[\"\']?xss\:)/i", '="__XSS__', $content);
4.36.10 (2012.12.04)
: 크롬에서만 실행되는 XSS 취약점 보완
서울 대원고등학교 현성원님 께서 한국인터넷진흥원을 통하여 알려 주셨습니다.
common.php 에 아래와 같이 추가합니다.
// 코드 $sfl 변수값에서 < > ' " % = ( ) 공백 문자를 없앤다.
$sfl = preg_replace("/[\<\>\'\"\%\=\(\)\s]/", "", $sfl);
4.36.09 (2012.11.30)
: 게시판에서 DHTML 에디터를 사용하지 않고 html 글을 작성하는 경우에 XSS 취약점이 발견되어 보완합니다.
윤태성(삽지리)님 께서 한국인터넷진흥원을 통하여 알려 주셨습니다.
lib/common.lib.php 를 아래와 같이 수정합니다.
//$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "_$1$2_", $content);
4.36.08 (2012.11.01)
: SQL Injection 취약점 보완 (Stealth in BlackFalcon 김동현님께서 한국인터넷진흥원을 통하여 알려 주셨습니다.)
단, register_globals = On, magic_quotes_gpc = Off 설정을 만족하는 경우에만 해당됩니다.
: 태그에 포함되지 않은 expression 속성이 변환되는 것을 방지
bbs/memo_form.php 의
$me_id = mysql_real_escape_string($me_id);
lib/common.lib.php 의
//$content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content);
$content = preg_replace("/<[^>]*".$pattern."/i", "__EXPRESSION__", $content);
4.36.07 (2012.10.23)
: 일부 브라우저에서 template.xml 로딩 오류 발생으로 인하여 template.xml 코드를 cheditor.js 에 포함시켜서 해결함.
(CHSOFT 나창호님께서 도움 주셨습니다.)
cheditor5/cheditor.js 수정
cheditor5/template.xml 삭제 (그냥 둬도 상관 없음)
4.36.06 (2012.10.12)
: [보안] XSS 취약점 보완 (unsecurity 김강섭님께서 한국인터넷진흥원을 통하여 알려 주셨습니다.)
lib/common.lib.php
// 이런 경우를 방지함
//$content = preg_replace("#\/\*.*\*\/#iU", "", $content);
// 위의 정규식이 아래와 같은 내용을 통과시키므로 not greedy(비탐욕수량자?) 옵션을 제거함. ignore case 옵션도 필요 없으므로 제거
//
$content = preg_replace("#\/\*.*\*\/#", "", $content);
4.36.05 (2012.09.24)
: 우편번호 2012.07.13.자 반영 52,017건
bbs/zip.db
4.36.04 (2012.08.22)
: 플래시 플레이어 업그레이드로 인한 에디터 파일업로드에 문제가 생겨 cheditor 5.04 에서 cheditor 5.09.2 로 업데이트 합니다.
: 4.36.03 에서 추가된 CHARSET 관련 패치를 제거합니다. 일부 페이지들과의 호환성에서 문제가 있었습니다.
cheidtor5/*
common.php 에
header("Content-Type: text/html; charset={$g4['charset']}"); 를 제거했습니다.
4.36.03 (2012.07.20)
: [보안] 비회원 글쓰기에서 다른 사람의 글에 수정할수 있는 오류가 있어 수정 (이준호님께서 알려 주셨습니다.)
: 공백 비교 코드 오류로 인한 수정 (letsgolee님께서 알려 주셨습니다.)
: CHARSET 고정 - 상,하단 레이아웃을 사용하지 않는 경우 경고창등이 깨지는 경우를 방지 (곱슬최씨님께서 제안해 주셨습니다.)
bbs/write.php
set_session('ss_bo_table', $_REQUEST['bo_table']);
set_session('ss_wr_id', $_REQUEST['wr_id']);
bbs/write_update.php
if (get_session('ss_bo_table') != $_POST['bo_table'] || get_session('ss_wr_id') != $_POST['wr_id']) {
alert('올바른 방법으로 수정하여 주십시오.');
}
lib/common.lib.php 의 check_string() 함수중
else if ($oc >= 0x20) { 를
else if ($oc == 0x20) { 와 같이 수정했습니다.
common.php 에
header("Content-Type: text/html; charset={$g4['charset']}"); 를 추가했습니다.
4.36.02 (2012.06.27)
: 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. (i2sec 김준규님께서 알려 주셨습니다.)
value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
: 4.36.01 의 코드에 오류가 있어 수정했습니다.
lib/common.lib.php 의 아래 코드를 수정 및 추가하십시오.
$content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
// 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다.
// value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
$content = preg_replace("/((?<=\]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content);
4.36.01 (2012.06.26)
: XSS 취약점 수정 보완 (i2sec 강우석님께서 원인과 해결책을 모두 알려 주셨습니다.)
기존코드에 헛점이 있어 코드를 수정 보완 하였습니다.
lib/common.lib.php 의 conv_content() 함수에 아래와 같이 한줄 추가 하였습니다.
$content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".htmlspecialchars($m[1], ENT_NOQUOTES);'), $content);
4.36.00 (2012.06.21)
: DB SESSION 의 MySQL 과부하로 인하여 기존의 FILE SESSION 으로 되돌림
data/session 디렉토리를 생성하신 후
chmod 777 data/session 명령으로 세션데이터 쓰기가 가능하도록 퍼미션을 변경하시기 바랍니다.
data/session 디렉토리에 deny from all 과 같은 내용으로 .htaccess 파일을 생성하십시오.
common.php 를 아래와 같이 수정하십시오.
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
session_save_path("{$g4['path']}/data/session");
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
//==============================================================================
// 공용 변수
//==============================================================================
// 기본환경설정
// 기본적으로 사용하는 필드만 얻은 후 상황에 따라 필드를 추가로 얻음
$config = sql_fetch(" select * from $g4[config_table] ");
ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분)
ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초)
ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오.
ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다.
session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);
@session_start();
4.35.02 (2012.06.15)
: 4.35.01 의 세션테이블 생성할때 utf-8 사용시 세션테이블을 utf8 로 생성 (내일을위하여 님이 알려주시고 모바일님이 해결해 주셨습니다.)
lib/dbsession.lib.php 에 추가하세요.
if (strtolower($g4['charset']) == 'utf-8') {
$sql .= " DEFAULT CHARSET=utf8 ";
}
4.35.01 (2012.06.13)
: 4.35.00 에서 cookie_domain 의 설정등이 누락되어 서브도메인간의 세션 공유가 되지 않던 오류를 수정 (cosy님께서 알려주셨습니다.)
: 세션 데이터의 유지시간이 기본 1440초(24분)으로 짧아 10800초(3시간) 동안 유지되도록 수정
: 세션 테이블 생성시 날짜시간에 인덱스를 추가
common.php 를 아래와 같이 수정하세요.
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
include_once("$g4[path]/lib/dbsession.lib.php");
$session = new g4_dbsession();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));
session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);
ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분) 180분 == 3시간
ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초) 10800초 == 3시간
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
@session_start();
//-------------------------------------------
lib/dbsession.lib.php 를 아래와 같이 수정하세요.
$sql = " CREATE TABLE `$g4[session_table]` (`ss_id` CHAR(32) NOT NULL, `ss_data` TEXT NOT NULL, `ss_datetime` DATETIME NOT NULL, PRIMARY KEY (`ss_id`), KEY `ss_datetime` (`ss_datetime`)) ENGINE = MYISAM ";
4.35.00 (2012.06.12)
: SESSION Data 가 노출되지 않도록 DB SESSION 사용 (HSEngine 님께서 알려 주셨습니다.)
: $_SERVER['PHP_SELF'] 변수를 사용한 XSS 취약점 수정
lib/dbsession.lib.php 파일 추가
config.php 파일에 추가하세요.
$g4['session_table'] = $g4['table_prefix'] . "session"; // 세션 테이블
common.php 파일에서
SESSION 관련 코드를 모두 삭제하신 후 아래 코드로 대체하세요.
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$_SERVER['PHP_SELF'] = htmlentities($_SERVER['PHP_SELF']);
//-------------------------------------------
// SESSION 설정
//-------------------------------------------
include_once("$g4[path]/lib/dbsession.lib.php");
$session = new g4_dbsession();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)
if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");
@session_start();
//-------------------------------------------
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
4.34.30 (2012.05.29)
: 4.34.28 의 검색 구문 수정후 게시판에서 분류 검색이 되지 않는것을 수정
lib/common.lib.php 의 get_sql_search() 함수가 수정 되었습니다.
4.34.29 (2012.05.27)
: 4.34.28 패치에서 embed 태그중 allowscriptaccess 코드를 script 로 인식하여 동영상 작동이 안되는것을 수정
lib/common.lib.php 의 bad120422() 함수가 수정 되었습니다.
function bad120422($matches)
{
$tag = $matches[1];
$code = $matches[2];
if (preg_match("#\bscript\b#i", $code)) {
return "$tag 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#\bbase64\b#i", $code)) {
return "$tag 태그에 BASE64는 사용 불가합니다.";
}
return $matches[0];
}
4.34.28 (2012.05.24)
: 게시판 검색시 검색어에 태그가 들어가는 경우 쿼리 에러가 나는것을 수정 (곱슬최씨님께서 알려 주셨습니다.)
get_sql_search() 함수 수정
: [보안패치] XSS 취약점 오류 수정 (i2sec 하동민님께서 알려 주셨습니다.)
conv_content(), bad120422() 함수 수정
lib/common.lib.php
4.34.27 (2012.05.22)
: [보안패치] SQL Injection 공격 취약점을, 김동현(BlackFalcon)님께서 한국인터넷진흥원을 통하여 알려 주셨습니다.
bbs/download.php 에 아래 코드를 한줄 추가해 주시기 바랍니다.
$no = (int)$no;
4.34.26 (2012.05.03)
: 4.34.23 에서 이상 없는 OBJECT 태그의 반환이 제대로 되지 않던 오류 수정 (곱슬최씨님께서 고쳐 주셨습니다.)
lib/common.lib.php 의
function bad120422($matches)
{
$code = $matches[1];
if (preg_match("#script#i", $code)) {
return "OBJECT 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#base64#i", $code)) {
return "OBJECT 태그에 BASE64는 사용 불가합니다.";
}
return $matches[0]; // 이 코드가 추가 되었습니다.
}
4.34.25 (2012.04.30)
: [보안강화] 설치시 data 디렉토리에 .htaccess 파일을 생성하여 data 디렉토리 및 하위 디렉토리에서는
.htaccess .htpasswd .php .phtml .html .htm .inc .cgi .pl 파일을 실행 할 수 없습니다.
기존에 운영중인 사이트에서는 data 디렉토리에 .htaccess 파일을 아래와 같은 내용으로 작성하십시오.
Order allow,deny
Deny from all
4.34.24 (2012.04.23)
: 4.34.23의 conv_content() 함수내에 함수가 선언되어 그누보드외 프로그램에서 오류가 발생했습니다.
bad120422() 함수를 conv_content() 바깥으로 이동시켜 해결하였습니다. (지니아빠님께서 알려 주셨습니다.)
lib/common.lib.php
4.34.23 (2012.04.22)
: [XSS] OBJECT 태그에서 javascript를 실행할수 있는 버그를 수정 (i2Sec 8기 하동민님께서 알려 주셨습니다.)
: [XSS] 글쓰기시 이름에 HTML 태그가 입력되지 못하도록 수정 (i2Sec 8기 강우창님께서 알려 주셨습니다.)
: login, logout시 외부로 리다이렉트 할 우려가 있어 url에 도메인을 지정하지 못하도록 수정 (i2Sec 8기 조민기님께서 알려 주셨습니다.)
: cheditor4의 삭제 코드에 문제가 있어 이번 버전부터는 cheditor4는 제외하고 배포합니다. (i2Sec 8기 조민기님께서 알려 주셨습니다.)
: 이외에도 i2Sec 8기 여러분들께서 SQL Injection 등의 오류를 알려 주셨으나 그누보드4가 소스코드를 오픈하고 있으므로
해당 오류는 SQL Injection으로 보기 어렵습니다. 도움주신 i2Sec 8기 여러분들께 감사의 말씀을 전합니다.
lib/common.lib.php 의
function bad120422($matches)
{
$code = $matches[1];
if (preg_match("#script#i", $code)) {
return "OBJECT 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#base64#i", $code)) {
return "OBJECT 태그에 BASE64는 사용 불가합니다.";
}
}
// object 태그에서 javascript 코드 막기
$content = preg_replace_callback("#