XSS Game 5, 6
Level 5
웹 보안 프레임워크로 Angular라는 것이 있다고 한다.
이 프레임워크 하에서 작동하는 사이트를 xss 공격하는 것이 이번 과제이다.
화면 구성은 이런 식이다. (레벨 해결 후 찍은 스크린샷임을 감안해 주길 바란다)
텍스트를 입력할 수 있게 되어 있으며, 입력하는 텍스트만큼의 글자수가 상단의 정수에서 차감된다.
입력값에 상관없이 search 버튼을 누르면 '검색 결과 중 (입력값)을 찾지 못했다'는 문구가 뜬다.
<script>alert()</script> 를 입력값으로 넣어본 뒤 코드를 열어본 것이다.
입력한 값은 query라는 변수를 통해 post 방식으로 전달되는 것 같다.
그리고 입력값에 들어간 <, > 등의 기호들은 <, > 등의 html 엔티티로 변환되고 있다.
이전 웹해킹 과제에서도 했던 부분이지만 이 부분은 지금으로서는 파훼할 방법이 없다.
그러면 어떻게 해야 할까?
이것은 그 하단의 코드이다. UTM params라는 요소가 있다.
이번 문제는 이 UTM parameter라는 것을 이용할 것이다.
간단히 말해 UTM 파라미터는 페이지에 표시되는 광고에 대한 정보가 페이지 링크 뒤에 파라미터로 붙는 것을 말한다.
utm_content는 광고의 내용, campaign은 광고 캠페인명, source는 매체명 등으로 필드별로 내용이 각각 다르다.
이 코드를 자세히 보면 utm_term과 utm_campaign이 입력값으로 넘어가고 있다.
둘 중 하나를 파라미터로 사용하면 될 것이다.
그런데 위에서 보았듯 특수기호는 html 엔티티 처리가 되어 넘어가고 있기 때문에,
여기에서는 {{alert()}} 와 같은 형식으로 중첩 중괄호를 사용하여 코드를 감싸 주어야 한다.
따라서 링크 뒤에 적어줄 값은 이러하다.
?utm_campaign={{alert(1}}
Level 6
같은 Angular 프레임워크 하에서 xss를 수행하는 과제이다.
코드를 보면 이번에는 utm 파라미터도 없고, 위와 같은 형식으로 입력값이 b 태그로 감싸져서 들어간다.
단순히 태그를 사용해 공격하는 것이 안 되는 것은 물론이고, 달리 우회할 변수도 없다. 어떻게 해야 할까?
우리에게는 선현의 지혜(aka Github)가 있다. 깃헙에 가 보면 Angular 템플릿 인젝션을 수행하는 페이로드를 찾을 수 있다.
페이로드란 아래와 같은 것을 의미한다.
통상적으로는 패딩이나 헤더 등 부차적인 이것저것을 제외한 통신 내용 그 자체, 보안적으로는 멀웨어를 뜻한다.
그러니까 Angular 템플릿 인젝션을 할 수 있는 멀웨어 코드가 있다는 것이다. 내용은 다음과 같다.
{{a='constructor';b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,'alert(1)')()}}
이 페이로드는 url 뒤에 ?query= 형식으로 쿼리 변수에 담아서 보낼 수 있게 되어 있다.
하지만 저 자체로 적어넣기만 하면 작동하지 않는다. 필터링 때문에 왼쪽 중괄호가 사라지기 때문이다.
때문에 왼쪽 중괄호가 깨지지 않도록, 해당 문자만을 html 엔티티화해서 넣어준다.
왼쪽 중괄호의 html 엔티티값은 이것이다. { << 이것으로 모든 왼쪽 중괄호를 대체해 넣어준다.
그렇게 하면 입력값은 다음과 같다.
?query={{a=%27constructor%27;b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,%27alert(1)%27)()}}