DOM XSS : LAB [7]
DATE : 2024/1/10
Last updated
DATE : 2024/1/10
Last updated
여느 때와 마찬가지로 LAB에 들어와 보면 페이지 중앙에 검색 바가 놓여 있다.
검색할 내용을 입력하고 ENTER를 누르면 위와 같이
search parameter와 결과 문구에 사용자가 입력한 검색 내용이 들어가 있는 걸 볼 수 있다.
이게 어떻게 구현되어 있는 지 확인해보기 위해 packet을 열어봤더니
search('search-results')라는 간단명료한 코드가 적혀져 있었다.
search-results에 대한 정보는 또 다른 packet에서 확인할 수 있다.
사용자가 입력한 내용을 search parameter로 전달하면 검색 결과를 json object 형태로 넘겨준다.
다른 키워드도 입력해보니 results 내용이 생긴 걸 볼 수 있는데 이를 통해 우리는
results는 검색 결과 나온 게시물 정보이고,
searchTerm은 search parameter로 전달된 사용자 입력 값임을 눈치챌 수 있다.
그럼 이 데이터를 가지고 대체 무엇을 하느냐!?
함수 search()를 찾아보니 위와 같이 eval을 사용하는 코드를 발견했다..!
searchResultsObj를 생성 & 할당하고 호출하는 거 까지 살펴보니
searchResultsObj는 위에서 봤던 search-results 결과인 json object이고
그 안에 들어있는 results & searchTerm을 각각 변수에 할당해 결과 문구를 만들고 있었던 것이다.
그렇다면 이제 사용자가 입력한 값이 어느 위치에 들어가는 지 파악이 가능하다.
최종적으로 searchTerm을 사용하는 곳은
h1 innerHTML 값을 넣는 위치로 innerHTML에 alert()를 실행할 수 있는 형태로 스크립트를 넣어야 한다.
searchTerm은 json object를 통해 전달되기 때문에
앞 뒤에 작성된 내용을 고려하여 INPUT과 같이 스크립트를 삽입해야 한다.
이렇게 스크립트를 삽입하게 되면 innerHTML를 작성하는 위치에서는
검색 결과 문구를 만든 후 alert(1)가 실행되는 구조가 되기 때문에
팝업 창이 뜬 다음에
결과 화면이 보이는 순으로 처리되는 걸 확인할 수 있을 것이다.
위에서 삽입한 스크립트가 잘 이해되지 않을 수 있기 때문에 간단한 예시를 보여주자면
- 문자는 앞에 작성된 내용과 뒤에 작성된 내용을 분리하기 위한 연산자로
결과적으로 innerHTML에 들어가는 값은 아래와 같고
이 페이지에 접속해보면
팝업 창이 먼저 뜬 다음
<h1> tag가 나오는 걸 볼 수 있다.
-alert(1) 앞에 어떤 내용을 작성하든 searchTerm은 NaN으로 출력이 되는데
아마도 기능 상으로 분리되지만 -alert(1)를 붙였기 때문인 듯하다.
어찌 됐든 이전에 나오지 않았던 innerHTML이라는 속성이 새로 등장했다..!
document.write와 더불어 DOM XSS에서 대표적으로 활용되는 취약한 코드임을 알고 넘어가자!