[4. XSS]

Minseok Jo·2025년 12월 27일

웹 시큐어코딩

목록 보기
4/11
post-thumbnail

웹취약점 점검에서 개발한 웹에 대하여 점검을 진행하였고, 여러 취약점들을 발견하였다.
발견한 취약점들을 대상으로 시큐어 코딩을 진행하고자 한다.

이번 대상은 주요정보통신기반시설 분석·평가 가이드 11번 항목 - 크로스사이트 스크립팅(XSS) 이다.

XSS 취약점이 발견된 항목은 다음과 같다.

URL파라미터메뉴
게시글 작성 Form URL :
http://jmseok.com/web/board/free_write.php
게시글 저장 URL :
http://jmseok.com/web/board/freewrite_proc.php

게시글 목록 URL :
http://jmseok.com/web/board/free_list.php
게시글 확인 URL :
http://jmseok.com/web/board/free_view.php
게시글 검색 목록 URL :
http://jmseok.com/web/board/free_search.php
input_title,
input_cont
자유 게시판 >
제목, 본문

URL파라미터메뉴
게시글 목록 URL :
http://jmseok.com/web/board/free_list.php
게시글 검색 목록 URL :
http://jmseok.com/web/board/free_search.php
input_search자유 게시판 >
게시글 검색

URL파라미터메뉴
게시글 작성 Form URL :
http://jmseok.com/web/board/mem_write.php
게시글 저장 URL :
http://jmseok.com/web/board/memwrite_proc.php

게시글 목록 URL :
http://jmseok.com/web/board/mem_list.php
게시글 확인 URL :
http://jmseok.com/web/board/mem_view.php
게시글 검색 목록 URL :
http://jmseok.com/web/board/mem_search.php
input_title,
input_cont
회원 게시판 >
제목, 본문

URL파라미터메뉴
게시글 목록 URL :
http://jmseok.com/web/board/mem_list.php
게시글 검색 목록 URL :
http://jmseok.com/web/board/mem_search.php
input_search회원 게시판 >
게시글 검색

URL파라미터메뉴
댓글 작성 Form URL :
http://jmseok.com/web/board/mem_view.php
댓글 저장 URL :
http://jmseok.com/web/board/comment_proc.php
댓글 확인 URL :
http://jmseok.com/web/board/mem_view.php
input_cmt회원 게시판 >
댓글 작성


0. XSS 대응방안

[HTML Entity]
사용자 입력값을 화면에 출력할 때 < > " ' & 등의 HTML 특수문자를 HTML 엔티티로 변환한다.

[허용 목록 기반 필터링]
HTML 입력이 필요한 경우, 허용된 태그와 속성을 식별하여 허용하는 방식으로 처리


1. 시큐어 코딩

[1. 자유게시판 - 게시글 목록 페이지]

(기존)

// free_list.php
echo "<td>{$row['title']}</td>";

(수정 후)

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
echo "<td>{$row['title']}</td>";

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 DB에 저장된 게시글 제목을 그대로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하면, DB에 저장된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력된다.

  • DB에 <script>alert(1)</script> 처럼 HTML 특수문자가 저장되어 있어도, 브라우저에는 &lt;script&gt;alert(1)&lt;/script&gt; 이런 식으로 전달된다.

  • 따라서 화면에는 <script>alert(1)</script> 처럼 글자로 보일 뿐, JavaScript는 실행되지 않는다.


[2. 자유게시판 - 게시글 확인 페이지]

(기존)

// free_view.php
$title = $row["title"];
$content = $row["content"];

(수정 후)

$title = htmlspecialchars($row["title"], ENT_QUOTES, 'UTF-8');
$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 DB에 저장된 게시글 제목과 본문을 그대로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, DB에 저장된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.


[3. 자유게시판 - 게시글 검색 페이지]

(기존)

// free_search.php
$pholder = $_GET["input_search"];

(수정 후)

$pholder = htmlspecialchars($_GET["input_search"], ENT_QUOTES, 'UTF-8');

$pholder = htmlspecialchars($_GET["input_search"], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 사용자가 입력한 검색어 내용을 그대로 placeholder 값으로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, 전달된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.



[4. 회원게시판 - 게시글 목록 페이지]

(기존)

// mem_list.php
echo "<td>{$row['title']}</td>";

(수정 후)

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
echo "<td>{$row['title']}</td>";

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 DB에 저장된 게시글 제목을 그대로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, DB에 저장된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.


[5. 회원게시판 - 게시글 확인 페이지]

(기존)

// mem_view.php
$title = $row["title"];
$content = $row["content"];

(수정 후)

$title = htmlspecialchars($row["title"], ENT_QUOTES, 'UTF-8');
$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');

$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 DB에 저장된 게시글 제목과 본문을 그대로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, DB에 저장된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.


[6. 회원게시판 - 게시글 검색 페이지]

(기존)

// mem_search.php
$pholder = $_GET["input_search"];

(수정 후)

$pholder = htmlspecialchars($_GET["input_search"], ENT_QUOTES, 'UTF-8');

$pholder = htmlspecialchars($_GET["input_search"], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 사용자가 입력한 검색어 내용을 그대로 placeholder 값으로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, 전달된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.



[7. 회원게시판 - 댓글 작성]

(기존)

// mem_view.php
echo "<div class='comment-text'>" . nl2br($row['content']) . "</div>";

(수정 후)

$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');
echo "<div class='comment-text'>" . nl2br($content) . "</div>";

$content = htmlspecialchars($row["content"], ENT_QUOTES, 'UTF-8');

  • 기존코드에서는 DB에 저장된 댓글 내용을 그대로 출력하였다 (XSS 발생 원인)

  • htmlspecialchars()를 적용하여, DB에 저장된 HTML 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.



2. 보안 조치 결과

XSS
▲ 게시글 및 댓글에 [<script>alert(1)</script>] 를 입력하여도, 스크립트가 실행되지 않고 문자 그대로 출력


0개의 댓글