Rate this post

XPath là một loại ngôn ngữ truy vấn mô tả cách xác định vị trí các phần tử cụ thể (bao gồm các thuộc tính, hướng dẫn xử lý, v.v.) trong một tài liệu XML. Vì là ngôn ngữ truy vấn nên XPath hơi giống với Ngôn ngữ truy vấn có cấu trúc (SQL), tuy nhiên, XPath khác ở chỗ nó có thể được sử dụng để tham chiếu hầu như bất kỳ phần nào của tài liệu XML mà không có giới hạn kiểm soát truy cập. Trong SQL, “người dùng” (là một thuật ngữ không được xác định trong ngữ cảnh XPath / XML) có thể bị hạn chế đối với một số cơ sở dữ liệu, bảng, cột hoặc truy vấn. Sử dụng một cuộc tấn công XPATH Injection, kẻ tấn công có thể sửa đổi truy vấn XPATH để thực hiện một hành động do chúng lựa chọn.

Các bài viết liên quan:

Các cuộc tấn công Blind XPath Injection có thể được sử dụng để trích xuất dữ liệu từ một ứng dụng nhúng dữ liệu do người dùng cung cấp theo cách không an toàn. Khi đầu vào không được làm sạch đúng cách, kẻ tấn công có thể cung cấp mã XPath hợp lệ được thực thi. Loại tấn công này được sử dụng trong các tình huống mà kẻ tấn công không có kiến ​​thức về cấu trúc của tài liệu XML, hoặc có lẽ thông báo lỗi bị chặn và chỉ có thể lấy một phần thông tin tại một thời điểm bằng cách đặt câu hỏi true / false (booleanized truy vấn), giống như Blind SQL Injection.

Các ví dụ

Kẻ tấn công có thể thực hiện một cuộc tấn công thành công bằng hai phương pháp: Boolenization và XML Crawling. Bằng cách thêm vào cú pháp XPath, kẻ tấn công sử dụng các biểu thức bổ sung (thay thế những gì kẻ tấn công đã nhập vào vị trí tiêm).

Boole hóa

Sử dụng phương pháp “Boolenization”, kẻ tấn công có thể tìm hiểu xem biểu thức XPath đã cho là Đúng hay Sai. Giả sử rằng mục đích của kẻ tấn công là đăng nhập vào tài khoản trong một ứng dụng web. Đăng nhập Thành công sẽ trả về “Đúng” và nỗ lực đăng nhập không thành công sẽ trả về “Sai”. Chỉ một phần nhỏ thông tin được nhắm mục tiêu thông qua ký tự hoặc số được phân tích. Khi kẻ tấn công tập trung vào một chuỗi, chúng có thể tiết lộ toàn bộ chuỗi đó bằng cách kiểm tra từng ký tự trong lớp / phạm vi ký tự mà chuỗi này thuộc về.

Sử dụng hàm string-length (S), trong đó S là một chuỗi, kẻ tấn công có thể tìm ra độ dài của chuỗi này. Với số lần lặp hàm thích hợp của chuỗi con (S, N, 1), trong đó S là chuỗi đã đề cập trước đó, N là ký tự bắt đầu và “1” là ký tự tiếp theo đếm từ ký tự N, kẻ tấn công có thể liệt kê toàn bộ chuỗi.

Code:

<?xml version="1.0" encoding="UTF-8"?>
<data>
   <user>
   <login>admin</login>
   <password>test</password>
   <realname>SuperUser</realname>
   </user>
   <user>
   <login>rezos</login>
   <password>rezos123</password>
   <realname>Simple User</realname>
   </user>
</data>

Chức năng:

  • string.stringlength (// user \ [position () = 1 \] / child :: node () \ [position () = 2 \]) trả về độ dài của chuỗi thứ hai của user đầu tiên (8),
  • substring ((// user \ [position () = 1 \] / child :: node () \ [position () = 2), 1,1) trả về ký tự đầu tiên của user này (‘r’).

XML Crawling

Để biết cấu trúc tài liệu XML mà kẻ tấn công có thể sử dụng:

  • Count(biểu thức)
count(//user/child::node()

Điều này sẽ trả về số lượng nút (trong trường hợp này là 2).

  • stringlength (chuỗi)
string-length(//user[position()=1]/child::node()[position()=2])=6 

Sử dụng truy vấn này, kẻ tấn công sẽ tìm hiểu xem chuỗi thứ hai (mật khẩu) của nút đầu tiên (người dùng ‘admin’) có bao gồm 6 ký tự hay không.

  • substring(string, number, number)
substring((//user[position()=1]/child::node()[position()=2]),1,1)="a"

Truy vấn này sẽ xác nhận (Đúng) hoặc từ chối (Sai) rằng ký tự đầu tiên của mật khẩu người dùng (‘quản trị’) là ký tự “a”.

Nếu biểu mẫu đăng nhập sẽ như thế này:

C#:

String FindUser;
FindUser = "//user[login/text()='" + Request("Username") + "' And
            password/text()='" + Request("Password") + "']";

thì kẻ tấn công nên đưa mã sau vào:

Username: ' or substring((//user[position()=1]/child::node()[position()=2]),1,1)="a" or ''='

Cú pháp XPath có thể nhắc nhở bạn về các cuộc tấn công SQL Injection phổ biến nhưng kẻ tấn công phải xem xét rằng ngôn ngữ này không cho phép nhận xét phần còn lại của diễn đạt. Để bỏ qua giới hạn này, kẻ tấn công nên sử dụng các biểu thức OR để hủy bỏ tất cả các biểu thức, điều này có thể làm gián đoạn cuộc tấn công.

Do Boole hóa nên số lượng truy vấn, ngay cả trong một tài liệu XML nhỏ, có thể rất cao (hàng nghìn, hàng trăm nghìn và hơn thế nữa). Đó là lý do tại sao cuộc tấn công này không được tiến hành thủ công. Biết một vài hàm cơ bản của XPath, kẻ tấn công có thể viết một ứng dụng trong thời gian ngắn, nó sẽ xây dựng lại cấu trúc của tài liệu và sẽ tự điền vào nó với dữ liệu.

Leave a Reply

Call now
%d bloggers like this: