Reflected XSS (재업)

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

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

취약점 유형

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일 (4년 전)
CISSP MANAGER 님이 상태를 '제출됨'에서 '처리중'으로 변경했습니다. 2021년 6월 24일 (4년 전)
CISSP MANAGER 님이 댓글을 남겼습니다. 2021년 6월 24일 (4년 전)

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

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

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

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

네 이상없는 것 같습니다.

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

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

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