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.

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).

Boolenization

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.

Xem thêm SQL injection attack là gì?

Cách thức tấn công Blind XPath Injection

Blind XPath Injection là một kỹ thuật tấn công nhằm khai thác lỗ hổng XPath Injection trong ứng dụng web. Kỹ thuật này cho phép kẻ tấn công truy vấn và thu thập thông tin từ cơ sở dữ liệu của ứng dụng mà không cần biết cụ thể về cấu trúc và nội dung của cơ sở dữ liệu đó. Dưới đây là một số cách thức tấn công Blind XPath Injection:

  1. Xác định lỗ hổng: Đầu tiên, kẻ tấn công phải xác định được điểm yếu của ứng dụng web để tiến hành tấn công. Điều này thường được thực hiện bằng cách kiểm tra và nhập các giá trị không hợp lệ vào các trường đầu vào của ứng dụng, và theo dõi phản hồi từ máy chủ để xác định xem có xuất hiện lỗi XPath hoặc thông báo lỗi không.
  2. Xác định điều kiện: Khi lỗ hổng XPath Injection được xác định, kẻ tấn công cần xác định các điều kiện để truy vấn thông tin từ cơ sở dữ liệu. Điều kiện có thể dựa trên các phép so sánh, ví dụ như “true” hoặc “1=1” để trả về kết quả đúng.
  3. Khai thác lỗ hổng: Dựa trên các điều kiện đã xác định, kẻ tấn công sẽ tạo các truy vấn XPath để thu thập thông tin từ cơ sở dữ liệu. Ví dụ, kẻ tấn công có thể thực hiện các truy vấn như “//user[name/text()=’admin’]” để truy xuất thông tin của người dùng có tên là “admin”.
  4. Thu thập thông tin: Kẻ tấn công sẽ theo dõi các phản hồi từ máy chủ và phân tích nội dung để thu thập thông tin nhạy cảm từ cơ sở dữ liệu. Các thông tin có thể bao gồm tên người dùng, mật khẩu, thông tin cá nhân và dữ liệu khác trong cơ sở dữ liệu.
  5. Tiếp tục khai thác và tấn công: Kẻ tấn công có thể tiếp tục khai thác lỗ hổng để truy vấn và thu thập thông tin từ cơ sở dữ liệu hoặc thực hiện các hành động khác như thay đổi dữ liệu, thêm mới hoặc xóa dữ liệu.

Để ngăn chặn tấn công Blind XPath Injection, các phương pháp bảo mật phải được triển khai trong ứng dụng web, bao gồm kiểm tra và xử lý đúng các trường đầu vào, sử dụng các thư viện và công cụ bảo mật, và thiết lập quyền truy cập hợp lý đến cơ sở dữ liệu.

Xem thêm Kiểm tra bảo mật website – Injection pentest

Ví dụ và trường hợp thực tế Blind XPath Injection

Dưới đây là một ví dụ về tấn công Blind XPath Injection trong một trường hợp thực tế:

Giả sử bạn đang làm việc trên một ứng dụng web có chức năng tìm kiếm sản phẩm trên một trang thương mại điện tử. Ứng dụng này cho phép người dùng nhập từ khóa để tìm kiếm sản phẩm trong cơ sở dữ liệu.

  1. Xác định lỗ hổng: Bằng cách nhập một giá trị không hợp lệ, như ” ‘ or 1=1– “, vào trường tìm kiếm, bạn nhận thấy trang phản hồi với kết quả không chính xác hoặc thông báo lỗi.
  2. Xác định điều kiện: Sau khi xác định lỗ hổng, bạn phát hiện rằng ứng dụng sử dụng XPath để truy vấn cơ sở dữ liệu. Bạn nhận thấy rằng khi bạn thêm điều kiện ” or 1=1 “, trang vẫn trả về kết quả đúng.
  3. Khai thác lỗ hổng: Bây giờ, bạn có thể sử dụng Blind XPath Injection để thu thập thông tin từ cơ sở dữ liệu mà không cần biết cấu trúc của nó. Bạn có thể sử dụng truy vấn như “//user[name/text()=’admin’]” và theo dõi phản hồi để xem liệu người dùng “admin” có tồn tại hay không. Dựa trên kết quả, bạn có thể suy ra thông tin về tên người dùng, mật khẩu hoặc dữ liệu khác.

Ví dụ trên chỉ minh họa một trường hợp Blind XPath Injection. Thực tế có thể có nhiều biến thể và cách thức tấn công khác nhau, tùy thuộc vào ứng dụng và cấu trúc của nó. Việc áp dụng các biện pháp bảo mật như kiểm tra và xử lý đầu vào, sử dụng thư viện bảo mật, và giám sát quyền truy cập cơ sở dữ liệu là quan trọng để ngăn chặn tấn công Blind XPath Injection.

Xem thêm Tìm hiểu về CSV Injection

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now