Rate this post

XPath là một ngôn ngữ được thiết kế và phát triển chủ yếu để giải quyết các phần của tài liệu XML. Trong thử nghiệm XPath injection, chúng tôi kiểm tra xem có thể đưa cú pháp XPath vào một yêu cầu được ứng dụng thông dịch hay không, cho phép kẻ tấn công thực hiện các truy vấn XPath do người dùng kiểm soát. Khi bị khai thác thành công, lỗ hổng này có thể cho phép kẻ tấn công vượt qua cơ chế xác thực hoặc truy cập thông tin mà không có sự cho phép thích hợp.

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

Các ứng dụng web sử dụng nhiều cơ sở dữ liệu để lưu trữ và truy cập dữ liệu chúng cần cho các hoạt động của chúng. Về mặt lịch sử, cơ sở dữ liệu quan hệ cho đến nay là công nghệ phổ biến nhất để lưu trữ dữ liệu, nhưng trong những năm qua, chúng ta đang chứng kiến ​​sự phổ biến ngày càng tăng của các cơ sở dữ liệu tổ chức dữ liệu bằng ngôn ngữ XML. Cũng giống như cơ sở dữ liệu quan hệ được truy cập thông qua ngôn ngữ SQL, cơ sở dữ liệu XML sử dụng XPath làm ngôn ngữ truy vấn chuẩn của chúng.

Vì, theo quan điểm khái niệm, XPath rất giống SQL về mục đích và ứng dụng của nó, một kết quả thú vị là các cuộc tấn công tiêm XPath tuân theo cùng một logic như các cuộc tấn công SQL Injection. Ở một số khía cạnh, XPath thậm chí còn mạnh hơn SQL tiêu chuẩn, vì toàn bộ sức mạnh của nó đã có trong các đặc tả của nó, trong khi một số lượng lớn các kỹ thuật có thể được sử dụng trong một cuộc tấn công SQL Injection phụ thuộc vào các đặc điểm của phương ngữ SQL được sử dụng bởi cơ sở dữ liệu đích. Điều này có nghĩa là các cuộc tấn công tiêm XPath có thể dễ thích ứng hơn và phổ biến hơn nhiều. Một ưu điểm khác của tấn công chèn XPath là, không giống như SQL, không có ACL nào được thực thi, vì truy vấn của chúng tôi có thể truy cập mọi phần của tài liệu XML.

Xpath injection attack là gì

Tương tự như SQL Injection, các cuộc tấn công XPath Injection xảy ra khi một trang web sử dụng thông tin do người dùng cung cấp để tạo truy vấn XPath cho dữ liệu XML. Bằng cách gửi thông tin cố ý không đúng định dạng vào trang web, kẻ tấn công có thể tìm ra cách dữ liệu XML được cấu trúc hoặc truy cập vào dữ liệu mà chúng thường không có quyền truy cập. Họ thậm chí có thể nâng cao đặc quyền của mình trên trang web nếu dữ liệu XML đang được sử dụng để xác thực (chẳng hạn như tệp người dùng dựa trên XML).

Truy vấn XML được thực hiện với XPath, một loại câu lệnh mô tả đơn giản cho phép truy vấn XML xác định vị trí một phần thông tin. Giống như SQL, bạn có thể chỉ định các thuộc tính nhất định để tìm và các mẫu để khớp. Khi sử dụng XML cho một trang web, người ta thường chấp nhận một số hình thức đầu vào trên chuỗi truy vấn để xác định nội dung để định vị và hiển thị trên trang. Đầu vào này phải được làm sạch để xác minh rằng nó không làm rối tung truy vấn XPath và trả về dữ liệu sai.

XPath là một ngôn ngữ chuẩn; ký hiệu / cú pháp của nó luôn độc lập với việc triển khai, có nghĩa là cuộc tấn công có thể được tự động hóa. Không có phương ngữ nào khác khi nó diễn ra trong các yêu cầu đối với cơ sở dữ liệu SQL.

Vì không có kiểm soát truy cập cấp độ, nên có thể lấy toàn bộ tài liệu. Chúng tôi sẽ không gặp phải bất kỳ giới hạn nào như chúng tôi có thể biết từ các cuộc tấn công SQL injection.

Xem thêm Tấn công Blind XPath Injection

Ví dụ về lỗ hổng bảo mật

Chúng tôi sẽ sử dụng đoạn mã XML này cho các ví dụ.

<?xml version="1.0" encoding="utf-8"?>
<Employees>
   <Employee ID="1">
      <FirstName>Arnold</FirstName>
      <LastName>Baker</LastName>
      <UserName>ABaker</UserName>
      <Password>SoSecret</Password>
      <Type>Admin</Type>
   </Employee>
   <Employee ID="2">
      <FirstName>Peter</FirstName>
      <LastName>Pan</LastName>
      <UserName>PPan</UserName>
      <Password>NotTelling</Password>
      <Type>User</Type>
   </Employee>
</Employees>

Giả sử chúng ta có một hệ thống xác thực người dùng trên một trang web đã sử dụng tệp dữ liệu thuộc loại này để đăng nhập người dùng. Khi tên người dùng và mật khẩu đã được cung cấp, phần mềm có thể sử dụng XPath để tra cứu người dùng:

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username") & "' And
        Password/text()='" & Request("Password") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And
        Password/text()='" + Request("Password") + "']";

Với tên người dùng và mật khẩu bình thường, XPath này sẽ hoạt động, nhưng kẻ tấn công có thể gửi một tên người dùng và mật khẩu xấu và chọn một nút XML mà không cần biết tên người dùng hoặc mật khẩu, như sau:

Username: blah' or 1=1 or 'a'='a
Password: blah

FindUserXPath becomes //Employee[UserName/text()='blah' or 1=1 or
        'a'='a' And Password/text()='blah']

Logically this is equivalent to:
        //Employee[(UserName/text()='blah' or 1=1) or
        ('a'='a' And Password/text()='blah')]

Trong trường hợp này, chỉ phần đầu tiên của XPath là đúng. Phần mật khẩu trở nên không liên quan và phần Tên người dùng sẽ khớp với TẤT CẢ nhân viên vì phần “1 = 1”.

Xem thêm Phương pháp tấn công Blind SQL Injection

Phòng thủ XPath Injection

Cũng giống như các kỹ thuật để tránh SQL injection, bạn cần sử dụng giao diện XPath được tham số hóa nếu có sẵn hoặc thoát khỏi đầu vào của người dùng để đưa vào truy vấn được xây dựng động một cách an toàn. Nếu bạn đang sử dụng dấu ngoặc kép để kết thúc đầu vào không đáng tin cậy trong truy vấn XPath được xây dựng động, thì bạn cần phải thoát khỏi trích dẫn đó trong đầu vào không đáng tin cậy để đảm bảo dữ liệu không đáng tin cậy không thể cố gắng thoát ra khỏi ngữ cảnh được trích dẫn đó. Trong ví dụ sau, dấu nháy đơn (‘) được sử dụng để kết thúc các tham số Tên người dùng và Mật khẩu. Vì vậy, chúng ta cần thay thế bất kỳ ký tự ‘nào trong đầu vào này bằng phiên bản mã hóa XML của ký tự đó, là“ ’”.

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username").Replace("'", "&apos;") & "' And
        Password/text()='" & Request("Password").Replace("'", "&apos;") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username").Replace("'", "&apos;") + "' And
        Password/text()='" + Request("Password").Replace("'", "&apos;") + "']";

Một tùy chọn giảm thiểu khác tốt hơn là sử dụng truy vấn XPath1 được biên dịch trước. Các truy vấn XPath biên dịch trước đã được đặt trước trước khi chương trình thực thi, thay vì được tạo nhanh sau khi đầu vào của người dùng đã được thêm vào chuỗi. Đây là một con đường tốt hơn vì bạn không phải lo lắng về việc bỏ lỡ một nhân vật đáng lẽ phải được thoát ra.

Mục tiêu kiểm tra

Xác định các điểm tiêm XPATH.

Làm thế nào để kiểm tra

Kiểu tấn công XPath lần đầu tiên được xuất bản bởi Amit Klein và rất giống với SQL Injection thông thường. Để nắm bắt vấn đề đầu tiên, hãy tưởng tượng một trang đăng nhập quản lý xác thực cho một ứng dụng trong đó người dùng phải nhập tên người dùng và mật khẩu của họ. Giả sử rằng cơ sở dữ liệu của chúng ta được biểu thị bằng tệp XML sau:

<?xml version="1.0" encoding="ISO-8859-1"?>
<users>
    <user>
        <username>gandalf</username>
        <password>!c3</password>
        <account>admin</account>
    </user>
    <user>
        <username>Stefan0</username>
        <password>w1s3c</password>
        <account>guest</account>
    </user>
    <user>
        <username>tony</username>
        <password>Un6R34kb!e</password>
        <account>guest</account>
    </user>
</users>

Truy vấn XPath trả về tài khoản có tên người dùng là gandalf và mật khẩu là! C3 sẽ như sau:

string (// user [username / text () = 'gandalf' và password / text () = '! c3'] / account / text ())

Nếu ứng dụng không lọc đúng đầu vào của người dùng, người kiểm tra sẽ có thể chèn mã XPath và can thiệp vào kết quả truy vấn. Ví dụ: người kiểm tra có thể nhập các giá trị sau:

Username: ' or '1' = '1
Password: ' or '1' = '1

Trông khá quen phải không? Sử dụng các tham số này, truy vấn sẽ trở thành:

string(//user[username/text()='' or '1' = '1' and password/text()='' or '1' = '1']/account/text())

Như trong một cuộc tấn công SQL Injection thông thường, chúng tôi đã tạo một truy vấn luôn đánh giá là true, có nghĩa là ứng dụng sẽ xác thực người dùng ngay cả khi tên người dùng hoặc mật khẩu chưa được cung cấp. Và giống như trong một cuộc tấn công SQL Injection thông thường, với XPath injection, bước đầu tiên là chèn một dấu nháy đơn (‘) vào trường cần kiểm tra, đưa ra một lỗi cú pháp trong truy vấn và để kiểm tra xem ứng dụng có trả về thông báo lỗi hay không. .

Nếu không có kiến ​​thức về chi tiết bên trong dữ liệu XML và nếu ứng dụng không cung cấp các thông báo lỗi hữu ích giúp chúng tôi xây dựng lại logic bên trong của nó, thì có thể thực hiện một cuộc tấn công Blind XPath Injection với mục tiêu là tái tạo lại toàn bộ cấu trúc dữ liệu. Kỹ thuật này tương tự như SQL Injection dựa trên suy luận, vì cách tiếp cận là đưa mã tạo ra một truy vấn trả về một bit thông tin. Blind XPath Injection được Amit Klein giải thích chi tiết hơn trong bài báo tham khảo.

Leave a Reply

Call now
%d bloggers like this: