Reflected XSS (재업)

Writer newbiepwn Program 한국CISSP협회 대표홈페이지

WEB Resolved Medium 60,000 Created: Jun 24, 2021 (3 years ago) Last Updated: Jun 24, 2021 (3 years ago)

Weakness

Reflected XSS

Description

개요

/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

Timeline

newbiepwn submitted ticket. June 24, 2021 (3 years ago)
CISSP MANAGER changed the status from 'Submitted' to 'In Progress'. June 24, 2021 (3 years ago)
CISSP MANAGER posted a comment. June 24, 2021 (3 years ago)

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

CISSP MANAGER posted a comment. June 24, 2021 (3 years ago)

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

newbiepwn posted a comment. June 24, 2021 (3 years ago)

네 이상없는 것 같습니다.

CISSP MANAGER posted a comment. June 24, 2021 (3 years ago)

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

CISSP MANAGER rewarded 60,000 credit. June 24, 2021 (3 years ago)
CISSP MANAGER changed the disclosure from 'Closed' to 'Disclosed (Full)'. June 24, 2021 (3 years ago)
CISSP MANAGER changed the status from 'In Progress' to 'Resolved'. June 24, 2021 (3 years ago)