Blog
XE 보안 취약점 긴급 패치 배포합니다.
2008.09.02 12:19
INet Corp Security 연구소장이신 유동훈님(Xpl017Elz, x82)님께서 XE CSRF 보안 취약점 제보를 해주셨습니다.
CSRF 라는 공격 방법으로 XE 관리자 세션을 악용할 수 있게 하는 취약점입니다.
이 방법은 1.0.5 이전에 다른 분께 제보를 받아서 관리자 세션을 악용할 수 있는 것을 모두 막아 놓았는데 제가 미처 알지 못하는 방법으로 관리자 세션을 악용할 수 있는 취약점이 발견되었습니다.
func.inc.php.zip 파일을 다운받으시고 압축을 푸시면 func.inc.php 라는 파일이 나타납니다.
이 파일을 사용하시는 XE의 config 디렉토리에 있는 func.inc.php 파일위로 덮어쓰시면 패치는 완료됩니다.
다만 혹시 소스코드를 수정하셨거나 버전이 낮아서 문제가 있을 수 있으니 덮어쓰기 전에 config/func.inc.php 파일을 백업해 놓으세요.
그리고 다음과 같이 직접 수정하시면 됩니다.
config/func.inc.php 파일의 402번째줄부터 있는 removeHackTabk(), removeJsEvent(), removeSrcHack() 함수를 다음과 같은 코드로 바꾸시면 됩니다.
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 | /** * @brief iframe, script코드 제거 **/ function removeHackTag( $content ) { // iframe 제거 $content = preg_replace( "!<iframe(.*?)<\/iframe>!is" , '' , $content ); // script code 제거 $content = preg_replace( "!<script(.*?)<\/script>!is" , '' , $content ); // meta 태그 제거 $content = preg_replace( "!<meta(.*?)>!is" , '' , $content ); // style 태그 제거 $content = preg_replace( "!<style(.*?)<\/style>!is" , '' , $content ); // XSS 사용을 위한 이벤트 제거 $content = preg_replace_callback( "!<([a-z]+)(.*?)>!is" , removeJSEvent, $content ); /** * 이미지나 동영상등의 태그에서 src에 관리자 세션을 악용하는 코드를 제거 * - 취약점 제보 : 김상원님 **/ $content = preg_replace_callback( "!<([a-z]+)(.*?)>!is" , removeSrcHack, $content ); return $content ; } function removeJSEvent( $matches ) { $tag = strtolower ( $matches [1]); if (preg_match( '/(src|href)=("|\'?)javascript:/i' , $matches [2])) $matches [0] = preg_replace( '/(src|href)=("|\'?)javascript:/i' , '$1=$2_javascript:' , $matches [0]); return preg_replace( '/ on([a-z]+)=/i' , ' _on$1=' , $matches [0]); } function removeSrcHack( $matches ) { $tag = strtolower (trim( $matches [1])); $buff = trim(preg_replace( '/(\/>|>)/' , '/>' , $matches [0])); $buff = preg_replace_callback( '/([^=^"^ ]*)=([^ ^>]*)/i' , fixQuotation, $buff ); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser ->parse( $buff ); // src값에 module=admin이라는 값이 입력되어 있으면 이 값을 무효화 시킴 $src = $xml_doc ->{ $tag }->attrs->src; $dynsrc = $xml_doc ->{ $tag }->attrs->dynsrc; if (_isHackedSrc( $src ) || _isHackedSrc( $dynsrc ) ) return sprintf( "<%s>" , $tag ); return $matches [0]; } function _isHackedSrc( $src ) { if (! $src ) return false; if ( $src && preg_match( '/javascript:/i' , $src )) return true; if ( $src ) { $url_info = parse_url ( $src ); $query = $url_info [ 'query' ]; $queries = explode ( '&' , $query ); $cnt = count ( $queries ); for ( $i =0; $i < $cnt ; $i ++) { $pos = strpos ( $queries [ $i ], '=' ); if ( $pos === false) continue ; $key = strtolower (trim( substr ( $queries [ $i ], 0, $pos ))); $val = strtolower (trim( substr ( $queries [ $i ] , $pos +1))); if (( $key == 'module' && $val == 'admin' ) || $key == 'act' && preg_match( '/admin/i' , $val )) return true; } } return false; } |
아직 이 CSRF 공격방법을 이용한 취약점 공격 방법이 공개되지 않았기에 다소 시간적 여유는 있지만 최대한 빨리 패치하시기를 권해드립니다.
- [2019/03/18] 포럼 XE 레이아웃 제작 일주일 코스
- [2019/01/18] 묻고답하기 모바일에서 서 레이아웃 비정상 문의드려요
- [2018/12/31] 묻고답하기 슬라이드 위젯 삽입 후 메뉴가 안보이네요 고수님들 부탁드립니다 *6
- [2018/11/21] Blog [XE3] XE Store 사업설명회 행사 안내 - 2018년 12월 5일 *2
- [2018/03/28] 묻고답하기 $oMail->setSender Sender 이메일 발신자가 공백으로 나옵니다. *3
댓글 60
-
감사합니다.
-
프로소비
2008.09.12 14:37
고맙습니다~ 패치완료했습니다!! -
smico
2008.09.13 14:28
func.inc.php 파일위로 덮어쓴후 config/func.inc.php 파일의 402번째줄부터 있는 removeHackTabk(), removeJsEvent(), removeSrcHack() 함수를 다음과 같은 코드로 바꾸라고 하셨는데 서버상에 있는 func.inc.php 의 코드를 어떻게 하면 바꿀수 있습니까?
아니면 바꾼후에 덮어쓰기를 해야하는지.. 좀 가르쳐 주시면 감사하겠습니다. -
FreeLoop
2008.09.14 09:34
패치 감사합니다. -
단맹이
2008.09.16 23:49
완전...초보라서 그런데.. ( XE의 config 디렉토리에 있는 func.inc.php 파일위로 ) config 디렉토리가 어디있는...걸까요..;;?^^;; -
Zzini.net
2008.09.18 19:09
죠기 있답니다. ^-^ -
카라얀
2008.09.18 21:20
감사합니다. -
임과장
2008.09.20 11:18
감사합니당~~ -
bncPlan
2008.09.28 23:05
1.0.6으로 업그레이드하면
패치 안해도 되는거 맞겠지요?? -
ammaket
2009.03.15 00:39
func.inc.php를 덮어쓰기를 했는데 관자페이지에서 게시판생성과 페이지생성 창이 열리지않습니다
메뉴생성과 레이아웃생상 기타는 정상적으로 작동됩니다
버젼은 xe1.1.5 입니다