KISA에서 취약점 권고사항이 올라온다. (KISA 취약점 권고사항)
당시 Stored XSS 취약점이 발생하여 코드를 수정한 것인데,
이때 패치된 코드를 분석 한 뒤 PoC를 작성해볼 것이다.
분석하기 앞서 홈페이지에 어디에서 취약점이 발생하는지 먼저 알아보았다.
// 추가질문에서는 제목을 공백으로
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파일이 동작하는것을 알 수 있다.
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가 발생한다.
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만 사용 가능)