XSS Point 5

DATE : 2023/12/22

계속해서 XSS Point를 찾는 연습을 이어가 보도록 하자.

로그인 후, 마이페이지를 먼저 탐색해보았으나 취약점은 없는 걸로 파악되어

바-로 공지 사항 페이지로 넘어갔다.

여느 때와 마찬가지로 게시물을 작성하고 Packet을 확인해보려는 순간

글 작성 페이지로 이동할 때의 Packet에서 위와 같은 코드를 발견했다.

function checkContent(data) {
    data = data.replace(/\</g,"&lt;");
    data = data.replace(/\>/g,"&gt;");
    
    writeFrm.create_body.value = data;
    
    return true;
}

code는 쉽게 말해 tag를 작성하기 위해 사용하는 "< >" 이 기호를

기호 그대로 남겨두지 않고, 이를 대체하는 값으로 변환한다는 내용이다.

예를 들어 <input> tag가 이 코드를 거치게 되면

<input>    =>   &lt;input&gt;

위와 같이 기호가 대체 문자로 바뀌게 된다는 것!

그렇다 보니 게시물 본문에 스크립트를 작성하고 업로드를 하게 되면

(1) 상세 페이지를 불러올 때는 해당 게시물의 정보를 DB에서 꺼내

(2) 페이지를 만들어 브라우저에게 전달해주고

(3) 페이지를 받은 브라우저가 &lt;, &gt; 와 같은 내용을 다시 "< >" 기호로 바꿔 화면에 출력하기 때문에

사용자는 위와 같이 작성했던 내용 그대로 결과를 받아볼 수 있는 것이다.

하지만 게시물을 저장하기 전 Packet을 잡아 보면

기호가 대체 문자로 변환된 다음

서버로 전달되는 Packet에 담긴 다는 걸 확인할 수 있을 것이다.

그렇다면 제목에는 스크립트를 작성할 수 있지 않을까??

tag에 사용하는 기호를 대체 문자로 바꾸는 건 게시물의 본문에만 실행되는 코드이기 때문에

게시물 제목에 스크립트를 작성하는 경우에는 그 내용이 그대로 DB에 저장된다. 💡

그러나 notice_list.php에서는 기본적으로 게시판을 만들 때, 기호를 문자로 변환하는 듯하다.

여기까지 정리해봤을 때,

일단 스크립트를 게시물 본문에 작성하는 건 어려울 듯하다.

대체 문자로 변경되지 않는 제목에 스크립트를 삽입해야 할 듯한데

문제는 스크립트가 삽입돼도 상세 페이지, 공지 사항 페이지에서 스크립트가 실행되지 않는다는 점이다.

스크립트를 실행하기 위해서 해야 할 일은 단 한 가지,

스크립트를 작성해둔 게시물 제목이 화면에 출력 되도록 만드는 것이다.

게시물 제목이 화면에 출력 되는 경우는 사이트를 이용해본 결과,

(1) 게시물의 상세 페이지

(2) 게시판 페이지

2가지로 정리되는 데 위에서 확인 했듯이

(1)번의 경우에는 스크립트가 실행되지 않고 그냥 문자로써 출력만 되는 상태이며

(2)번의 경우에는 스크립트 기호가(< >) 대체 문자로 변환되고 있음을 확인했다.

그럼, 스크립트를 실행할 방법이 없는 것일까??

우리에겐 아직 검색 기능이 남아있다!!

작성자가 "hanhxx"인 경우의 게시물이 출력 되도록 검색해보면

Request에서는 5개의 parameter를 보내 작성자 이름에 hanhxx가 들어간 게시물을 모두 꺼내올 것이다.

이때 Response를 확인해보면..!

스크립트를 작성해둔 게시물의 제목이 대체 문자로 변환되지 않고

스크립트 형태 그대로 출력 되고 있음을 확인할 수 있다.

즉 검색 기능을 활용해 DB에서 스크립트를 작성해둔 게시물을 곧 바로 꺼내오는 경로에서는

대체 문자로 변환되지 않기 때문에

게시물 목록을 하나씩 만들면서 notice2<script>alert(1)>/script>를 마주하는 순간,

<script> tag를 실행하게 되는 것이다.

이는 위에서 봤던 checkContent 함수가 게시물 제목에는 적용되지 않다 보니,

notice2<script>alert(1)</script>

가 그대로 DB에 저장되었다가

이를 대체 문자로 변환하지 않는 과정에서

스크립트가 그대로 저장되었던 제목을 꺼내옴으로써 Stored XSS를 수행할 수 있게 된 것이다. 👍

이처럼 게시물의 모든 내용에 checkContent 함수 내용을 적용하지 않게 되면

스크립트를 실행할 수 있는 딱 한 군데의 포인트만 주어지더라도

XSS 공격을 수행할 수 있음을 보여준 사례라고 할 수 있다!

Last updated