XSS Point 2

DATE : 2023/12/23

바로 XSS Point 찾기 - 두 번째 문제를 풀어보도록 하자.

(문제가 조금 달라진 거 같은데 🤔 또 다른 취약점 포인트는 찾았지만 그건 아직 비밀.. 😏

일단 찾았을 당시의 취약점 내용을 적어보려고 한다.)

XSS Point 1와 마찬가지로 로그인 후, 마이페이지를 확인해 봤지만 별 다른 소득은 없었다.

그래서 바로 공지 사항 페이지로 넘어가 Stored XSS를 시도해보았다.

첫 번째 게시물은 제목에 스크립트를 삽입했고

두 번째 게시물은 본문에 스크립트를 삽입해두었다.

만약 게시물을 불러오는 과정에서 제목 또는 본문에 작성해둔 스크립트가 실행된다면

상세 페이지로 들어가는 순간, 팝업 창을 볼 수 있을 것이다.

첫 번째 게시물부터 확인해보면! 팝업 창이 뜨지 않았다.

그렇다면 두 번째 게시물은..?!

마찬가지로 팝업 창이 뜨지 않았다. 삽입한 스크립트 내용은 그대로 나오는 데

왜 팝업 창은 뜨지 않는 것인지 Packet을 들여다 보면 이유를 알 수 있다.

첫 번째 게시물의 Response를 먼저 보면 게시물 제목이 작성되는 부분의 스크립트가 뭔가 이상하다.

<script>    =>    &lt;script&gt;

스크립트가 실행될 수 있도록 tag로 작성해둔 내용이 대체 문자로 변환된 걸 확인할 수 있다.

두 번째 게시물의 Response에도 마찬가지로 태그가 각각의 기호를 의미하는 문자로 대체되었다.

이렇게 대체 문자를 사용하게 되면

HTML 속에서 script로 인식되어 실행되도록 작성한 script tag가 tag로 인식되지 못하기 때문에

게시물을 불러올 때 팝업 창이 뜨지 않았던 것이다.

그렇다면 태그 기호를 대체 문자로 변환하지 않는 포인트를 찾아내야 한다.

또한 우리가 찾고자 하는 포인트에서는

스크립트가 실행되기 위해서 게시물의 제목 또는 본문 내용을 출력하는 곳이어야 한다.

잘 생각해봤을 때, 게시물의 본문이나 제목을 화면에 출력하는 페이지는

(1) 공지 사항 페이지와 (2)상세 페이지 밖에 없다.

하지만 (2)번의 경우, 위에서 스크립트가 실행되지 않는 다는 걸 이미 확인했다.

그럼 (1)번의 경우를 고려해보자.

공지 사항 페이지에서는 기본적으로 작성된 게시물을 가져와 제목을 화면에 보여주는 데,

그러면 위에서 제목에 스크립트를 작성한 뒤, 공지 사항 페이지로 이동했을 때 팝업 창이 나왔어야 한다.

하지만.. notice_list.php의 Response를 확인해보면 여기도 태그가 대체 문자로 작성된 걸 볼 수 있다.

그럼 (1)번도 스크립트를 실행할 수 없으니 방법이 없는게 아닌가!?

공지 사항 페이지의 기능을 떠올려보면 아직 사용하지 않는 기능이 한 가지 있다.

바로, 검색!

검색 기능을 사용해보면 notice_list.php로 Post request가 날아가게 된다.

이 요청에는 총 5개의 parameter가 포함되며 실행 결과를 토대로 유추해본 결과,

select * from board where option_val like %board_result%

위와 같이 검색어(board_result)가 선택한 카테고리(option_val)에 포함되는 게시물을 꺼내오는

Query가 실행될 것이다.

따라서 위의 경우, 제목에 "alert"가 포함된 게시물만 가져오게 되므로

제목에 작성해둔 스크립트가 Response에 나오게 되는 것이다.

기능 검색을 사용하는 경우에는 태그에 사용되는 기호를 대체 문자로 변환하지 않다 보니

결과적으로 팝업 창을 띄울 수 있게 되고

서버로부터 받은 Response로 페이지를 만들어 주르륵 출력하는 과정에서

스크립트 내용은 팝업 창을 띄움으로써 끝났기 때문에

alert()가 실행된 후 제공되는 페이지에는 스크립트 내용이 빠져있는 걸 볼 수 있을 것이다.

(이는 스크립트가 앞에서 처럼 문자열이 아닌 스크립트로써 실행되었음을 보여주는 부분이다.)

Last updated