WEB/웹해킹

XSS Game 5, 6

너굴맨이해치움 2022. 8. 28. 14:52

 

Level 5

 

 

 

웹 보안 프레임워크로 Angular라는 것이 있다고 한다.

이 프레임워크 하에서 작동하는 사이트를 xss 공격하는 것이 이번 과제이다.

화면 구성은 이런 식이다. (레벨 해결 후 찍은 스크린샷임을 감안해 주길 바란다)

텍스트를 입력할 수 있게 되어 있으며, 입력하는 텍스트만큼의 글자수가 상단의 정수에서 차감된다.

입력값에 상관없이 search 버튼을 누르면 '검색 결과 중 (입력값)을 찾지 못했다'는 문구가 뜬다.

 

<script>alert()</script> 를 입력값으로 넣어본 뒤 코드를 열어본 것이다. 

입력한 값은 query라는 변수를 통해 post 방식으로 전달되는 것 같다.

그리고 입력값에 들어간 <, > 등의 기호들은 &lt, &gt 등의 html 엔티티로 변환되고 있다.

이전 웹해킹 과제에서도 했던 부분이지만 이 부분은 지금으로서는 파훼할 방법이 없다.

그러면 어떻게 해야 할까?

 

 

이것은 그 하단의 코드이다. UTM params라는 요소가 있다.

이번 문제는 이 UTM parameter라는 것을 이용할 것이다.

 

>> 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 엔티티값은 이것이다. &lbrace; << 이것으로 모든 왼쪽 중괄호를 대체해 넣어준다.

그렇게 하면 입력값은 다음과 같다.

 

?query=&lbrace;&lbrace;a=%27constructor%27;b=&lbrace;};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,%27alert(1)%27)()}}