[gnuboard5] 1일차 - KISA 취약점 권고사항 분석

blatter·2022년 9월 29일
0
post-thumbnail

Intro

KISA에서 취약점 권고사항이 올라온다. (KISA 취약점 권고사항)
당시 Stored XSS 취약점이 발생하여 코드를 수정한 것인데,
이때 패치된 코드를 분석 한 뒤 PoC를 작성해볼 것이다.


패치 확인

  • Git Graph를 이용해 패치된 파일을 확인

  • qawrite.php 파일의 82번째 줄의 코드가 변경된 것 확인


파일 확인

0x01 취약점이 발생하는 파일

분석하기 앞서 홈페이지에 어디에서 취약점이 발생하는지 먼저 알아보았다.

	// 추가질문에서는 제목을 공백으로
    if($w == 'r')
        $write['qa_subject'] = '';

    $content = '';
	if ($w == '') {
        $content = html_purifier($qaconfig['qa_insert_content']);
    } else if($w == 'r') {
        if($is_dhtml_editor)
            $content = '<div><br><br><br>====== 이전 답변내용 =======<br></div>';
        else
            $content = "\n\n\n\n====== 이전 답변내용 =======\n";

        $content .= get_text($write['qa_content'], 0);
    } else {
        //$content = get_text($write['qa_content'], 0);
        
        // KISA 취약점 권고사항 Stored XSS
        $content = get_text(html_purifier($write['qa_content']), 0);
    }
  • 취약점이 발생하는 qawrite.php 코드의 일부분이다.

  • 파일 이름과 코드와 주석들을 보았을 때 QnA에서 글쓰고 답변을 한 후
    추가 질문을 할때 php파일이 동작하는것을 알 수 있다.

0x02 코드 분석

    if($is_dhtml_editor)
        $content = '<div><br><br><br>====== 이전 답변내용 =======<br></div>';
    else
        $content = "\n\n\n\n====== 이전 답변내용 =======\n";

    $content .= get_text($write['qa_content'], 0);
  • 취약점이 발생하는 qawrite.php 코드의 일부분이다.

  • 위 코드를 보면 이전 답변 내용을 불러오는 코드이다.

  • 이때 Stored XSS가 발생하는데 이유는
    $content .= get_text($write['qa_content'], 0); 에서 $content 에 내용을 불러올 때
    검증을 거치지 않고 바로 데이터를 가져오기 때문이다.

  • 따라서 이전 답변 내용에 script가 존재하면 $write['qa_content'] 에서 XSS가 발생한다.

0x03 PoC

  • QnA 페이지 접속

  • XSS태그를 넣은 글 작성

<p>test</p>
<img src="XSS" onerror="alert('success')">
  • 답변 등록

  • 답변 등록 성공

  • 추가질문 작성 페이지 ( XSS 발생 )


보안 방법

  • 이전 질문 내용을 가져올 때 검증을 한번 거치는 것

패치 전

$content .= get_text($write['qa_content'], 0);

패치 후

$content .= get_text(html_purifier($write['qa_content']), 0);
  • 패치 전과 후를 비교하면 html_purifier라는 함수가 추가 되었다.

  • html_purifier : XSS 취약점을 필터링 하는 라이브러리
    (script, onmouseover등을 필터링 해서 안전한 속성, 이벤트, 태그만 허용하고 html_purifier에서 지정한 html만 사용 가능)


Reference

profile
보안 1일차였던것

0개의 댓글