본문 바로가기
Web/Hacking

XSS | 필터링 우회 | 보안 방법

by 09337 2021. 8. 9.

XSS 이란?

  웹 사이트 관리자가 아닌 사용자가 웹 페이지에 악성 스크립트를 삽입함으로써 개발자가 고려하지 않은 기능이 작동하여 발생하는 취약점이다. 클라이언트를 대상으로 사용자 세션을 가로채거나, 홈페이지 변조, 악의적인 사이트 이동 등의 공격을 수행할 수 있다.

 


종류는 Dom Based XSS, Stored XSS, Reflected XSS로 나뉜다.

 

Stored XSS

  저장형 XSS이다. 웹 서버에 스크립트를 저장하여 데이터베이스에 기록된다.

  공격자가 미리 XSS 공격에 취약한 웹 사이트를 탐색하고 XSS 공격을 위한 스크립트를 포함한 게시글을 업로드함으로써 발생한다. 게시글의 URL을 클라이언트에게 노출하고 클라이언트가 게시글을 확인함으로써 URL에 대한 요청을 서버에 전송하게 된다. 웹 서버에서 스크립트를 포함한 Response를 전송하며 공격이 수행된다.

  일반적으로 가장 많이 발생하는 XSS 종류이다.

 

Reflected XSS

  반사형 XSS이다. 웹 어플리케이션의 파라미터를 통해 발생하는 취약점을 이용한다. 서버가 외부에서 입력 값을 받아 브라우저에게 응답할 때, 파라미터에 삽입된 스크립트를 클라이언트에게 그대로 전달한다.

  공격자가 미리 XSS 공격에 취약한 웹 사이트를 탐색하고 XSS 공격을 위한 스크립트를 포함한 URL을 클라이언트에게 노출시킨다. 사용자가 URL을 클릭할 경우, 취약한 웹 사이트의 서버에 스크립트가 포함된 URL을 전송하고, 웹 서버에서는 해당 스크립트를 포함한 Response를 전송한다.


필터링 우회

  <script>alert(document.cookie)</script> 와 같은 스크립트를 통해 클라이언트의 세션 정보를 탈취할 수 있다.

  필터링이 걸려있는 경우, 일반적인 스크립트 구문은 동작하지 않는다.

 

1. <script> 문자가 필터링 되어있는 경우

<script> 사이에 <script>를 한 번 더 넣어 줌으로써 동작하게 한다.

 

ex) <scr<script>ipt>alert(document.cookie)</scr<script>ipt>

 

2. <script> 각 문자 알파벳이 필터링되어있는 경우

<script>를 대처하는 다른 스크립트 구문을 삽입한다.

 

ex) <img src=x onerror=alert(document.cookie)>

  <img> 태그에 오류가 있을 경우, alert(document.cookie)를 실행한다. 이미지 주소에 임의의 값을 줌으로써 오류가 나게 하고, 그로 인해 alert 함수가 동작하게 된다.

 

 

이 외에도 다양한 방법이 존재한다.


실습

1) 게시판에 스크립트 취약점이 존재한다는 것을 확인한 후, 사진과 같이 악성 스크립트를 입력하여 게시물을 작성했다.

 

2) 정상적으로 올라간 게시물을 클라이언트가 접속할 경우, 공격자가 작성한 스크립트 코드가 실행되어 클라이언트의 화면에 네이버가 리다이렉트 되어 출력되도록 했다.

 

영향도 시나리오

  취약점이 존재하는 부분에 악성 스크립트를 삽입한 후, 클라이언트가 해당 게시물을 열람했을 때 인증 정보 수집 서버에 Cookie 정보가 저장되며, 이를 이용하여 다른 사용자로 로그인 및 불법 접근이 가능해진다.


보안 방법

1. HTML character entity - htmlspecialchars()

HTML 엔티티: 마크업과 충돌을 막기 위해 만들어진 특수 코드이다.

XSS는 입력한 문자가 HTML 코드로 인식되어 발생하므로, HTML 엔티티를 사용하여 코드 인식을 방지한다.

 

ex) <script>alert(1)</script>&lt;script&gt;alert(1)&lt;&sol;script&gt;

문자 HTML 엔티티
< &lt;
> &gt;
/ &sol;

 

php에서는 위 기능을 수행하는 htmlspecialchars() 함수를 사용할 수 있다.

기존코드
함수 적용 코드

 

동일 스크립트 코드를 각각 subject와 content에 넣었을 때

subject

 

content

 

개발자 모드

개발자 모드로 확인해보면 subject는 문자열로, content는 태그로 인식되는 것을 확인할 수 있다.

 

2. strip_tags()

strip_tags() 함수는 문자열에서 HTML 태그와 PHP 태그를 제거한다.

기존 코드
함수 적용 코드

 

함수를 적용한 코드에서 게시글을 작성한 후 확인해보면 아래와 같이 태그가 삭제되는 것을 확인할 수 있다.

글작성
글 확인

 

 

'Web > Hacking' 카테고리의 다른 글

불충분한 인가 (IN)  (1) 2022.12.11
파일 업로드 취약점 | 악성코드 배포 | 보안 방법  (0) 2021.08.09
CSRF | XSS와 CSRF 차이점 | 보안 방법  (0) 2021.08.09
Blind SQL Injection  (2) 2020.12.30
SQL Injection  (2) 2020.07.14

댓글