Reflected XSS (재업)

작성자 newbiepwn 프로그램 한국CISSP협회 대표홈페이지

WEB 종료됨 중간 60,000 마지막 업데이트일: 2021년 6월 24일 (일 년 전) 작성일: 2021년 6월 24일

취약점 유형

Reflected XSS

상세내용

개요

/bbs/ajax.filter.php 에서 Reflected XSS가 발생합니다.

재현 과정

  1. munsiwoo.kr/cissp.html
  2. 위 URL로 접속하면 isc2chapter.kr 페이지에서 임의의 스크립트(alert('XSS'))가 실행됩니다.

image.png

예상되는 취약점 발생 원인

취약점이 발생하는 코드는 다음과 같습니다. (/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>

예시: munsiwoo.kr/cissp.html

타임라인

newbiepwn 님이 티켓을 제출했습니다. 2021년 6월 24일 (일 년 전)
CISSP MANAGER 님이 상태를 '제출됨'에서 '처리중'으로 변경했습니다. 2021년 6월 24일 (일 년 전)
CISSP MANAGER 님이 댓글을 남겼습니다. 2021년 6월 24일 (일 년 전)

안녕하세요
제보 감사합니다.
해당 티켓 내용 확인하였습니다.
검토 후 추후 상황 알려드리도록 하겠습니다.

CISSP MANAGER 님이 댓글을 남겼습니다. 2021년 6월 24일 (일 년 전)

안녕하세요.
패치가 완료 되었습니다.
확인 부탁 드립니다.
감사합니다

newbiepwn 님이 댓글을 남겼습니다. 2021년 6월 24일 (일 년 전)

네 이상없는 것 같습니다.

CISSP MANAGER 님이 댓글을 남겼습니다. 2021년 6월 24일 (일 년 전)

앞으로도 저희 버그바운티 프로그램에 많은 관심 부탁 드립니다.
감사합니다.

CISSP MANAGER 님이 보상 60,000 크레딧을 지급했습니다. 2021년 6월 24일 (일 년 전)
CISSP MANAGER 님이 공개상태를 '비공개'에서 '전체공개'로 변경했습니다. 2021년 6월 24일 (일 년 전)
CISSP MANAGER 님이 상태를 '처리중'에서 '종료됨'으로 변경했습니다. 2021년 6월 24일 (일 년 전)