반응형

문제 링크

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` 함수를 호출했으므로 랩 문제 해결함.

반응형

+ Recent posts