
웹취약점 점검에서 개발한 웹에 대하여 점검을 진행하였고, 여러 취약점들을 발견하였다.
발견한 취약점들을 대상으로 시큐어 코딩을 진행하고자 한다.
이번 대상은 주요정보통신기반시설 분석·평가 가이드 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 | 회원 게시판 > 댓글 작성 |
[HTML Entity]
사용자 입력값을 화면에 출력할 때 < > " ' & 등의 HTML 특수문자를 HTML 엔티티로 변환한다.
[허용 목록 기반 필터링]
HTML 입력이 필요한 경우, 허용된 태그와 속성을 식별하여 허용하는 방식으로 처리
(기존)
// 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는 실행되지 않는다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
(기존)
// 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 특수문자가 브라우저에서 태그나 스크립트로 해석되지 않고, 문자 그대로 출력되도록 하였다.
| XSS |
|---|
![]() |
![]() |
| ▲ 게시글 및 댓글에 [<script>alert(1)</script>] 를 입력하여도, 스크립트가 실행되지 않고 문자 그대로 출력 |