Weakness
Reflected XSS
Description
개요
/bbs/ajax.filter.php
에서 Reflected XSS가 발생합니다.
재현 과정
- munsiwoo.kr/cissp.html
- 위 URL로 접속하면 isc2chapter.kr 페이지에서 임의의 스크립트(
alert('XSS')
)가 실행됩니다.
예상되는 취약점 발생 원인
취약점이 발생하는 코드는 다음과 같습니다. (/bbs/ajax.filter.php
)
<?php
include_once('./_common.php');
$subject = strip_tags($_POST['subject']);
$content = strip_tags($_POST['content']);
//$filter = explode(",", strtolower(trim($config['cf_filter'])));
// strtolower 에 의한 한글 변형으로 아래 코드로 대체 (곱슬최씨님이 알려 주셨습니다.)
$filter = explode(",", trim($config['cf_filter']));
for ($i=0; $i<count($filter); $i++) {
$str = $filter[$i];
// 제목 필터링 (찾으면 중지)
$subj = "";
$pos = stripos($subject, $str);
if ($pos !== false) {
$subj = $str;
break;
}
// 내용 필터링 (찾으면 중지)
$cont = "";
$pos = stripos($content, $str);
if ($pos !== false) {
$cont = $str;
break;
}
}
die("{\"subject\":\"$subj\",\"content\":\"$cont\"}");
?>
for문을 돌면서 $subj
와 $cont
를 빈 문자(“”)로 초기화 시켜주고 있지만
for문 안의 첫번째 if문(if ($pos !== false)
)을 만족한다면, $subj
에 $str
을 넣은 뒤 break
를 해줍니다.
따라서 아래의 $cont
를 초기화해주는 코드는 실행되지 않기에, $cont
에 원하는 값을 넣을 수 있으며
마지막 줄의 die
를 통해 $cont
를 페이지에 그대로 출력해주면서 XSS 취약점이 발생합니다.
패치 방법
$subj
와 $cont
를 미리 초기화 시켜줍니다.
<?php
include_once('./_common.php');
$subject = strip_tags($_POST['subject']);
$content = strip_tags($_POST['content']);
$subj = ""; // 패치코드
$cont = ""; // 패치코드
//$filter = explode(",", strtolower(trim($config['cf_filter'])));
// strtolower 에 의한 한글 변형으로 아래 코드로 대체 (곱슬최씨님이 알려 주셨습니다.)
$filter = explode(",", trim($config['cf_filter']));
for ($i=0; $i<count($filter); $i++) {
$str = $filter[$i];
// 제목 필터링 (찾으면 중지)
$pos = stripos($subject, $str);
if ($pos !== false) {
$subj = $str;
break;
}
// 내용 필터링 (찾으면 중지)
$pos = stripos($content, $str);
if ($pos !== false) {
$cont = $str;
break;
}
}
die("{\"subject\":\"$subj\",\"content\":\"$cont\"}");
?>
예상 결과 및 파급력
$subject
는 $_POST
로만 입력받기 때문에, 실제 공격을 한다고 가정했을 때는
아래와 같은 스크립트를 해커의 서버에 셋팅한 뒤, 페이지로 접속을 유도하여 공격할 수 있습니다.
<meta charset="utf-8">
<form action="https://isc2chapter.kr/bbs/ajax.filter.php" method="POST">
<input type="hidden" name="subject" value="18아">
<input type="hidden" name="cont" value="<svg onload=alert`XSS`>">
</form>
<script>document.forms[0].submit();</script>
안녕하세요
제보 감사합니다.
해당 티켓 내용 확인하였습니다.
검토 후 추후 상황 알려드리도록 하겠습니다.