반응형

문제 링크

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` 함수가 호출됨.

반응형

+ Recent posts