diff --git a/config/func.inc.php b/config/func.inc.php index 1c0f86e64..5b56ad051 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -628,14 +628,32 @@ * 이미지나 동영상등의 태그에서 src에 관리자 세션을 악용하는 코드를 제거 * - 취약점 제보 : 김상원님 **/ - $content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeSrcHack, $content); + $content = preg_replace_callback("!<(/?)([a-z]+)(.*?)>!is", removeSrcHack, $content); + + // xmp tag 확인 및 추가 + $content = checkXmpTag($content); return $content; } + /** + * @brief xmp tag 확인 및 닫히지 않은 경우 추가 + **/ + function checkXmpTag($content) { + if(($start_xmp = strrpos($content, '')) !==false) { + if(($close_xmp = strrpos($content, '')) === false) $content .= ''; + else if($close_xmp < $start_xmp) $content .= ''; + } + + return $content; + } function removeSrcHack($matches) { - $tag = strtolower(trim($matches[1])); + $tag = strtolower(trim($matches[2])); + + // xmp tag 정리 + if($tag=='xmp') return '<'.$matches[1].'xmp>'; + if($matches[1]=='/') return $matches[0]; //$buff = trim(preg_replace('/(\/>|>)/','/>',$matches[0])); $buff = $matches[0]; @@ -647,13 +665,13 @@ if(!$xml_doc) return sprintf("<%s>", $tag); // src값에 module=admin이라는 값이 입력되어 있으면 이 값을 무효화 시킴 - $src = $xml_doc->{$tag}->attrs->src; - $dynsrc = $xml_doc->{$tag}->attrs->dynsrc; - $lowsrc = $xml_doc->{$tag}->attrs->lowsrc; - $href = $xml_doc->{$tag}->attrs->href; - $data = $xml_doc->{$tag}->attrs->data; - $background = $xml_doc->{$tag}->attrs->background; - $style = $xml_doc->{$tag}->attrs->style; + $src = $xml_doc->attrs->src; + $dynsrc = $xml_doc->attrs->dynsrc; + $lowsrc = $xml_doc->attrs->lowsrc; + $href = $xml_doc->attrs->href; + $data = $xml_doc->attrs->data; + $background = $xml_doc->attrs->background; + $style = $xml_doc->attrs->style; if($style) { $url = preg_match_all('/url\s*\(([^\)]+)\)/is', $style, $matches2); if(count($matches2[0])) @@ -666,6 +684,9 @@ } if(_isHackedSrc($src) || _isHackedSrc($dynsrc) || _isHackedSrc($lowsrc) || _isHackedSrc($href) || _isHackedSrc($data) || _isHackedSrc($background) || _isHackedSrcExp($style)) return sprintf("<%s>",$tag); + if($tag=='param' && $xml_doc->attrs->value && preg_match('/^javascript:/i',$xml_doc->attrs->value)) return sprintf("<%s>",$tag); + if($tag=='object' && $xml_doc->attrs->data && preg_match('/^javascript:/i',$xml_doc->attrs->data)) return sprintf("<%s>",$tag); + return $buff; } @@ -722,7 +743,7 @@ // attribute on* remove if(preg_match('/^on(click|load|unload|blur|dbclick|focus|resize|keypress|keyup|keydown|mouseover|mouseout|mouseup|select|change|error)/',preg_replace('/[^a-zA-Z_]/','',$key))) return ''; - + $output = sprintf('%s=%s', $key, $val); return $output;