CSRF 제로보드의 보안책 > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

CSRF 제로보드의 보안책 정보

CSRF 제로보드의 보안책

본문

관리자님 말씀대로 태그가 상당히 많기 때문에 일일이 하기엔 무리가 있습니다.
아래는 제로보드 패치인데, 제 생각에도 토큰이 가장 유력하지 않을까 합니다.

  1.     /**  
  2.      * @brief iframe, script코드 제거  
  3.      **/  
  4.     function removeHackTag($content) {   
  5.         // iframe 제거   
  6.         $content = preg_replace("!<iframe(.*?)<\/iframe>!is"''$content);   
  7.   
  8.         // script code 제거   
  9.         $content = preg_replace("!<script(.*?)<\/script>!is"''$content);   
  10.   
  11.         // meta 태그 제거   
  12.         $content = preg_replace("!<meta(.*?)>!is"''$content);   
  13.   
  14.         // style 태그 제거   
  15.         $content = preg_replace("!<style(.*?)<\/style>!is"''$content);   
  16.   
  17.         // XSS 사용을 위한 이벤트 제거   
  18.         $content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeJSEvent, $content);   
  19.   
  20.         /**  
  21.          * 이미지나 동영상등의 태그에서 src에 관리자 세션을 악용하는 코드를 제거  
  22.          * - 취약점 제보 : 김상원님  
  23.          **/  
  24.         $content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeSrcHack, $content);   
  25.   
  26.         return $content;   
  27.     }   
  28.   
  29.     function removeJSEvent($matches) {   
  30.         $tag = strtolower($matches[1]);   
  31.         if(preg_match('/(src|href)=("|\'?)javascript:/i',$matches[2])) $matches[0] = preg_replace('/(src|href)=("|\'?)javascript:/i','$1=$2_javascript:'$matches[0]);   
  32.         return preg_replace('/ on([a-z]+)=/i',' _on$1=',$matches[0]);   
  33.     }   
  34.   
  35.     function removeSrcHack($matches) {   
  36.         $tag = strtolower(trim($matches[1]));   
  37.   
  38.         $buff = trim(preg_replace('/(\/>|>)/','/>',$matches[0]));   
  39.         $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff);   
  40.   
  41.         $oXmlParser = new XmlParser();   
  42.         $xml_doc = $oXmlParser->parse($buff);   
  43.   
  44.         // src값에 module=admin이라는 값이 입력되어 있으면 이 값을 무효화 시킴   
  45.         $src = $xml_doc->{$tag}->attrs->src;   
  46.         $dynsrc = $xml_doc->{$tag}->attrs->dynsrc;   
  47.         if(_isHackedSrc($src) || _isHackedSrc($dynsrc) ) return sprintf("<%s>",$tag);   
  48.   
  49.         return $matches[0];   
  50.     }   
  51.   
  52.     function _isHackedSrc($src) {   
  53.         if(!$srcreturn false;   
  54.         if($src && preg_match('/javascript:/i',$src)) return true;   
  55.         if($src) {   
  56.             $url_info = parse_url($src);   
  57.             $query = $url_info['query'];   
  58.             $queries = explode('&'$query);   
  59.             $cnt = count($queries);   
  60.             for($i=0;$i<$cnt;$i++) {   
  61.                 $pos = strpos($queries[$i],'=');   
  62.                 if($pos === falsecontinue;   
  63.                 $key = strtolower(trim(substr($queries[$i], 0, $pos)));   
  64.                 $val = strtolower(trim(substr($queries[$i] ,$pos+1)));   
  65.                 if(($key == 'module' && $val == 'admin') || $key == 'act' && preg_match('/admin/i',$val)) return true;   
  66.             }   
  67.         }   
  68.         return false;   
  69.     }  

댓글 전체

공지에도 알려드렸듯이 토큰은 무용지물 입니다.

접근할 수 있는 모든 페이지는 모두 공격 대상이 됩니다.

이미 여러 프로그램에서 확인한 사항이기도 합니다.

현재로서는 captcha 의 적용이 최선책으로 확인 되었습니다.

즉 사람이 개입 되어야 안전하다는 결론입니다.
저번 뉴스보니까 구글(captcha)도 뚫렸다고 하더군요.
어차피 중간에 패킷을 가로채는 것이니
그 것을 보안하기 위해 reCaptcha 가 나왔다고 하더군요.
비회원의 경우엔 reCaptcha로만 바꿔도 꽤 효과가 클 것 같아요.

먼저 캐차에 값을 입력하고 확인 버튼을 누르면,
시스템에 접속해서 임의로 다른 값을 가지고 오고,
그것을 입력해야 글쓰기가 가능하게 되니까요.

물론 비회원은 귀챦지만 그정도는 어쩔 수 없다고 봅니다.

관리자님. reCaptcha 스타일로 바꿔주세요~!!!

숫자를 넣고 확인 누르면 새로운 숫자가 나오고 그거로 인증하게요.
전체 135,051
십년전오늘 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT