power-girl0-0

반사된 XSS( Reflected Cross-Site Scripting ) 본문

웹해킹/Bee-Box

반사된 XSS( Reflected Cross-Site Scripting )

power-girl0-0 2020. 12. 27. 14:45
728x90

비박스 환경을 활용한 웹 모의해킹 완벽 실습 책의 내용을 포함하고 있습니다.

스스로 공부하고 정리하기 위한 목적으로 올리는 것입니다.


1-1. 반사된 XSS란?
웹 페이지 URL에 존재하는 파라미터에 악의적인 스크립트 코드를 입력하여 사용자가 URL을 클릭하면 입력해둔 악성 스크리트 코드가 실행되는 공격이다. 
해당 공격은 스크립트가 포함된 URL을 메일로 전송하거나 게시물로 등록하여 클릭을 유도한다.
2-1. GET

1. 취약한 사이트를 선택한다.

그림 1-1. 취약한 사이트 선택
그림 1-2. 취약한 사이트

2. 간단한 스크립트를 입력하여 취약한 사이트인지 확인한다.

<script>alert('Succeed');</script>

 

그림 1-3. 스크립트 입력

First name 입력란에 스크립트를 입력하고 Last name입력란에는 아무 값이나 입력하였다.

그림 1-4. 스크립트 실행

실행 결과, 스크립트가 실행되어 [그림 1-4]와 같이 Succeed 메시지가 경고창으로 출력되는 것을 확인할 수 있다.

따라서 해당 페이지가 취약한 사이트임을 알 수 있다.

그림 1-5. last name 출력

First name에는 스크립트 코드를 입력하였기 때문에 [그림 1-5]와 같이 Last name에 입력한 값만 출력한다.

 

3. 대응방안

htmlspecialchars 함수를 호출하여 입력 데이터를 UTF-8로 인코딩한다.
htmlspecialchars 함수는 두번째 인자에 ENT_QUOTES를 추가하여 XSS에 사용되는 특수 문자들을 HTML 엔티티 코드로 변환하기 때문에 스크립트 코드를 입력하여도 웹 브라우저에서는 문자로 인식한다.
해당 함수가 우회하는 특수문자는 &, ", ', <, >이다.

 

그림 1-6. 대응방안

2-2. POST

※ 해당 POST에서는 medium단계에서 실습되었다.

1. 취약한 사이트를 선택한다.

 

그림 2-1. 취약한 사이트 선택
그림 2-2. 취약한 사이트

2. addslashes함수 우회하기

간단한 스크립트 코드를 넣어서 실행해본다.

<script>alert('Succeed');</script>

그림 2-3. Last name만 출력

실행결과, 스크립트문은 실행되지 않고 Last name에 입력한 문자만 출력되는 것을 볼 수 있다.

스크립트가 실행하지 않는 경우 XSS에 사용하는 특수 문자를 우회할 가능성이 있다는 것을 추측할 수 있다.

 

그렇다면, 쿠키값을 출력하는 스크립트 코드를 입력하여 확인해보도록 하겠다.

<script>alert(document.cookie);</script>

그림 2-4. 사용자 쿠키값 출력

확인 결과, 스크립트 코드가 실행되어 쿠키값이 출력되는 것을 볼 수 있다.

 

문자열 출력 스크립트 코드에는 작은따옴표가 있지만 쿠키값 출력 코드에는 작은 따옴표가 없는 차이점을 확인할 수 있다. 따라서. 해당 페이지에서는 작은 따옴표를 우회하는 함수를 사용한다.

 

그렇다면, 작은 따옴표를 우회한다면 실행이 가능하는지 확인해보았다.

자바 스크립트 내장 함수인 String.fromCharCode 함수를 사용하여, 인자로 받은 아스키코드나 유니코드를 문자열로 반환하였다.

<script>alert(String.fromCharCode(83,117,99,99,101,101,100,33 ))</script>

그림 2-5 String.fromCharCode 함수 사용 결과

스크립트 코드가 실행되어 String.fromCharCode함수에 인자로 들어간 아스키코드를 문자열로 출력한다.

 

※ 해당 POST페이지는 입력란이 있어서 버프스위트를 사용하지 않아도 스크립트 코드 입력이 가능하지만, 변수가 드러나지 않는 POST메소드를 사용하려면 버프스위트를 사용하여 변수에 입력하면 된다.

 

난이도 medium단계에 대한 소스를 분석해보았다.

그림 2-6. xss_post.php소스

소스를 확인해보니 xss_check_4함수를 사용하여 입력 데이터를 우회한다.

함수 확인을 위해 함수가 정의된 functions_external.php소스를 확인해보았다.

그림 2-7. xss_check_4함수

확인 결과, addslashes함수를 호출한다.

addslashes함수는 ', ", \, NULL 문자 앞에 슬래시를 추가하는 함수로 문자를 포함하지 않는 스크립트 코드가 실행되는 문제점이 있다.

 

3. 대응방안

htmlspecialchars함수를 이용하여 우회한다.

(해당 함수에 대한 설명은 get방식과 같다.

 

보안상 XSS는 웹 페이지의 어느 곳에서든 취약점이 발생하므로 허용한 소스 코드 외에는 html엔티티코드로 변환하여 웹 브라우저가 악의적인 소스 코드를 해석해지 못하게 방어해야 한다.

하지만, 보안이 너무 강화되면 제공 서비스가 한정될 수 있기 때문에 현업 개발 기획자들과 충분히 의논하고 결정해야한다.

728x90
Comments