반응형

문제 링크

https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored

 

 

목표 & 사용 도구

목표: Stored DOM XSS 취약점을 이용해 `alert` 함수를 호출하는 것.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩은 블로그 댓글 기능에 저장형(Stored) DOM 취약점이 존재한다. 랩 문제를 해결하기 위해서는 해당 취약점을 이용하여 `alert` 함수를 호출해야 한다.

 

 

문제 풀이

  • 게시물 페이지의 Leave a comment 부분에서 Comment, Name 필드에 `<s>` 태그를 삽입하고 Post Comment를 클릭함.

[설명]
사용자 입력 값이 HTML 요소로 파싱되는지 확인하기 위해 `<s>` 태그를 사용했다. `<s>` 태그는 스크립트를 실행하지 않고 취소선 적용 여부를 통해 HTML 파싱 결과를 확인할 수 있다. 

 

  • 개발자 도구를 이용해서 등록된 댓글을 확인해 보면 `<s>` 태그가 HTML 요소로 생성되지 않고 텍스트로 출력된 것을 볼 수 있음. 따라서 HTML 태그 삽입은 제한된 것으로 판단됨.

 

  • 개발자 도구의 Sources 탭에서 댓글을 불러오는 `loadCommentsWithVulnerableEscapeHtml.js` 파일을 확인함.

[설명]
DOM-based XSS의 경우 클라이언트 측에서 발생하는 취약점이기 때문에 Javascript 파일을 분석해서 댓글에 입력한 값을 어떤 식으로 처리하고 있는지 확인하고자 했다.

 

  • 댓글, 즉 사용자가 입력한 값이 `escapeHTML` 함수의 인자 값으로 들어가고 있는 것을 확인했고 해당 반환 값을 `innerHTML`을 통해 HTML로 파싱 되고 있는 것을 확인함. 이는 이스케이프 처리가 미흡하다면 DOM-based XSS로 이어질 수 있음.

 

  • 이어서 `escapeHTML` 함수를 확인해 보면 취약한 방식으로 댓글 입력 값을 이스케이프 처리하고 있음을 알 수 있음.

[설명]
`html.replace('<', '&lt;')`의 경우 첫 번째 `<` 만 `&lt;`로 변환하며 `.replace('>', '&gt;')`의 경우 첫 번째 `>`만 `&gt;`로 변환한다. 따라서 `<`, `>` 먼저 사용하고 그 뒤에 사용하는 `<`, `>`은  `&lt;`, `&gt;`로 치환되지 않는다. 첫 번째로 나오는 문자들만 치환을 하고 있기 때문에 이스케이프 처리가 미흡하다는 것을 알 수 있다.

 

  • 게시물 페이지로 돌아가서 Leave a comment 부분의 Comment 필드에 이스케이프 처리를 우회하는 방식을 적용한 페이로드를 삽입하고 Post Comment 버튼을 클릭함.

[페이로드]

<><img src='x' onerror='alert("xss")'>

[설명]
처음에 오는 `<`, `>` 만 필터링이 적용된다는 것을 이용하여 이벤트 핸들러를 사용한 `img` 태그를 삽입했고 alert 함수를 호출하도록 했다.

 

 

  • 페이로드가 삽입된 게시물 페이지에 접속하면 페이로드가 동작하며 `alert` 함수가 호출되는 것을 볼 수 있음. 따라서 XSS 공격에 취약함.

 

  • 문제 요구대로 저장형 DOM 취약점을 이용하여 `alert` 함수를 호출했으므로 랩 문제 해결함.

반응형
반응형

문제 링크

https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink

 

 

목표 & 사용 도구

목표: DOM-based XSS 취약점을 이용하여 alert 함수를 호출하는 것입니다.

 

사용도구: 개발자 도구

 

 

사전 지식

- DOM-based XSS
스크립트가 서버를 거치는 것이 아닌 브라우저의 DOM을 조작하는 과정에서 실행됩니다.

- Source와 Sink
* Source
사용자가 값을 삽입하는 지점을 의미합니다.

ex) Source 예시
`location.search` - URL 쿼리 스트링, ?test={사용자 입력 값 }
`location.hash` - URL 해시값, #{사용자 입력 값}

* Sink
Source에서 입력한 값이 DOM에 반영되는 지점을 의미합니다. DOM에 반영될 때 별다른 필터링이 존재하지 않는다면 XSS가 발생할 수 있습니다. 

ex) Sink 예시 
`document.write` - 입력값을 HTML로 직접 파싱 해서 삽입
`innerHTML` - HTML을 파싱 하여 DOM에 삽입
`eval()` - 문자열을 Javascript 코드로 실행

 

 

문제 설명

해당 랩에는 search tracking 기능에 DOM-based XSS 취약점이 존재한다고 합니다. 해당 기능은 데이터를 페이지에 출력하는 Javascript의 document.write 함수를 사용합니다. document.write 함수에는 location.search에서 가져온 데이터가 전달되며 URL을 통해 제어할 수 있다고 합니다. 랩 문제를 해결하기 위해서는 XSS 공격을 통해 alert 함수를 호출해야 합니다.

 

 

문제 풀이

  • ACCESS THE LAB을 클릭하여 랩에 접속합니다.

 

  • LAB 접속한 뒤 검색어 입력창에 임의의 값을 입력하고 Search 버튼을 클릭하여 요청을 전송합니다.

 

  • 개발자 도구를 이용하여 Element 탭에 들어가서 코드를 확인해 보면 검색할 때 입력했던 값이 img 태그의 src 속성에 들어가고 있는 것을 볼 수 있습니다.

[설명]
script 태그 내부를 보면 URLSearchParams 함수로 search 파라미터 값을 가져오는 것을 볼 수 있고 query 값이 있으면 trackSearch 함수를 호출하게 됩니다. trackSearch 함수에서는 query 값을 별다른 필터링 없이 document.write()를 이용해 img 태그를 삽입하고 있다는 것을 알 수 있습니다.

정리하면 사용자가 검색어를 입력하면 해당 값이 query가 되고 document.write()를 통해 img 태그가 삽입될 때 query 값이 포함돼서 삽입됩니다. 중요한 점은 사용자의 입력 값인 query가 필터링 되고 있지 않다는 점입니다. (DOM-Based XSS의 경우 백엔드에서 필터링을 할 수 없기 때문에 클라이언트 측에서 필터링을 해야 합니다.)

 

  • 검색어 입력 시 사용자의 입력 값을 필터링하지 않고 있기 때문에 스크립트를 삽입하고 Search 버튼을 클릭하여 요청을 전송합니다.

[페이로드]
aaa" onload="alert('xss')

[설명]
사용자가 입력한 값을 필터링하고 있지 않기 때문에 더블 쿼터를 이용해 src 속성의 끝을 강제로 끊고 이벤트 속성인 onload를 이용하여 img가 로드 되었을 때 alert 함수가 호출 되도록 합니다.

사용자의 입력 값이 document.write()에 의해 DOM에 반영되고 있기 때문에 Sink(DOM에 반영되는 지점)는 document.write()에 해당합니다.

-페이로드 입력 전
<img src="/resources/images/tracker.gif?searchTerms=aaa">

-페이로드 입력 후
<img src="/resources/images/tracker.gif?searchTerms=aaa" onload="alert('xss')">

 

  • 사용자가 삽입한 스크립트에 의해 alert 함수가 호출되는 것을 확인하고 확인 버튼을 클릭합니다.

 

  • 개발자 도구의 Elements 탭에 들어가서 확인해 보면 img 태그가 삽입된 것을 볼 수 있으며 사용자의 입력에 의해 스크립트가 정상적으로 삽입된 것을 확인할 수 있습니다. 

 

  • 문제에서 요구한 대로 xss를 이용하여 alert 함수를 호출했기 때문에 성공적으로 문제를 해결하게 됩니다. 

 

반응형

+ Recent posts