그누보드 다중 취약점 (17-0295, 334, 355) 수정

This commit is contained in:
thisgun
2017-09-28 20:23:28 +09:00
parent 5970f2a577
commit 0f4ec77ac0
6 changed files with 93 additions and 42 deletions

View File

@ -382,17 +382,26 @@ function admin_referer_check($return=false)
} }
$p = @parse_url($referer); $p = @parse_url($referer);
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
$msg = '';
if($host != $p['host']) { if($host != $p['host']) {
$msg = '올바른 방법으로 이용해 주십시오.'; $msg = '올바른 방법으로 이용해 주십시오.';
}
if($return) if( $p['path'] && ! preg_match( '/\/'.preg_quote(G5_ADMIN_DIR).'\//i', $p['path'] ) ){
$msg = '올바른 방법으로 이용해 주십시오';
}
if( $msg ){
if($return) {
return $msg; return $msg;
else } else {
alert($msg, G5_URL); alert($msg, G5_URL);
} }
} }
}
// 접근 권한 검사 // 접근 권한 검사
if (!$member['mb_id']) if (!$member['mb_id'])

View File

@ -21,7 +21,7 @@ if ($file = $_POST['bo_include_head']) {
$purl = parse_url($file); $purl = parse_url($file);
$file = $purl['path']; $file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) { if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로 php, html 파일이 아닙니다.'); alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
} }
$_POST['bo_include_head'] = $file; $_POST['bo_include_head'] = $file;
} }
@ -30,16 +30,16 @@ if ($file = $_POST['bo_include_tail']) {
$purl = parse_url($file); $purl = parse_url($file);
$file = $purl['path']; $file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) { if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로 php, html 파일이 아닙니다.'); alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
} }
$_POST['bo_include_tail'] = $file; $_POST['bo_include_tail'] = $file;
} }
if(!is_include_path_check($_POST['bo_include_head'])) { if(!is_include_path_check($_POST['bo_include_head'], 1)) {
alert('/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'); alert('/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.');
} }
if(!is_include_path_check($_POST['bo_include_tail'])) { if(!is_include_path_check($_POST['bo_include_tail'], 1)) {
alert('/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.'); alert('/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.');
} }

View File

@ -20,6 +20,22 @@ if ($co_timg_del) @unlink(G5_DATA_PATH."/content/{$co_id}_t");
$error_msg = ''; $error_msg = '';
if( $co_include_head ){
$purl = parse_url($co_include_head);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $co_include_tail ){
$purl = parse_url($co_include_tail);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $co_include_head && ! is_include_path_check($co_include_head) ){ if( $co_include_head && ! is_include_path_check($co_include_head) ){
$co_include_head = ''; $co_include_head = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.';

View File

@ -10,12 +10,28 @@ check_admin_token();
$error_msg = ''; $error_msg = '';
if( $qa_include_head && ! is_include_path_check($qa_include_head) ){ if( $qa_include_head ){
$purl = parse_url($qa_include_head);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $qa_include_tail ){
$purl = parse_url($qa_include_tail);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $qa_include_head && ! is_include_path_check($qa_include_head, 1) ){
$qa_include_head = ''; $qa_include_head = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.';
} }
if( $qa_include_tail && ! is_include_path_check($qa_include_tail) ){ if( $qa_include_tail && ! is_include_path_check($qa_include_tail, 1) ){
$qa_include_tail = ''; $qa_include_tail = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.';
} }

View File

@ -7,7 +7,7 @@ if ($is_guest)
$g5['title'] = '내 쪽지함'; $g5['title'] = '내 쪽지함';
include_once(G5_PATH.'/head.sub.php'); include_once(G5_PATH.'/head.sub.php');
if (!$kind) $kind = 'recv'; $kind = $kind ? clean_xss_tags(strip_tags($kind)) : 'recv';
if ($kind == 'recv') if ($kind == 'recv')
$unkind = 'send'; $unkind = 'send';

View File

@ -153,7 +153,7 @@ function alert($msg='', $url='', $error=true, $post=false)
global $g5, $config, $member; global $g5, $config, $member;
global $is_admin; global $is_admin;
if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.'; $msg = $msg ? strip_tags($msg, '<br>') : '올바른 방법으로 이용해 주십시오.';
$header = ''; $header = '';
if (isset($g5['title'])) { if (isset($g5['title'])) {
@ -169,6 +169,8 @@ function alert_close($msg, $error=true)
{ {
global $g5; global $g5;
$msg = strip_tags($msg, '<br>');
$header = ''; $header = '';
if (isset($g5['title'])) { if (isset($g5['title'])) {
$header = $g5['title']; $header = $g5['title'];
@ -3302,9 +3304,10 @@ function get_call_func_cache($func, $args=array()){
} }
// include 하는 경로에 data file 경로가 포함되어 있는지 체크합니다. // include 하는 경로에 data file 경로가 포함되어 있는지 체크합니다.
function is_include_path_check($path='') function is_include_path_check($path='', $is_input='')
{ {
if( $path ){ if( $path ){
if ($is_input){
try { try {
// whether $path is unix or not // whether $path is unix or not
$unipath = strlen($path)==0 || $path{0}!='/'; $unipath = strlen($path)==0 || $path{0}!='/';
@ -3346,6 +3349,13 @@ function is_include_path_check($path='')
} }
} }
$extension = pathinfo($path, PATHINFO_EXTENSION);
if($extension && preg_match('/(jpg|jpeg|png|gif|bmp|conf)$/', $extension)) {
return false;
}
}
return true; return true;
} }
?> ?>