power-girl0-0

저장된 XSS ( Stored Cross-site Scripting ) 본문

웹해킹/Bee-Box

저장된 XSS ( Stored Cross-site Scripting )

power-girl0-0 2020. 12. 23. 15:27
728x90

 

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

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


1-1. XSS란?
웹 사이트에서 입력 데이터가 적절한 값인지 검사하지 않고 웹 브라우저를 실행할 때 발생하는 취약점이다.
이 취약점은 서버에 전달되는 모든 변수 값에서 발생할 수 있으며, 공격자가 세션을 탈취하여 다른 사용자의 권한을 취득하거나 악성코드를 배포하기 위한 목적 또는 피싱하여 사용자의 중요한 정보를 획득하기 위한 목적으로 사용된다.

 

1-2. 저장된 XSS란?

그림 1-1. 저장된 xss

그림1 출처 : https://cafe.naver.com/kkw7564/20

악의적인 스크립트 코드가 웹에 입력되면서 데이터베이스에 저장된다.
불특정 다수의 사용자가 공격자의 게시물에 접근하면 지속적으로 악의적인 스크립트가 실행되기 때문에
위협 영향도가 높다.

 

2-1. Blog

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

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

 

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

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

그림 2-2. 스크립트 입력
그림 2-3. 스크립트 실행

[그림3]과 같이 입력한 스크립트가 실행되어 Succeed 문구의 경고창이 출력되며, 새로고침을 하여도 스크립트문이 실행되는 것을 확인할 수 있었다. 따라서, 해당 사이트는 저장된 XSS공격에 취약한 사이트인 것을 알 수 있다. 

그림 2-4. 테이블

텍스트 입력 공간에 스크립트 코드를 입력하였기 때문에 테이블은 비어있다.

 

3. 스크립트코드를 이용하여 사용자의 쿠키 값을 탈취한다.

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

 

그림 2-5. 쿠키 값 탈취를 위한 스크립트문 입력
그림 2-6. 사용자 쿠키 값 탈취

[그림 6]과 같이 사용자의 쿠키값을 경고창으로 출력할 수 있다.

저장된 XSS공격으로 스크립트 코드가 저장되어 있어서 다른 웹 브라우저로 해당 페이지에 접속해도 해당 사용자의 쿠키값을 출력할 수 있다.

 

4. 대응 방안

PHP 기본 제공 함수인 mysql_real_escape_string 함수를 사용하여 입력한 데이터를 우회한다.

mysql_real_escape_string 함수는 SQL 문법에서 사용되는 특수 문자들에 백슬래시를 붙여 입력 값을 SQL문법으로 인식되지 않게 방어하는데, 백슬래시 붙는 문자는 NULL, \n, \r, \, ' , ", ^Z이다.

 

 

2-2. Change Secret

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

그림 3-1. Change Secret 취약한 사이트

해당 페이지는 비밀번호 힌트를 새로 설정하는 기능을 제공한다.

 

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

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

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

 

스크립트 입력 후, 비밀번호 힌트를 확인할 수 있는 페이지(SQL인젝션의 Login Form 페이지)로 이동하여 확인한다.

해당 페이지에서 bee사용자로 로그인성공하면 스크립트가 실행되어 경고창이 출력된 것을 확인할 수 있다.

그림 3-3. 스크립트 실행결과

따라서, 해당 사이트는 저장된 XSS공격에 취약한 사이트인 것을 알 수 있다.

그림 3-4. 비밀번호 힌트

비밀번호 힌트에 스크립트 코드를 넣었기 때문에 비밀번호 힌트는 출력되지 않는다.

 

3. 취약한 사이트 소스분석

웹 개발자 도구를 활용하여 소스를 확인한다.

분석 결과, 해당 페이지는 사용자의 아이디가 웹 페이지 소스 코드에 노출되는 것을 알 수 있다.

그림 3-5. 소스분석

그렇다면 다른 사용자에게도 XSS공격이 가능한지 확인을 위해 임의로 do라는 사용자를 생성하였다.

그림 3-6. 임의의 사용자 생성

생성 후, 웹 개발자 도구를 활용하여 소스에 출력되는 사용자 아이디를 do로 변경한다.

그림 3-7. 임의의 사용자로 소스 변경

변경후, 비밀번호 힌트 입력란에 사용자의 쿠키값을 출력하는 스크립트 코드를 입력해보았다.

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

그림 3-8. 스크립트코드 입력

확인을 위해 비밀번호 힌트를 확인할 수 있는 페이지(SQL인젝션의 Login Form 페이지)로 이동하여 확인한다.

그림 3-9. do사용자로 로그인

해당 페이지에서 do사용자로 로그인했을시, 쿠키값이 출력되는 것을 확인할 수 있다.

그림 3-10. do 사용자의 쿠키값 탈취

따라서, 해당 사이트는 저장된 XSS공격에 취약한 사이트인 것을 알 수 있다.

 

4. 대응 방안

힌트 출력 페이지에서는 스크립트 코드가 실행되지 않고 문자열로 출력되도록 htmlspecialchars함수를 이용해야한다.

해당 함수를 호출하여 입력 데이터를 UTF-8로 인코딩한다. 또한, 두번째 인자에 ENT_QUOTES를 추가하여 XSS에 사용되는 특수 문자들을 HTML엔티티 코드로 변환하여 스크립트 코드를 입력해도 문자로 인식되게 한다.

htmlspecialchars함수에서 우회하는 특수 문자는 &, ", ', < ,> 이다.

그림 3-11. htmlspecialchars함수

비밀번호 변경할 수 있는 페이지에서는 MySQL의 데이터베이스에 저장되므로 secret 변수를 다시 우회해야한다.

따라서 mysql_real_escape_string함수로 NULL, \n, \r, \, ', ", ^Z에 백슬레시를 붙여 SQL 인젝션 공격을 방어한다.

또한, htmlspecialchars함수를 활용하여 html에 사용되는 기호를 UTF-8로 반환하고 html에 사용되는 문자들을 html엔티티 코드로 변환하여 secret 변수를 데이터 베이스에 저장한다.

 

2-3. User-Agent

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

그림 4-1. 취약한 페이지 선택

해당 페이지는 접속한 웹브라우저 정보가 저장된 'User-Agent' 헤더 값을 테이블 형태로 출력한다.

그림 4-2. 취약한 사이트

 

2. burp suite툴을 이용하여 간단한 경고창의 스크립트를 입력해서 XSS공격을 시행한다.

 

burp suite 툴을 활용하여 User-Agent헤더에 스크립트 코드를 입력해서 전송한다.

그림 4-3. burp suite로 스크립트 입력

그 결과, 스크립트 코드가 실행되어 경고창을 출력한다.

페이지에 출력된 'User-Agent'가 비어있는 이유는 스크립트 코드를 주입하였기 때문이다.

그림 4-4. 스크립트 코드 실행

이와 같이 스크립트 코드가 테이블에 저장되기 때문에 다른 사용자로 로그인하여도 스크립트 코드가 실행된다.

따라서, 해당 페이지는 저장된 XSS공격에 취약한 페이지이다.

 

3. 대응방안

User Agent 헤더에 스크립트 코드가 입력되어도 문자열로 출력되도록 htmlspecialchars함수를 이용한다. 

( 해당 함수 설명은 위에서 볼 수 있다.)

728x90
Comments