반응형

문제 링크

https://portswigger.net/web-security/cross-site-scripting/contexts/lab-event-handlers-and-href-attributes-blocked

 

 

목표 & 사용 도구

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

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩에는 reflected XSS 취약점이 있고 화이트 리스트 필터링으로 몇몇 태그가 사용이 불가능하다고 합니다. 또한 모든 이벤트 속성과 `<a>` 태그의 `href` 속성이 차단되어 있다고 합니다. 랩을 해결하기 위해서는 랩 유저가 클릭했을 때 `alert` 함수를 호출하는 벡터를 삽입하여 XSS 공격을 수행하라고 합니다. 랩 유저가 벡터를 클릭하도록 하기 위해서는 `"Click"` 단어를 사용해야 한다고 합니다.

 

 

문제 풀이

  • ACCESS THE LAB을 클릭해서 랩에 접속합니다.

 

  • 검색어 입력란에 임의의 값을 입력하고 Search 버튼을 클릭하여 요청을 전송합니다.

 

  • 이때의 요청과 응답을 Burp Suite를 사용하여 취득해 보면 `<h1>` 태그 안에 사용자가 입력한 값이 삽입되고 있는 것을 알 수 있습니다.

 

  • 검색어 입력으로 돌아와서 특수문자 4개를 삽입 후 Search 버튼을 클릭하여 요청을 전송합니다.

[설명]
특수문자 `<`, `'`, `"`, `>` 은 HTML 태그를 만들 때 사용하는 특수문자들입니다. 이러한 특수문자들에 대해서 필터링을 하고 있는지 확인하기 위해 특수문자들을 삽입하고 응답을 확인했습니다.

 

  • 해당 요청과 응답을 취득하여 응답을 확인해 보면 HTML 태그를 만들 때 사용하는 특수 문자들이 필터링 적용되지 않고 있는 것을 알 수 있습니다.

 

  • 검색어 입력할 때의 요청을 Burp Suite Repeater 기능에 세팅합니다.

 

  • `<a>` 태그를 이용해서 사용자가 클릭했을 때 `alert` 함수가 호출되도록 페이로드를 입력하면 `href`가 차단되어 있기 때문에 `href` 속성을 사용할 수 없다는 것을 알 수 있습니다.

[페이로드]

search=test<a+href=javascript:alert('xss')>test</a>

 

  • 이번엔 이벤트 핸들러를 사용하여 `<a>` 태그 위에 마우스 커서가 올라갔을 때 `alert` 함수가 호출 되도록 페이로드를 입력하여 확인해 보면 이벤트 핸들러도 사용할 수 없다는 것을 알 수 있습니다.

[페이로드]

search=<a+onmouseover=alert('xss')>test</a>

 

  • `<svg>` 태그 기반 페이로드를 삽입하면 필터링에 걸리지 않고 페이로드가 삽입되는 것을 볼 수 있습니다. 

[페이로드]

search=<svg><a><animate+attributeName=href+values=javascript:alert('xss')+/><text+x="50"+y="90">test</text></a></svg>

[설명]
`<a>` 태그 안에 `<animate>` 태그를 보면 `attributeName` 속성 값이 `href`이며 `values` 속성 값은 `javascript:alert('xss')`인 것을 볼 수 있는데 이는 `<a>` 태그의 `href` 속성을 `javascript:alert('xss')`로 설정하라는 의미입니다. `<text>` 태그는 `<a>` 태그의 텍스트 값(클릭할 버튼 역할)을 지정하도록 해줍니다. 

`<animate>` 태그의 `attributeName` 속성을 사용한다면 필터링을 우회하여 `href` 속성을 사용할 수 있고 `values` 속성을 이용해 이벤트 핸들러를 사용하지 않고 `Javascript`를 실행 시킬수 있었습니다.

 

  • 웹페이지에서 `<svg>` 태그를 이용한 페이로드가 정상적으로 작동하는지 확인하기 위해서 페이로드가 삽입된 URL을 Copy URL 기능을 사용해서 복사합니다.

 

  • 복사한 주소를 URL 주소 입력창에 입력한 뒤 접근합니다.

 

  • 접근을 해 보면 페이로드 삽입으로 인한 버튼이 하나 생기고 해당 버튼을 클릭하면 `alert` 함수가 호출되는 것을 볼 수 있으며 결과적으로 XSS 공격에 취약하다는 것을 알 수 있습니다.

 

  • 랩 문제 해결 조건은 `<a>` 태그의 텍스트에 `"Click"` 이라는 단어가 들어가야 하기 때문에 이전에 사용했던 페이로드를 수정하여 요청을 보내면 마찬가지로 필터링에 걸리지 않고 페이로드가 삽입되는 것을 볼 수 있습니다.

[페이로드]

search=<svg><a><animate+attributeName=href+values=javascript:alert('xss')+/><text+x="50"+y="90">Click+me</text></a></svg>

 

  • 이전과 동일한 방식으로 페이로드가 삽입된 URL을 복사하여 접근해 보면 랩 문제가 해결되는 것을 볼 수 있습니다.

 

  • 실제로 Click me 버튼을 클릭해 보면 정상적으로 `alert` 함수가 호출되는 것 또한 볼 수 있습니다.

 

반응형

+ Recent posts