CSRF 제로보드의 보안책
관리자님 말씀대로 태그가 상당히 많기 때문에 일일이 하기엔 무리가 있습니다.
아래는 제로보드 패치인데, 제 생각에도 토큰이 가장 유력하지 않을까 합니다.
아래는 제로보드 패치인데, 제 생각에도 토큰이 가장 유력하지 않을까 합니다.
- /**
- * @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;
- }
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기
댓글 7개
접근할 수 있는 모든 페이지는 모두 공격 대상이 됩니다.
이미 여러 프로그램에서 확인한 사항이기도 합니다.
현재로서는 captcha 의 적용이 최선책으로 확인 되었습니다.
즉 사람이 개입 되어야 안전하다는 결론입니다.
어차피 중간에 패킷을 가로채는 것이니
그 것을 보안하기 위해 reCaptcha 가 나왔다고 하더군요.
먼저 캐차에 값을 입력하고 확인 버튼을 누르면,
시스템에 접속해서 임의로 다른 값을 가지고 오고,
그것을 입력해야 글쓰기가 가능하게 되니까요.
물론 비회원은 귀챦지만 그정도는 어쩔 수 없다고 봅니다.
관리자님. reCaptcha 스타일로 바꿔주세요~!!!
숫자를 넣고 확인 누르면 새로운 숫자가 나오고 그거로 인증하게요.