웹 해킹 & 시큐어 코딩

웹 해킹 & 시큐어 코딩 (18)

홍시뗄레 2025. 1. 28. 17:01

[실습5-1] DOM-BASED XSS 공격 실습

우선 dom.php 파일을 열어보자.

document라는 객체를 만들어서 위치를 url에 저장하고,

 

5번째 줄에 unescape

사용자가 url을 입력할 때 이는 encoding돼서 들어온다. 이때 decoding해주는 함수를 입력해준 것이다.

 

substring: 특정 위치값 길이만큼 반환.

원하는 값을 parsing하기 위해서이다. 

page=옆에 +5를 한 이유는, 

예를 들어 사용자가 page=notice라고 입력했을 때 사용자가 입력한 값만 순수하게 받아오기 위해서이다.

page+는 5글자로, 인덱스를 +5하면 page=notice가 아닌, notice만 받아오게 된다. 

 

챗지피티 최고

이제 실습을 해보자.

 

url로 이렇게 입력해보자

127.0.0.1/insecure_website/dom.php

이런 결과값이 나온다.

아무런 값을 넣지 않으니, url이 입력되었다.

뒤에 ?page=test를 입력해보자.

127.0.0.1/insecure_website/dom.php?page=test

page 값에 test를 넣는 것.

이렇게 코드에 짠대로 test만 나오게 된다.

그 외에도 다양한 단어를 입력하면 다 페이지에 출력된다.

 

공격자가 page=뒤에 악성스크립트를 삽입하면 어떻게 될까?

 

*xss 취약성 확인 방법

alert()

confirm()

prompt()

 

출력이 된다면 취약성이 있다는 것을 알 수 있다.

 

127.0.0.1/insecure_website/dom.php?page=<script>alert(document.cookie)</script>

이걸 입력했을 때 화면에 출력되는 것은 아무것도 없다.

innerHTML은 script tag을 허용하지 않는 듯 하다.

다른 값으로 시도해보자.

 

127.0.0.1/insecure_website/dom.php?page=<img src="" onerror="alert(document.cookie)">

이걸 입력하면 팝업창이 나온다.

세션 값이 출력되었다.

이렇게 취약점이 존재한다는 것을 알 수 있다.

 

사용자가 입력한 값을 파라미터로 갖고, 서버사이드에서 구성되지 않는다.

응답값에는 악성코드가 입력되지 않고 document를 통해 접근한다.

악성 스크립트가 응답 페이지의 구성이 되지 않고 웹 브라우저 단에서 실행된다.

 

이 외에 추가로 다른 코드도 dom based xss에 취약하다. 알아보자.

이렇게 바꿔주었다.

이것도 그대로 document에 page를 직접 쓰는 방식이다.

이것도 마찬가지로 뒤에서 받은 입력값을 화면에 출력하는 역할을 한다.

http://127.0.0.1/insecure_website/dom.php?page=<b>test</b>

를 입력해보면 글자가 볼드처리된다. 태그가 먹힌다는 것을 알 수 있다.

 

이전에 

127.0.0.1/insecure_website/dom.php?page=<script>alert(document.cookie)</script>

를 입력했을 때는 innerHTML 코드 때문에 실행이 되지 않았지만, 이번에는 잘 작동하는 것을 알 수 있다.

어떤 메소드를 사용하느냐에 따라 차이점이 발생한다.

 

[실습5-2] REFLECTED XSS 공격 실습

우선 임의로 xss.php 파일을 만들어서 코드를 짜보자.

사용자 입력값을 출력해주는 코드를 하나 짜준다. 

제일 간단하게 짜주었다.

http://127.0.0.1/insecure_website/xss.php?value=test

이렇게 입력해보자.

이렇게 뜬다.

사용자 입력값이 바로 출력되는 것!

 

http://127.0.0.1/insecure_website/xss.php?value=<script>alert(document.cookie)</script>

script tag도 입력되는 모습.

 

scripting 취약점이 존재한다는 것을 판단할 수 있다.

dom인지 reflected인지 확인하기 위해서 버프 스위트를 켜보자.

response를 보니 alert(document.cookie)값이 그대로 노출되는 것이 나타난다.

입력한 값이 그대로 응답값에 반환되는 것을 확인할 수 있다.

dom based에서는 그대로 출력되지 않는다.

이게 dom과 reflected의 차이점이다.

 

우리가 입력한 xss.php 코드 외에도 다른 곳에 취약한 점이 있는지 확인해볼 필요가 있다.

게시글 검색창을 한번 예시로 들어보자.

hongsi를 게시글 검색창에 입력하고, request를 보면 keyword로 들어간 것을 확인할 수 있다.

그럼 만약, 이게 reflected xss라면 response에도 나타나있어야 한다.

그러나 위와 같이, response에서는 입력값이 나타나지 않는다.

 

다른 곳도 찾아보자.

임의로 ping check을 눌러보았다. url을 보니

http://127.0.0.1/insecure_website/index.php?page=pingcheck

이렇게 되어 있다.

임의로 pingcheck을 지우고 hongsi를 써보겠다.

http://127.0.0.1/insecure_website/index.php?page=hongsi

이렇게 나온다. 내가 입력한 값이 바로 화면에 출력된다.

그럼 reflected xss가 존재할 수도 있다.

http://127.0.0.1/insecure_website/index.php?page=error&value=hongsi

이런 결과값이 나왔는데, error가 나타나서 url에 추가로 value값으로 바뀐 것을 알 수 있다.

그럼 뒤에 alert로 scripting이 되는지도 확인해보자.

http://127.0.0.1/insecure_website/index.php?page=error&value=<script>alert(document.cookie)</script>

이것도 입력해보자.

취약하다.

경고창이 출력되는 것을 통해서 xss의 공격에 노출되어 있구나를 판단할 수 있다.

사용자 입력값이 response에 그대로 실리는지도 확인해보자.

response를 보니 이렇게 사용자가 입력한 값이 그대로 나타나는 것을 확인할 수 있다.

즉, reflected xss의 취약점을 갖고 있음을 확인할 수 있다.

 

[실습5-3] STORED XSS 공격 실습

데이터베이스에 사용자 입력값이 저장되어야 하는 공격이다.

다른 사용자가 읽었을 때 악의적인 코드가 실행된다.

게시판에 글쓰기를 통해서 실습을 해보자.

이렇게 게시글을 쓰는 곳에 코드를 입력해주고 저장한다.

그리고 해당 글을 클릭하면, 이렇게 경고창이 출력된다.

 

stored xss는 게시글을 입력했다가, 누가 클릭하면 악의적인 코드가 실행될 것이다.

그래서 공격이 더 편리하기도 하고, 사용자가 볼 확률이 더 높다.