[Web Application-모의해킹] 크로스사이트 스크립팅(XSS) : 시큐어 코딩(사용자 입력 값 검증 로직 구현) #6-2

2024. 5. 4. 13:22Project/Web Application-모의해킹

 

시큐어 코딩 : 사용자 입력 값 검증 로직 구현

 

1) 개요

 

  Project:Web Site 웹 사이트 게시판에서 작성하는 게시글에서 발견된 크로스사이트 스크립팅(XSS) 취약점을 방지하기 위하여 대응 방안 중 하나인 사용자 입력 값 검증 로직을 구현하여 실제로 크로스사이트 스크립팅(XSS) 취약점을 방지할 수 있는지 확인한다.

 

 

2) 방법

 

  Project:Web Site 웹 사이트에서 게시판에서 작성하는 게시글 제목, 내용을 입력하는 사용자 입력 값에 스크립트를 삽입하여 클라이언트 웹 브라우저에서 게시판과 게시글 상세정보 페이지를 요청하면 스크립트가 작동하는 것을 확인할 수 있다. 이는 XSS 취약점 종류 중 Stored XSS에 해당하며 게시글 작성 혹은 수정 시 입력되는 제목, 내용 사용자 입력 값을 검증하는 로직을 구현하면 해결할 수 있다. 이때 사용자 입력 값에 포함되는 특정 문자들을 HTML Entity로 치환하여 DB에 저장하거나 혹은 사용자 입력 값을 출력하는 웹 페이지에서 바로 치환하는 방식이 존재하며 정리하면 다음과 같다.

 

  1. 사용자 입력 값에 포함된 특정 문자들을 HTML Entity로 치환하는 검증 로직을 구현하며 두 가지 방법이 존재한다.
  2. DB에 저장할 때 사용자 입력 값을 HTML Entity로 치환한다.
  3. 웹 페이지에 출력할 때 사용자 입력 값을 HTML Entity로 치환한다.

 

  또한 본 웹 사이트는 PHP를 사용하므로 PHP 함수 중 htmlspecialchars()를 사용하여 사용자 입력 값 검증 기능을 구현한다. htmlspecialchars() 함수는 인수로 입력된 문자열에 특정 문자가 포함되면 HTML Entity로 치환하는 기능을 가지며 특정 문자는 <, >, &, ", ' 가 해당된다.

 

 

3) 시큐어 코딩

 

[1] DB에 저장할 때 치환하는 경우

 

  본 웹 사이트에서 XSS 취약점이 발견된 위치는 게시글 제목과 내용의 사용자 입력 값이다. 이는 게시글 작성 혹은 수정을 처리하는 페이지에서 전달되는 제목과 내용 사용자 입력 값을 htmlspecialchars() 함수의 인수로 입력하여 검증하는 방향으로 진행을 할 예정이다.

 

/board_write_proc.php 코드

 

  게시글 작성을 처리하는 코드에서 제목과 내용의 사용자 입력 값을 전달받았을 때 htmlspecialchars() 함수의 인수로 입력받는다. 코드가 정상적으로 작동하는지 확인하기 위해 게시글을 작성하여 제목과 내용에 스크립트를 삽입한다.(게시글 수정을 처리하는 코드에서도 동일한 작업을 통해서 검증 가능하다.)

 

 

  게시판에 접속하여 글쓰기 버튼을 클릭한다.

 

 

  제목과 내용 입력 칸에 스크립트 코드를 입력하고 작성 버튼을 클릭한다.

 

 

  htmlspecialchars() 함수를 거친 사용자 입력 값들 내 특정 문자들이 HTML Entity로 치환되어 저장되는 것은 확인할 수 있다.

 

 

  게시판 페이지를 프록시툴로 확인해 본 결과 HTML 코드에서 특정 문자들이 HTML Entity로 변환된 것을 확인할 수 있다.

 

 

  게시글 내용도 정상적으로 치환됐는지 확인하기 위해 게시판에서 해당 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다. 마찬가지로 게시글 상세정보 페이지를 프록시툴로 확인해 본 결과 HTML 코드에서 특정 문자들이 HTML Entity로 변환된 것을 확인할 수 있다.

 

 

[2] 웹 페이지에 출력할 때 치환하는 경우

 

/board.php
/board_read.php

 

  게시판 페이지 코드와 게시글 상세정보 페이지에서 제목과 내용의 사용자 입력 값을 출력할 때 htmlspecialchars() 함수의 인수로 입력 받는다. 코드가 정상적으로 작동하는지 확인하기 위해 게시글을 작성하여 제목과 내용에 스크립트를 삽입한다.

 

 

  게시판 페이지에 접속하여 글쓰기 버튼을 클릭한다.

 

 

  제목과 내용 입력 칸에 스크립트 코드를 입력하고 작성 버튼을 클릭한다.

 

 

  DB에 저장될 때는 HTML Entity로 치환되지 않은 상태로 저장된 것을 확인할 수 있다.

 

 

  게시판 페이지를 프록시툴로 확인해 본 결과 HTML 코드에서 특정 문자들이 HTML Entity로 변환된 것을 확인할 수 있다.

 

 

  게시글 내용도 정상적으로 치환됐는지 확인하기 위해 게시판에서 해당 게시글의 제목을 클릭하여 게시글 상세정보 페이지에 접속한다. 마찬가지로 게시글 상세정보 페이지를 프록시툴로 확인해 본 결과 HTML 코드에서 특정 문자들이 HTML Entity로 변환된 것을 확인할 수 있다.