[보안] CSRF 결함으로 인한 글, 메모 관련 문제 (임시방편) > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

[보안] CSRF 결함으로 인한 글, 메모 관련 문제 (임시방편) 정보

[보안] CSRF 결함으로 인한 글, 메모 관련 문제 (임시방편)

본문

http://sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=331827
에서 언급했던 것처럼 관리자님께 먼저 연락드리려고 했으나,
우선 팁란에 올립니다.

취약점 내용 :

이 글은 그누보드 전반에 대한 보안 결함이 아닌
delete.php delete_commnet.php 파일에 대한 패치 내용만 다루겠습니다.
전반적인 내용은 아래 추가하겠습니다.

현재 delete파일과 delet_commnet파일 memo_delete파일, memo_form_update파일이 확인되었습니다.
모두 common.php파일에서 extract로 전역변수화된 wr_id, bo_table 등의 그누보드 변수들을
get방식으로 받아 일어나게 됩니다.

현재 그누보드를 사용하고 html를 적용되는 모든 게시판에서 실행가능한 코드입니다.
내용 지웁니다. (잠시 게재하는 거지만 악의적인 사용이 있을것 같네요.)
어쨌든 간단한 코드만 작성후, 그 게시판에 관리권한자가 그 글을 확인시, 코드에 삽입된 번호의  글이나 코멘트가 지울 수 있습니다.
이와 같은 방법으로 memo를 보내거나(스팸메모가 가능합니다.), memo를 지울 수 있습니다.
그외에 여러 DB관련 파일도 가능할 것으로 보입니다만 다 찾아보진 않았습니다.
어제 링크 글처럼 이야기후, 위 내용을 제가 다니는 커뮤니티 2곳에서 쉽게 검색하여 방법을 확인할 수 있었습니다. 누구나 쉽게 접하고 있다는 이야기지요.

보안패치내용:

1. 위에 언급된 delete, delete_commnet파일의 변수들을 post값으로 받는다.
2. memo모듈에서 사용되는 변수는 현재 get방식을 취함으로 post방식으로 받을수 없기 때문에 memo모듈에서 데이타변수로 가는 값들은 form 전송을 하게끔 프로그래밍한다.
3. delete관련 버튼을 포스트로 보내게 조치한다. (스킨이나 view파일 수정)

delete.php 파일, 2쨰줄(_common파일 인크루드 후 바로)
아래 내용을 추가합니다.

-------------------------------------------------------------------------
// CSRF관련 결함으로 인한 $board, $write값 초기화 및 POST타입으로 받기
$board = "";
$write = "";
$board = array();
$write = array();

$wr_id = mysql_real_escape_string(trim($_POST['wr_id']));
$bo_table = mysql_real_escape_string(trim($_POST['bo_table']));

if (isset($bo_table)) {
    $board = sql_fetch(" select * from {$g4['board_table']} where bo_table = '$bo_table' ");
    if ($board['bo_table']) {
        $gr_id = $board['gr_id'];
        $write_table = $g4['write_prefix'] . $bo_table; // 게시판 테이블 전체이름
        //$comment_table = $g4['write_prefix'] . $bo_table . $g4['comment_suffix']; // 코멘트 테이블 전체이름
        if ($wr_id)
            $write = sql_fetch(" select * from $write_table where wr_id = '$wr_id' ");
    }
}

delete_comment.php 파일, 2쨰줄(_common파일 인크루드 후 바로)
아래 내용을 추가합니다.
-------------------------------------------------------------------------
$comment_id = mysql_real_escape_string(trim($_POST['$comment_id'])); // CSRF관련 결함으로 인한 $comment_id값 초기화

스킨 수정, view.php파일을 고치는게 맞으나, 이부분은 관리자님께서 조치를 취하셔야 할듯 합니다. - 게시판 스킨파일(view_skin.php, view_comment_skin.php) delete 관련 버튼 위치에 다음과 같이 수정합니다.
-------------------------------------------------------------------------
보통 이와같이 버튼이 링크 되어 있을 텐데
<? if ($delete_href) { ?> 내용 <? } ?>

여기서 내용이라는 부분에 아래와 같이
form을 적당한 위치에 삽입하여 해결합니다.
<form>
      <input type=hidden name=bo_table value="<?=$bo_table?>">
      <input type=hidden name=wr_id value="<?=$wr_id?>">
      <input type=hidden name=page value="<?=$page?>">
      <input type=hidden name=qstr value="<?=$qstr?>">
      <input type=image src='버튼경로' border='0' align='absmiddle'>
</form>

코멘트 부분은
<? if ($list[$i][is_del])  { ?> 내용 <? } ?>
이와 내용이라는 부분을 아래와 같이 바꿉니다.
<form>
      <input type=hidden name=bo_table value="<?=$bo_table?>">
      <input type=hidden name=comment_id value="<?=$comment_id?>">
      <input type=hidden name=cwin value="<?=$cwin?>">
      <input type=hidden name=page value="<?=$page?>">
      <input type=hidden name=qstr value="<?=$qstr?>">
      <input type=image src='<?=$board_skin_path?>/img/btn_delete.gif' border='0' align='absmiddle'>
</form>


덧붙임 :

1. CSRF는 다양한 방법으로 코드를 삽입하여 권한을 획득할 수 있습니다.
이를 막기 위해서는 저 글에서 언급한 것처럼,
기본적으로 html을 막고 일정 태그만 열어주거나
아예 html전체를 필터링 해야합니다. (현재 그누에도 그러한 함수가 있습니다. conv_content함수)
하지만, 그누의 함수는 preg_replace함수를 쓰기 때문에 많은 우회법이 존재합니다.
이와 관련하여 kisa에서 제공하는 캐슬이나 htmlfilter(http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=66070&sca=&sfl=wr_subject%7C%7Cwr_content&stx=csrf&sop=and)를 써 사용자의 입력을 막는 방법을 적용하면 상당히 많은 부분을 막아주리라 예상합니다.

2. 제일 처음 글에도 언급했듯이 그누보드에서 가장 문제가 되는 부분은,
@extract 입니다. 이에 대한 부분을 그누쪽에서 바꿀 수 없다면, 개개인들이
사용시에 보안을 요하는 홈페이지의 경우 extract를 비활성화하고
각 페이지별로 $_POST, $_GET, $_ENV, $_SESSION, $_COKIEE 등으로 정확한 변수타입으로 받아서 페이지를 작성하시길 권유드립니다.

추천
1

댓글 1개

전체 27 |RSS
그누4 팁자료실 내용 검색

회원로그인

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