반응형

문제 링크

https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-double-quotes-encoded-single-quotes-escaped

 

 

목표 & 사용 도구

목표: JavaScript 문자열을 탈출하여 `alert` 함수를 호출하는 XSS 공격을 수행하는 것.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩은 `search` 쿼리 tracking 기능에 Reflected XSS 취약점이 존재한다고 한다. 꺾쇠 기호와 더블 쿼터는 HTML 인코딩 처리가 되고 싱글 쿼터는 이스케이프 처리된다. 랩 문제를 해결하기 위해서는 JavaScript 문자열을 탈출해서 `alert` 함수를 호출하는 XSS 공격을 수행해야 한다.

 

 

문제 풀이

  • 검색어 입력 시 사용자 입력 값 필터링 확인을 위해 특수문자 4개를 삽입하고 Search 버튼을 클릭함.

 

  • 이때의 요청 및 응답을 확인해 보면 사용자 입력 값은 `searchTerms` 변수 값이 되고 꺾쇠 기호와 더블 쿼터는 HTML Entity로 치환되며 싱글 쿼터는 이스케이프 처리되고 있음을 알 수 있음.

 

  • `search` 파라미터에 `test'test`를 삽입하여 요청을 보내면 싱글 쿼터가 이스케이프 처리되어 JavaScript 문자열을 탈출할 수 없음을 확인함.

[설명]
싱글 쿼터를 삽입하여 기존의 JavaScript 문자열을 탈출한 뒤 이후 입력 값을 JavaScript 코드로 삽입하려고 시도했다. 하지만 싱글 쿼터는 이스케이프 처리되어 있기 때문에 사용자 입력 값은 기존 JavaScript 문자열 내부에 포함되어 임의의 JavaScript 구문을 삽입할 수 없었다. 

 

  • `search` 파라미터에 `test\'test`를 입력하여 요청을 전송하면 싱글 쿼터에 적용된 이스케이프 처리를 우회하여 기존 JavaScript 문자열을 탈출할 수 있음을 확인함.

[설명]
싱글 쿼터 앞에 이스케이프 처리 기호인 `\`을 추가하면 `\\'` 형태가 된다. 이때 JavaScript 엔진은 첫 번째 기호를 이스케이프 처리 문자로 해석하고 두 번째 `\` 기호를 일반 문자로 처리한다. 그렇기 때문에 두 번째 `\` 기호는 이스케이프 처리 문자가 아닌 일반 문자가 되어 싱글 쿼터는 이스케이프 처리되지 않고 JavaScript 문자열 종료의 의미를 가진다. 

따라서 싱글 쿼터가 JavaScript 문자열의 종료 문자로 동작하여 기존 문자열을 탈출하고 이후에 입력 값들은 JavaScript 코드 영역에 삽입할 수 있게 된다. 

 

  •  이스케이프 처리를 우회하는 페이로드를 `search` 파라미터에 삽입하여 요청을 전송하면 JavaScript 코드 영역에 `alert` 함수를 삽입할 수 있음.

[페이로드]

<!-- test는 Burp Suite에서 
페이로드 삽입 부분을 빠르게 확인하기 위해서 삽입했습니다.-->
search=test\';alert(``xss``);//

[설명]
이스케이프 처리 기호인 `\`을 이스케이프 처리함으로써 싱글 쿼터가 JavaScript 문자열 종료를 의미하는 싱글 쿼터가 되어 기존의 문자열 탈출이 가능했다. 이후에 입력되는 값들은 JavaScript 코드 영역에 삽입되므로 `alert` 함수를 호출하도록 했다. 마지막으로 `//`을 추가해서 페이로드를 입력했을 때 남는 `';`을 주석 처리하여 문법 오류를 방지하도록 처리했다.

`alert` 함수를 보면 백틱( ` )을 사용한 것을 볼 수 있는데 이는 템플릿 리터럴이라고 부르며 JavaScript 문자열 표기법이다. 싱글 쿼터, 더블 쿼터는 이스케이프 처리와 HTML Entity 치환 때문에 사용이 불가능하지만 백틱은 별다른 필터링이 없어서 사용이 가능했다.

 

  • 위 페이로드를 복사한 뒤 검색어 입력창에 삽입하고 Search 버튼을 클릭함.

 

  • 페이로드가 실행되면서 `alert` 함수가 호출되는 것을 볼 수 있으며 사용자의 입력 값으로 JavaScript 코드 실행이 가능하므로 XSS 공격에 취약하다는 것을 알 수 있음.

 

  • 문제 요구대로 XSS 공격을 수행하여 `alert` 함수를 호출했으므로 랩 문제를 해결하게 됨.

반응형
반응형

문제 링크

http://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression

 

 

목표 & 사용 도구

목표: AngularJS 표현식을 사용한 XSS 공격을 수행하여 `alert` 함수를 호출 하는 것.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩은 search 기능안에 AngularJS 표현식에 대해서 DOM-based XSS 취약점이 존재한다. AngularJS는 유명한 Javascript 라이브러리이며 HTML 코드에 directive가 추가되면 `{{ ... }}` 안에서 Javascript 표현식을 사용할 수 있다. 해당 기술은 꺾쇠 기호 `<`,`>`을 사용하지 못할 때 유용하다. 랩을 해결하려면 AngularJS 표현식을 실행하여 alert 함수를 호출하는 XSS 공격을 수행해야 한다고 한다.

 

 

문제 풀이

  • 웹 사이트에서 사용되는 기술을 알려주는 Wappalyzer를 사용해 보면 AangularJS 버전 1.7.7을 사용 중이라는 것을 확인함.

 

  • 검색어 입력할 때의 요청을 취득해서 `search` 파라미터에 특수문자 4개를 삽입했을 때의 응답을 확인해 보면 `<`,`>`은 HTML Entity로 치환되고 있음. 따라서 `<`,`>`을 사용한 HTML 태그 삽입은 제한되어 있다는 것을 알 수 있음.

 

  • `search` 파라미터에 `{{7*7}}`을 삽입한 결과 연산 결과인 `49`가 출력됨. 따라서 AngularJS 표현식을 사용할 수 있음. 

 

  • AngularJS 표현식을 이용하여 `alert` 함수를 호출하는 페이로드를 삽입함.

[페이로드]

<!-- test 문자열은 Burp Suite에서 페이로드 삽입 부분을
빠르게 찾기 위해서 입력했습니다.-->
search=test{{constructor.constructor("alert(``xss``)")()}}

 

[설명]
AngularJS 표현식에서 첫 번째 constructor의 경우 스코프 객체가 상속한 `Object` 생성자를 가리키며 일반적으로 `constructor.constructor`는 `Function` 생성자를 가리킨다고 한다. 그렇기 때문에 두 번째 `constructor`를 통해 `Function` 생성자에 접근할 수 있었다. 전달한 문자열로 함수가 생성되고 마지막 `()`을 통해 함수가 즉시 호출되므로 `alert` 함수가 호출되게 된다. AngularJS 1.6 이상부터는 Sandbox가 제거된 상태였고 1.7.7 환경에서도 해당 페이로드가 실행이 가능했다.

 

  • 웹 페이지로 돌아가 보면 랩 문제가 해결된 것을 볼 수 있음.

 

  • 실제로 `alert` 함수가 호출됐는지 확인하기 위해 검색어 입력 시 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.

 

 

  • `alert` 함수를 호출에 성공하며 XSS 공격에 취약하다는 것을 알 수 있음.

 

*** 추가 설명 - 페이로드

다른 사람들은 랩 문제를 어떻게 풀었나 확인해 봤을 때 `$on.constructor()`, `$eval.constructor()` 을 사용해서 랩 문제를 해결하는 것을 볼 수 있었다. `$on`, `$eval`는 AngularJS의 `Scope` 객체가 제공하는 메서드라고 하며 일반적으로 Javascript에서 일반 함수의 `constructor`는 `Function` 생성자를 가리킨다고 한다. 따라서 `$on.constructor()`, `$eval.constructor()`도 `Function` 생성자에 접근할 수 있다. 이후 Javascript 코드를 문자열로 전달하고 생성된 함수를 호출하면 `alert` 와 같이 코드를 실행시킬 수 있다.

 

[ `$on.constructor()`의 경우 ]

test{{$on.constructor("alert(1)")()}}
  • 검색어 입력할 때 `$on`이 함수인 것을 이용하여 `Function` 생성자에 접근해서 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.

 

  • 페이로드가 실행되면서 `alert` 함수가 호출됨.

 

[ `$eval.constructor()`의 경우 ]

test{{$eval.constructor("alert(1)")()}}
  • 검색어 입력할 때 `$eval`이 함수인 것을 이용하여 `Function` 생성자에 접근해서 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.

 

  • 페이로드가 실행되면서 `alert` 함수가 호출됨.

반응형
반응형

문제 링크

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/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` 함수가 호출되는 것 또한 볼 수 있습니다.

 

반응형
반응형

문제 링크

https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass

 

목표 & 사용 도구

목표: Path Traversal을 이용해 `/etc/passwd` 파일에 접근하는 것입니다.

 

사용도구: Burp Suite

 

문제 설명

해당 랩에는 상품 이미지를 보여주는 곳에서 path traversal 취약점이 존재한다고 합니다. 애플리케이션은 traversal sequences(상위 디렉터리 이동을 의미하는 문자열)를 차단하고 있지만 입력한 파일명을 기본 작업 디렉터리를 기준으로 하는 상대 경로로 처리한다고 합니다. 해당 랩을 풀기 위해서는 `/etc/passwd` 파일을 읽어와야 합니다.

 

 

문제 풀이

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

 

  • 랩에 접속한 것을 확인합니다.

 

  • 이때 Burp Suite HTTP history 탭을 확인해 보면 이미지를 가져오는 요청이 여러 개인 것을 볼 수 있습니다. (이미지 요청이 안 보이면 Filter를 OFF 상태로 바꿔야 합니다.)

 

  • 이미지 요청 중 하나를 선택해서 Burp Suite Repeater 기능에 세팅합니다.

 

  • `filename` 파라미터에 상위 디렉터리 이동을 이용하여 `/etc/passwd` 파일에 접근을 시도해 보면 어떠한 필터링에 의해 접근이 불가능한 것을 볼 수 있습니다.

[설명]
유닉스 계열의 운영체제에서 상위 디렉터리 이동을 의미하는 `../` 을 루트 디렉터리인 `/` 까지 도달할 수 있도록 여러 번 사용해서 `etc/passwd` 접근이 되지 않았으므로 어떠한 필터링이 작용하고 있다고 생각해 볼 수 있습니다.

 

  • 이번엔 `filename` 파라미터에 절대 경로를 이용하여 `/etc/passwd` 파일에 접근을 시도하면 접근에 성공하여 `/etc/passwd` 파일 내용을 읽어오고 있는 것을 볼 수 있습니다. 따라서 Path Traversal 취약점이 존재한다는 것을 알 수 있습니다.

[페이로드]
filename=/etc/passwd

[설명]
상위 디렉터리 이동을 의미하는 `../` 를 필터링되고 있다는 것을 확인했습니다. 서버에서는 상위 디렉터리 이동만을 필터링 하고 있었고 filename 파라미터로 전달받은 값을 작업 디렉터리 뒤에 붙여서 파일을 가져오는 것으로 보였습니다.

하지만 절대 경로를 사용하면 파일이 원래 작업 디렉터리가 아닌 절대 경로 그 자체를 사용했고 그 결과 `/etc/passwd` 파일에 접근이 가능했기 때문에 해당 내용들을 읽어올 수 있었습니다. 

 

  • 랩의 상태가 solved 인지 확인하기 위해 웹 페이지로 돌아가 보면 문제에서 요구한 대로 `/etc/passwd` 내용들을 읽는 것에 성공했으므로 랩 문제를 해결하게 됩니다.

반응형
반응형

문제 링크

https://portswigger.net/web-security/file-path-traversal/lab-simple

 

 

목표 & 사용 도구

목표: Path Traversal을 이용해 /etc/passwd 파일에 접근하는 것입니다.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩에는 상품 이미지를 보여주는 곳에서 path traversal 취약점이 존재한다고 합니다. 해당 랩을 풀기 위해서는 /etc/passwd 파일을 읽어와야 합니다.

 

 

문제 풀이

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

 

  • Burp Suite에서 HTTP history 탭에 들어가 보면 랩에 접속했을 때 이미지를 보여주기 위해서 GET 요청으로 이미지를 가져오고 있는 것을 볼 수 있습니다.

 

  • 이미지를 가져오는 요청 중 하나를 선택해서 Burp Suite Repeater 기능에 세팅합니다.

 

  • filename 파라미터에 path traversal을 이용해 /etc/passwd에 접근해 보면 /etc/passwd 내용들이 전부 노출되고 있으므로 path traversal 취약점이 존재한다는 것을 알 수 있습니다.

[설명]
유닉스 계열의 운영체제의 경우 ../ 는 상위 디렉터리 이동을 의미합니다. 서버에서 filename 파라미터로 전달 받은 값을 이미지가 저장된 경로에 붙여서 파일을 읽어오는 것으로 보입니다. 이때 별다른 필터링이나 검증을 하지 않고 filename 파라미터 값을 그대로 사용하고 있었기 때문에 ../ 를 여러 번 사용했을 때 상위 디렉터리로 이동할 수 있었습니다.

../ 를 총 3번 사용했을 때 /etc/passwd 파일에 접근이 가능했는데 이는 이미지 파일이 저장되어 있는 디렉터리가 예를 들면 /var/www/image/ 이런 식으로 되어있었다고 추정해 볼 수 있습니다. 이때 서버가 filename 파라미터 값을 전달받아서 이미지를 가져올 최종 경로를 만든다고 하면 페이로드를 입력했을 때 /var/www/image/../../../etc/passwd이 됩니다. 여기서 상위 디렉터리로의 이동이 3번 발생하므로 /var/www/ (1), /var/ (2), / (3) 까지 상위 디렉터리로 이동을 하고 마지막에 있는 etc/passwd까지 해서 최종적으로 /etc/passwd 파일에 접근을 할 수 있게 됩니다. 

 

  • 랩의 상태가 solved 인지 확인하기 위해 웹 페이지로 돌아가 보면 문제에서 요구한 대로 /etc/passwd 내용들을 읽는 것에 성공했으므로 랩 문제를 해결하게 됩니다.

반응형
반응형

문제 링크

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 함수를 호출했기 때문에 성공적으로 문제를 해결하게 됩니다. 

 

반응형
반응형

문제 링크

https://portswigger.net/web-security/csrf/bypassing-token-validation/lab-token-validation-depends-on-request-method

 

 

목표 & 사용 도구

목표: CSRF 취약점을 이용하여 피해자의 이메일 주소를 변경시키는 것입니다.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩의 이메일 변경 기능에는 CSRF 취약점이 존재한다고 합니다. CSRF를 차단하려고 시도를 하지만 특정한 타입의 요청에만 방어가 되고 있으며 exploit 서버를 이용해서 다른 계정의 이메일 주소를 바꿔야 랩 문제를 해결할 수 있다고 합니다. 자격 증명에 사용되는 사용자(본인)의 계정은 다음과 같습니다.

 

wiener:peter

 

 

문제 풀이

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

 

  • My account를 클릭합니다.

 

  • My account 페이지에 접속하기 위해서 로그인을 해야 하며 문제에서 제공된 계정으로 로그인합니다.

 

  • 이메일 변경을 위해 변경할 이메일 주소를 입력 후 Update email을 클릭합니다.

 

  • 이메일이 변경된 것을 확인합니다.

 

  • 이때 이메일을 변경할 때 요청을 취득해 보면 변경할 이메일 주소와 csrf 토큰이 같이 전송되고 있다는 것을 알 수 있습니다.

 

  • 이메일 변경할 때의 요청을 Burp Suite Repeater 기능에 세팅합니다.

 

  • email, csrf 파라미터 중 csrf 파라미터 값을 임의의 값으로 하면 유효하지 않은 CSRF 토큰이라는 응답을, 제거하고 요청을 보내면 csrf 파라미터가 없다는 응답을 받게 됩니다.

-csrf 파라미터 값을 임의의 값으로 변경하고 요청을 전송했을 때

 

-csrf 파라미터를 제거하고 요청을 전송했을 때

 

  • 실제로 My account 페이지를 보면 이메일이 바뀌지 않고 있는 것을 볼 수 있습니다. 

 

  • 다시 이메일 변경 요청으로 돌아와서 Change request method 기능을 사용합니다.

 

  • Change request method를 통해 기존 POST 메서드를 GET 메서드로 변경한 뒤 요청을 전송하면 302 Found 결과를 받는 것을 볼 수 있습니다. 302 응답과 함께 Location이 My account인 것으로 봤을 때 요청이 정상적으로 처리되었다는 것을 알 수 있습니다.

 

  • 이어서 My account 페이지에 접속하여 새로고침을 해보면 이메일이 변경된 것을 볼 수 있습니다. 

[설명]

기존의 이메일 변경 요청을 전송할 때는 POST 메서드 방식이었고 CSRF 토큰 값이 유효하지 않거나 없으면 이메일 변경이 불가능했습니다. 하지만 CSRF 공격에 대한 방어가 POST 메서드 방식일 때만 적용되고 있었고 GET 메서드 방식은 방어가 적용이 되지 않고 있었습니다. 그렇기 때문에 GET 메서드로 이메일 변경을 요청하면 CSRF 토큰 값 검사를 하지 않아 CSRF 방어를 우회하여 이메일 변경이 가능했던 것입니다.

 

  • Go to exploit server를 클릭합니다.

 

  • 접속한 뒤 Body 부분에 페이로드를 삽입하고 Store을 클릭합니다.

[페이로드]

<form id="myForm" method="GET" action="https://{lab-id}.web-security-academy.net/my-account">
<input type="hidden" name="email" value="test@attack.com">
</form>

<script>
document.getElementById('myForm').submit();
</script>

[설명]

해당 페이로드의 경우 form 태그와 script 태그를 이용하여 다른 사용자가 페이로드가 삽입된 페이지에 접근했을 때 자동으로 자신의 이메일 주소를 변경하도록 하는 페이로드입니다. 

method 속성은 form 태그 요청 메서드를 지정합니다. action 속성은 요청을 보낼 URL을 지정합니다. script 태그 내부 내용의 경우 id가 myForm인 요소를 가져와 submit(), 즉 제출을 하도록 처리합니다. script 태그를 이용하면 form 데이터를 전송할 때 제출 버튼 클릭과 같이 상호작용을 하지 않아도 요청이 전송됩니다.

 

 

  • Store 후 Deliver exploit to victim을 클릭합니다.

 

  • 피해자(다른 사용자)가 이메일 변경 요청 페이로드가 삽입된 페이지로 접속을 하게 되면서 피해자의 이메일 주소가 변경되어 랩 문제가 해결된 것을 볼 수 있습니다.

 

  • exploit 페이지에서 Access log를 클릭합니다.

 

  • 로그를 보면 이메일 변경 요청 페이로드가 삽입된 페이지에 피해자가 접근했던 기록이 있는 것을 볼 수 있습니다. 

반응형

+ Recent posts