Blog

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 공격방법을 이용한 취약점 공격 방법이 공개되지 않았기에 다소 시간적 여유는 있지만 최대한 빨리 패치하시기를 권해드립니다.

제목 최종 글 날짜
공지 XE1 신규 보안 취약점 신고 포상제 종료 안내   2019.10.23
공지 [중요!] Object 클래스의 이름 변경 안내(PHP 7.2 버전 호환성) [7] 2020.08.16 by 천재 2017.11.27
XE 보안 취약점 긴급 패치 배포합니다. [60] [2] file 2012.08.16 by vibram five fingers 2008.09.02
liveXE 구경해보세요. :) [57] [4] file 2012.08.16 by vibram five fingers 2008.07.31
주제발표 - 당신의 날개, 웹표준 [5] file 2012.08.16 by vibram five fingers 2008.07.28
주제발표 - Inside XE [8] file 2012.08.16 by vibram five fingers 2008.07.28
주제발표 - XE의 현재와 미래 [6] [1] file 2012.08.16 by vibram five fingers 2008.07.28
행사 주제 및 순서 소개 [2] file 2013.12.25 by vibram five fingers 2008.07.28
XE 오픈 소스 프로젝트 모임 결과 알림 [12] [1] 2012.08.16 by vibram five fingers 2008.07.27
참석해주신 분들 모두 감사했습니다. [8] 2012.08.16 by vibram shoes 2008.07.27
제 세션 사전 질문 받습니다 @_@ [4] 2012.08.16 by vibram five fingers 2008.07.04
[마감] 주차증 요청받습니다. [11] 2012.08.16 by vibram five fingers 2008.06.26
1차 모임 일자 및 장소 안내 [6] 2020.03.14 by vibram five fingers 2008.06.25
XE Opensource Project 1차 모임 [121] [5] file 2012.08.16 by vibram five fingers 2008.06.24
첫번째 모임에 대한 의견입니다. [8] 2012.08.16 by vibram five fingers 2008.06.24
zbXE 오픈 소스 프로젝트 관련 모임 - 일자/장소 추가 [40] file 2012.08.16 by vibram five fingers 2008.06.24
첫 모임 의견 주세요. [7] 2012.08.16 by vibram five fingers 2008.06.23
도메인포워딩 제공 서비스의 변경 공지 [21] [5] file 2012.08.16 by vibram five fingers 2008.06.23
제로보드4 라이센스 정책 변경 [145] [6] file 2012.08.16 by vibram five fingers 2008.03.18
zbXE 정식버전(코드 안정화) 1.0 배포합니다. [150] [2] file 2012.08.16 by vibram five fingers 2008.02.28
zbXE 스킨 제작 센터 Open합니다. [20] file 2020.03.14 by vibram five fingers 2008.02.27
zbXE 오픈 소스 프로젝트 소개 및 참여 [14] file 2012.08.16 by vibram five fingers 2008.02.21