soo_replace_content.zip 를 다운 받으셔서 압축을 푸신 후 애드온으로 설치하시면 됩니다.

기능은 단순합니다.

 

기능1

/\<img[^>]+src\=[^>]+act=(disp|proc)[^>]+\>/im 구문이 <span class="misol_dummy"></span> 로 치환됩니다. 공백이 아닌 이유는 공백이 되면서 새로운 CSRF 코드가 완성될 수도 있기 때문입니다.

 

기능2

알려진 브라우저 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[^>]+src\=[^>]+act=(disp|proc)[^>]+\>/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=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
첨부
TAG •
  • ?
    // Stop if non-logged-in user is 는 잘못 들어간 주석..
  • ? profile
    비슷한 예로.. iframe을 이용한 공격도 가능할 수 잇지 않을까요?
  • profile ?
    일단 아이프레임은 어느 정도 거르는 것 같아서 괜찮을거라 생각했어요 @_@
  • profile
    애드온까지 ㅎㄷㄷ
  • profile ?
    소스 수정은 아무래도 거부감이 있는 분들이 계실거 같아서요. @_@
  • ?
    와.. 감사합니다!
  • ?
    결자해지^^
  • ? ?
    도움이 되셨길 ㅎㅎ
  • profile

    고생하셨습니다. :p

     

    이제 좀 쉬세요~ ㅎㅎ

  • profile ?
    ㅠㅠ
  • profile

    style태그를 통한 background:url()의 경우는 어떨까요? (리무브핵으로 막히나..)

     

     

    아무튼 고생하셨습니다.

     

    절대 잘못하신 거 없으시니, 마음 무겁게 가지지 마세요..ㅎㅎ 미솔님꼐서 일으킨 문제라뇨..

     

    당치도 않습니다! XE 문제인거죠!!

  • profile ?
    style 자체가 일반 회원 글에선 걸러지는 것 같습니다 ㅎㅎ
  • ? profile
    전부다 막아지지는 않는 것 같더라구용..! 왜냐면 제가 몇번 수동으로 써봤기 때문에..(공홈이라던가..)
  • profile ?
    예시 코드를 주시면 막아드립니다. ㅎㅎ
  • profile
    오히려 문제를 제보해주셔서 막은건데요 ㅎㅎ
  • profile
    호완성을 위해서 이 방법도 좋아요.
  • profile
    https://xetown.com/xepoint/23414

    이 애드온을 적용한다면 이 모듈은 사용할 수 없겠네요...;;
  • profile ?
    흐억... Referer 조건도 넣어줘야겠군요 @_@
    타사이트에서 실행은 XE 기본 CSRF 필터에 걸리겠죠?... 시간이 없어서 거기까진 ㅠㅠ
  • profile profile
    혹시 펌추적모듈 사용하게 할 수 없을까요? 일단 보안때문에 애드온을 사용하게 되었는데요. 펌추적모듈이 마구잡이로 퍼가서 블로그 카페 여러곳에 자기글인냥 게시하는 사람들 잡아내는 유용한 모듈이라서요......
  • profile profile
    일단, 임시방편으로 애드온 윗 부분에 코드를 넣어주면 됩니다.

    if($this->act == 'copytrack' ) return;
  • profile profile
    감사합니다!
  • profile
    감사합니다 냉큼 적용합니다
  • profile ?
    넵 잘쓰세요!
  • ?

    에드온 받아서 설치했습니다.

    다운 받아 압축풀고 업로드하고 설정하니

    5분 정도 소요되었네요

     

    근데 이 5분을 위해 대체 몇시간을 고생하셨을지를 생각하면...

    그저 감사하단 말로는 너무 부족한 듯 하지만.

     

    그래도

    감사합니다!

    감사합니다!!

    감사합니다!!!

    감사합니다!!!!

    감사합니다!!!!!

     

  • ? ?
    오래 걸린건 아닌데 요새 컴퓨터 만질 시간이 잘 없어서요 ㅠㅎㅎ
  • ?
    찾으시느라 고생했어요 ㅋㅋ