XML External Entity (XXE) คืออะไร ประเภทและตัวอย่างของการ โจมตี

Kaori Takase
4 min readJun 9, 2021

XML External Entity (XXE) injection นั้นเป็นช่องโหว่ในด้าน Web application ซึ่งจะเปิดช่องทางให้ Hacker สามารถแทรกแซง process ข้อมูลมาจาก XML ของ Application ที่มีการอ้างอิงไปยัง entity ภายนอกได้ ทำให้ Hacker สามารถดู files บน system ของ server และ Hacker สามารถเปิดเผยข้อมูลที่เป็นความลับ หรือ ทำเป็น denial of service (DOS) ก็ได้

ก่อนที่เราจะทำการรู้จักกับ XXE เรามารู้จักกับ DTD(Document Type Declaration) กันก่อนนะคะ

โดยDTDใช้เพื่อกำหนดโครงสร้างของXML document ภายใน DTD สามารถประกาศ “entity XML” มีentity XML ชนิดพิเศษที่เรียกว่า “External entity” ซึ่งใช้เพื่อเข้าถึงเนื้อหาในเครื่องหรือระยะไกลด้วย URL ค่ะ

มาดูวิธีการโจมตีของHackerกันเลยค่ะ

การโจมตีโดย Hacker นั้น จะหาช่องโหว่เมื่อ XML ถูก run ขึ้นมาโดยการอัปโหลด XML ใหม่เข้าไปในเครื่อง หรือ ใส่เนื้อหาที่เป็นอันตรายเข้าไปในเนื้อหาที่มี XML และรวมถึงการหาช่องโหว่จาก code XML ที่มีการอ้างอิง Library เข้ามา โดยHacker อาจเปิดเผย file ในเครื่อง ซึ่งอาจมีข้อมูลที่ละเอียดอ่อน ยกตัวอย่างเช่น รหัสผ่านหรือข้อมูลส่วนตัวของผู้ใช้

Hacker ใช้ application ที่เชื่อถือได้นี้เพื่อเข้าถึงระบบภายใน ซึ่ง Hacker อาจเปิดเผยเนื้อหาผ่านคำขอ http หรือเปิดการโจมตี CSRF ไปยัง internal services ที่ไม่มีการป้องกัน

การโจมตีอื่นๆของHacker นั้นสามารถเข้าถึงทรัพยากร (local resource) ในเครื่องที่อาจไม่หยุด return ข้อมูลกลับมา ถ้ามี thread มากเกินไปหรือ process ที่ไม่ถูกปล่อยออกมา มันจะส่งผลกระทบต่อ availability ของ application

ตัวอย่าง

การเข้าถึงทรัพยากร local resource ที่ไม่ return ส่งกลับคืนมา

<?xml  version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]>
<foo>&xxe;</foo>

ประเภท ของ XML External Entity (XXE) attacks

1.Exploiting XXE เพื่อดึงไฟล์

เป็นการโจมตีโดย XXE injection ที่ดึงไฟล์ได้อำเภอใจจากระบบไฟล์ของ Server

วิธีการแก้ไข XML ที่ส่งมาในสองวิธีนั้น:

  • แก้ไข DOCTYPE element ที่กำหนด external entity ที่มี path ไปยังไฟล์
  • แก้ไขค่าข้อมูลใน XML ที่ return การตอบสนองของ application เพื่อใช้ external entity ที่กำหนดไว้

ตัวอย่าง

สมมติว่า เรามี application ตรวจสอบการช็อปปิ้งเพื่อดู stock level ของผลิตภัณฑ์โดยส่ง XML ต่อไปนี้ไปยัง Server

แล้ว applicationนี้ ไม่มีการป้องกันการโจมตี XXE ดังนั้นสามารถใช้ประโยชน์จากช่องโหว่ XXE เพื่อดึงไฟล์ /etc/passwd โดยส่ง pay load XXE ได้ดังต่อไปนี้:

payload XXE นี้กำหนด external entity &xxe; ซึ่งมีค่าเป็น content ของไฟล์ /etc/passwd และใช้ internal entity ของค่า productId มันจะทำให้มีการตอบสนองของ application รวม content ของไฟล์ได้แบบนี้

2.Exploiting XXE เพื่อทำการโจมตี SSRF

การโจมตี XXE ก็คือ ใช้เพื่อทำ Server-Side Request Forgery(SSRF) นี่เป็นช่องโหว่ที่ร้ายแรงซึ่งอาจทำให้ application ฝั่ง Server ส่งคำขอ HTTP ไปยัง URL ต่างๆที่ Server สามารถเข้าถึงได้

ในการทำ exploit นั้นต้องกำหนด XML external entity โดยใช้ URL เพื่อเป็นเป้าหมายที่เราต้องการจะโจมตี และกำหนด entity ค่า data value แต่ถ้าเราสามารถใช้ data value ได้มันจะส่ง return ค่าของ application response หลังจากนั้นเราจะสามารถดูการตอบกลับจาก URL ภายใน application responseได้ ดังนั้นจึงได้รับการโด้ตอบแบบ interaction ทั้งสองทางกับระบบ back-end หรือไม่เช่นนั้น เราจะสามารถทำการโจมตี ได้เฉพาะ blind SSRF เท่านั้น

ในตัวอย่าง XXE ต่อไปนี้ จะทำให้ Server ส่งคำขอ back-end HTTP ไปยังระบบภายในภายในโครงสร้างพื้นฐานขององค์กร:

3.Exploiting blind XXE เพื่อ exfiltrate ข้อมูล out-of-band

สิ่งที่ Hacker ต้องการคือการ exfiltrate ข้อมูลที่ละเอียดอ่อน มันสามารถทำได้ผ่านช่องโหว่ blind XXE แต่มันเกี่ยวข้องกับ Hacker ที่เป็น host แล้วเป็น DTD ที่เป็นอันตรายบนระบบที่พวกเขาจะควบคุม จากนั้นเรียกใช้ external DTD จาก payload in-band XXE

ตัวอย่างของ DTD ที่เป็นอันตรายในการ exfiltrate content ของไฟล์ /etc/passwd มีดังนี้:

ขั้นตอนการทำงานของ DTD คือ:

  • กำหนด XML parameter entity ที่เรียกว่า file ซึ่งมี content ของไฟล์ /etc/passwd
  • กำหนด XML parameter entityที่เรียกว่า eval ซึ่งมีการประกาศแบบ dynamic ของ XML parameter entity อื่นที่เรียกว่า exfiltrate entity ข้อมูลจะถูกประเมินโดยการส่งคำขอ HTTP ไปยัง webServer ของ Hacker ที่มีค่าของ entity ไฟล์ URL query string
  • ใช้ entity eval เพื่อทำการ exfiltrate entity
  • ใช้ exfiltrate entity เพื่อให้มีการประเมินค่าโดยการขอ URL ที่ระบุ

Hacker จะต้อง เป็น host DTD โดยปกติแล้วจะโหลดลงบน Webserver ของตนเอง ตัวอย่างเช่น Hackerอาจให้บริการ DTD ที่เป็นอันตรายที่ URL ต่อไปนี้:

http://web-attacker.com/malicious.dtd

สุดท้าย Hacker ต้องส่ง payload XXE ต่อไปนี้ไปยัง application ที่มีช่องโหว่:

payload XXE นี้ประกาศ XML parameter entity ที่เรียกว่า xxe จากนั้นใช้ entity ภายใน DTD สิ่งนี้จะทำให้ XML parser ดึง DTD ภายนอกจาก Server ของ Hacker และตีความ

ขั้นตอนที่กำหนดภายใน DTD จะถูกดำเนินการ และไฟล์ /etc/passwd จะถูกส่งไปยัง Server ของ Hacker

4.Exploiting blind XXE เพื่อดึงข้อมูลผ่านข้อความแสดงerror message

คือการ trigger error message ในการแยกวิเคราะห์ XML (XML parsing error) โดยที่ข้อความแสดง error message มีข้อมูลที่ละเอียดอ่อนซึ่ง เราต้องดึงข้อมูลมา ถ้า application ส่ง return ข้อความ error message มาแล้วเป็นผลลัพธ์ของการ response

เราสามารถ trigger ข้อความerror messageในการแยกวิเคราะห์ XML ที่มี content ของไฟล์ /etc/passwd โดยใช้ DTD ภายนอกที่เป็นอันตรายดังนี้:

ขั้นตอนการทำงานของ DTD คือ:

  • กำหนด XML parameter entity ที่เรียกว่าไฟล์ ซึ่งมีเนื้อหาของไฟล์ /etc/passwd
  • กำหนด XML parameter entityที่เรียกว่า eval ซึ่งมีการประกาศแบบ dynamic ของ XML parameter entity อื่นที่ เรียกว่า error entity จะได้รับการประเมินโดยการโหลด nonexistent file ซึ่งมี ชื่อ มีค่าเป็น file entity
  • ใช้ entity eval ซึ่งทำให้เกิดการประกาศแบบ dynamic ของ error entityที่จะดำเนินการ
  • ใช้ error entity เพื่อให้ค่าของมันถูกประเมินโดยพยายามโหลด nonexistent fileส่งผลให้เกิดข้อความ error messages ที่มีชื่อของ nonexistent file ซึ่งเป็น content ของไฟล์ /etc/passwd

การเรียกใช้ DTD ภายนอกที่เป็นอันตรายจะส่งผลให้เกิดข้อความerror messages ดังต่อไปนี้:

Reference :

https://portswigger.net/web-security/xxe

https://owasp.org/wwwcommunity/vulnerabilities/XML_External_Entity_(XXE)_Processing

https://corneacristian.medium.com/top-25-xxe-bug-bounty-reports-ab4ca662afad

https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-exfiltrate-data-out-of-band

--

--