개요

<img>, <image>, <source>, <object>, <embed> 태그의 src 또는 href 속성을 이용한 CSRF 가 가능하다는 것을 알게 되었습니다.

최근 알게된 이 문제에 대해서 방어하는 애드온입니다. 조만간 XE Core 공식 업데이트가 있을 것이라 예상하지만, 그 사이에 있을 수 있는 공격을 예방합니다.

기능

  • 글 작성시 문제가 될 수 있는 <img> 요소를 무의미한 <span> 요소로 치환합니다.
  • 이미 작성된 CSRF 공격 글에 대해 IE, FireFox, Chrome 브라우저의 HTTP ACCEPT 헤더 정보를 이용해 최대한 방어합니다.

사용권

이 프로그램의 사용권은 MIT 라이선스를 따릅니다.

애드온 코드 정보

다음은 이 애드온의 핵심 코드입니다. 참고할 수 있도록 게시글에 포함합니다.

<?php
/**
 * @file soo_replace_content.addon.php
 * @author MinSoo Kim <[email protected]>
 * @brief Replace image tag CSRF text.
 */
// Stop if non-logged-in user is
if(!defined('__XE__')) exit();

/**
 * Replace content
 * */
if(($this->act === 'procBoardInsertDocument' || $this->act === 'procBoardInsertComment' || $this->act === 'procTextyleInsertComment') && $called_position == 'before_module_init' && is_string(Context::get('content')))
{
    $board_content = '';
    $board_content = strval(Context::get('content'));
    $board_content = preg_replace("/\<(img|image|source|object|embed)[^>]+(src|href|data)\=[^>]+act\=(disp|proc)[^>]+\>([^<]*?\<\/(image|source|object|embed)\>)?/im", '<span class="misol_dummy"></span>', $board_content);
    Context::set('content', $board_content);
}

/**
 * if XE is requested... with img tag close.
**/
if((stripos($this->act, 'proc') !== FALSE || stripos($this->act, 'disp') !== FALSE) && $called_position == 'before_module_init')
{
    $http_img_accept_headers = array(
        'image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5', // InternetExplorer IMG
        'image/png,image/svg+xml,image/jxr,image/*;q=0.8,*/*;q=0.5', // InternetExplorer 11, MS Edge IMG
        'image/png,image/*;q=0.8,*/*;q=0.5', // FireFox IMG
        'image/webp,*/*;q=0.8', //Chrome IMG
        'image/webp,image/*,*/*;q=0.8', //Chrome IMG

        'audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6;*/*;q=0.5', // FireFox VIDEO
        'video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5', //FireFox AUDIO
        'video/webm,video/ogg,video/*;q=0.9,application/ogg=0.7,audio/*;q=0.6;*/*;q=0.5' //FireFox AUDIO
    );

    if(in_array(str_replace(array(' ','    '),array('',''),$_SERVER['HTTP_ACCEPT']), $http_img_accept_headers))
    {
        Context::close();
        exit();
    }
}
?>

 

Atachment
첨부
  • profile
    업데이트 내용이 뭔지 궁금하네요.
  • profile ?
    코드가 필요할 것 같아서 본문을 수정했습니다. <img> 태그 이외의 몇몇 의심 태그도 방어합니다.
  • profile ?
    img태그 이외의 다른 태그도 추가하신 것 같아요
  • ?
    감사합니다^^
  • ? ?
    감사합니다!
  • ?
    궁금증!! 지금 XE 포럼에 올라온 자료로는 나머지 취약점도 있다는 말씀이라

    요고 town 에 올린 버전으로 적용해야 완벽히 대응이 되는 것인가요..?
  • ? ?
    네 XE 포럼에 올린 것 보다 몇가지 경우에 더 대응하는 버전입니다. 포럼에 올린건 0.1 버전이에요.
    시간이 없어서 미처 XE 포럼엔 못 올렸습니다.
  • ?
    여러모로 감사드립니다 ^^
  • ? ?
    잘 써주세요!
  • profile
    =b<br /><br /><br />
    페이팔로 바꿔주세요. 그럼 후원하겠습니다. ^^<br /><br />
    추가.2015/10/16 22;13<br />
    후원했습니다. 맛난거 사드셔요~ ^0^

    @CONORY 님

    글을 수정하면 할 수록 위처럼 됩니다.
  • profile profile
    네. 수정하겠습니다
  • profile ?
    감사합니다!!!!
    알림이 안와서 댓글 새로 다신지 몰랐어요
  • ?
    @라자루스 님 후원 감사합니다!
  • ?
    @황비 님 후원 감사합니다.
  • ? ?
    후원금이 작아서 민망합니다.
    그냥 커피나 한잔 하세요.
    자료 감사합니다.
  • ? ?
    작다고 생각하지 않습니다 :)
    하시는 일 다 잘 되시길 빕니다!
  • ? ?
    감사합니다. @misol님.
    미솔님은 제가 볼때
    앞으로 스티브 잡스처럼 사랑받으면서도 오래 건강하게 살고.
    빌 게이츠 처럼 돈도 많이 벌면서도
    리누스 토르발스 처럼 존경받는 개발자가 되어
    언젠가는 BDFL(Benevolent Dictator for Life)에 까지 오르게 될 거에요
    그렇게 되길 기도합니다! ^^
  • ?
    평점 선택방법을 찾다가 이제서야 평점 답니다.
    최고!