a

Câu hỏi Tại sao Google thêm vào trong khi (1); với câu trả lời JSON của họ?


Tại sao Google thêm vào while(1); trả lời JSON (riêng tư) của họ?

Ví dụ: đây là câu trả lời khi bật và tắt lịch lịch Google:

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Tôi cho rằng đây là để ngăn chặn mọi người làm eval() trên đó, nhưng tất cả những gì bạn thực sự phải làm là thay thế while và sau đó bạn sẽ được thiết lập. Tôi cho rằng phòng chống eval là đảm bảo mọi người viết mã phân tích cú pháp JSON an toàn.

Tôi đã nhìn thấy điều này được sử dụng ở một vài nơi khác, nhưng nhiều hơn thế với Google (Mail, Lịch, Danh sách liên hệ, v.v.) Hoàn toàn đủ, Google Tài liệu bắt đầu với &&&START&&& thay vào đó và Danh sách liên hệ của Google dường như bắt đầu bằng while(1); &&&START&&&.

Những gì đang xảy ra ở đây?


3491
2018-04-19 18:00


gốc


Tôi tin rằng ấn tượng đầu tiên của bạn là chính xác. Nếu bạn bắt đầu tìm kiếm mã và cố gắng cắt luồng đầu vào tùy thuộc vào nguồn, bạn sẽ xem xét lại và thực hiện hành động an toàn (và vì hành động của Google, dễ dàng hơn). - Esteban Küber
có thể là một câu hỏi tiếp theo: Tại sao Google thêm vào )]}' bây giờ thay vì while(1);? Câu trả lời có giống nhau không? - Gizmo
Sẽ ngăn chặn eval, nhưng không phải với một vòng lặp vô hạn. - Mardoxx
Điều này )]}' cũng có thể tiết kiệm byte, như sử dụng facebook for(;;); tiết kiệm một byte :) - Gras Double
Theo thứ tự để ngăn chặn sự tiết lộ của json i.e. JSON hijacking - Ashraf.Shk786


Các câu trả lời:


Nó ngăn ngừa JSON hijacking.

Ví dụ được đề xuất: giả sử Google có URL giống mail.google.com/json?action=inbox trả về 50 thư đầu tiên trong hộp thư đến của bạn ở định dạng JSON. Các trang web độc ác trên các miền khác không thể yêu cầu AJAX nhận dữ liệu này do chính sách có cùng nguồn gốc, nhưng chúng có thể bao gồm URL thông qua <script> nhãn. URL được truy cập với của bạn cookie và bởi ghi đè phương thức khởi tạo mảng toàn cục hoặc phương thức truy cập chúng có thể có một phương thức được gọi bất cứ khi nào một thuộc tính (array hoặc hash) được thiết lập, cho phép chúng đọc nội dung JSON.

Các while(1); hoặc là &&&BLAH&&& ngăn chặn điều này: yêu cầu AJAX tại mail.google.com sẽ có toàn quyền truy cập vào nội dung văn bản và có thể xóa nó đi. Nhưng một <script> chèn thẻ một cách mù quáng thực thi JavaScript mà không cần xử lý, dẫn đến vòng lặp vô hạn hoặc lỗi cú pháp.

Điều này không giải quyết được vấn đề giả mạo yêu cầu chéo trang.


3770
2018-04-19 18:11



Tại sao yêu cầu lấy dữ liệu này không yêu cầu mã thông báo CSRF thay thế? - Jakub P.
Làm for(;;); làm cùng một công việc? Tôi đã nhìn thấy điều này trong phản ứng ajax của facebook. - King Julien
@JakubP. Lưu trữ và duy trì CSRF-tokens ở quy mô của Google yêu cầu một lượng lớn cơ sở hạ tầng và chi phí. - abraham
@JakubP. mã thông báo chống CSRF gây rối với bộ nhớ đệm và yêu cầu một số lượng máy chủ đánh giá mật mã. Ở quy mô của Google, điều đó đòi hỏi rất nhiều CPU. Điều này loại offloads nó cho khách hàng. - bluesmoon
Dường như với tôi một cách tốt hơn là để cho máy chủ chỉ gửi JSON nếu tiêu đề chính xác đã được thiết lập. Bạn có thể làm điều đó trong một cuộc gọi AJAX, nhưng không phải với các thẻ script. Bằng cách đó, các thông tin nhạy cảm thậm chí không bao giờ được gửi đi, và bạn không phải dựa vào bảo mật bên trình duyệt. - mcv


Nó ngăn chặn việc tiết lộ phản hồi thông qua việc chiếm đoạt JSON.

Về lý thuyết, nội dung của phản hồi HTTP được bảo vệ bởi Chính sách xuất xứ giống nhau: các trang từ một tên miền không thể nhận được bất kỳ thông tin nào từ các trang trên một tên miền khác (trừ khi được cho phép một cách rõ ràng).

Kẻ tấn công có thể yêu cầu các trang trên các tên miền khác nhân danh bạn, ví dụ: bằng cách sử dụng <script src=...> hoặc là <img>nhưng không thể nhận được bất kỳ thông tin nào về kết quả (tiêu đề, nội dung).

Do đó, nếu bạn truy cập trang của một kẻ tấn công, nó không thể đọc email của bạn từ gmail.com.

Ngoại trừ việc khi sử dụng thẻ script để yêu cầu nội dung JSON, JSON được thực thi dưới dạng Javascript trong môi trường được kiểm soát của kẻ tấn công. Nếu kẻ tấn công có thể thay thế kiến ​​trúc Array hoặc Object hoặc một số phương thức khác được sử dụng trong quá trình xây dựng đối tượng, bất kỳ thứ gì trong JSON sẽ truyền qua mã của kẻ tấn công và được tiết lộ.

Lưu ý rằng điều này xảy ra tại thời điểm JSON được thực thi dưới dạng Javascript, không phải lúc được phân tích cú pháp.

Có nhiều biện pháp truy cập:

Đảm bảo JSON không bao giờ thực thi

Bằng cách đặt while(1); tuyên bố trước dữ liệu JSON, Google đảm bảo rằng dữ liệu JSON không bao giờ được thực thi dưới dạng Javascript.

Chỉ một trang hợp pháp mới có thể thực sự có được toàn bộ nội dung, loại bỏ while(1);và phân tích phần còn lại dưới dạng JSON.

Những thứ như for(;;); đã được xem tại Facebook chẳng hạn, với kết quả tương tự.

Đảm bảo JSON không phải là Javascript hợp lệ

Tương tự, thêm mã thông báo không hợp lệ trước JSON, như &&&START&&&, đảm bảo rằng nó không bao giờ được thực hiện.

Luôn trả về JSON với một đối tượng ở bên ngoài

Đây là OWASP đề nghị cách để bảo vệ khỏi sự xâm nhập của JSON và ít xâm phạm hơn.

Tương tự như các biện pháp đối kháng trước đó, nó đảm bảo rằng JSON không bao giờ được thực thi dưới dạng Javascript.

Một đối tượng JSON hợp lệ, khi không được kèm theo bởi bất kỳ thứ gì, không hợp lệ trong Javascript:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Tuy nhiên, đây là JSON hợp lệ:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Vì vậy, hãy đảm bảo bạn luôn trả về một đối tượng ở cấp cao nhất của phản hồi, đảm bảo rằng JSON không phải là Javascript hợp lệ, trong khi vẫn là JSON hợp lệ.

Như đã lưu ý bởi @hvd trong các chú thích, đối tượng rỗng {} là Javascript hợp lệ và việc biết đối tượng trống là chính nó có thể là thông tin có giá trị.

So sánh các phương pháp trên

Cách OWASP ít xâm nhập, vì nó không cần thay đổi thư viện máy khách và chuyển JSON hợp lệ. Nó không chắc chắn liệu các lỗi trình duyệt trong quá khứ hoặc tương lai có thể đánh bại điều này, tuy nhiên. Như đã lưu ý bởi @oriadam, không rõ liệu dữ liệu có bị rò rỉ trong một lỗi phân tích cú pháp thông qua một lỗi xử lý hay không (ví dụ: window.onerror).

Cách của Google yêu cầu thư viện khách hàng để nó hỗ trợ tự động de-serialization, và có thể được coi là an toàn hơn đối với các lỗi trình duyệt.

Cả hai phương thức đều yêu cầu thay đổi phía máy chủ để tránh các nhà phát triển vô tình gửi JSON dễ bị tổn thương.


445
2018-02-02 12:09



Đề xuất của OWASP rất thú vị vì tính đơn giản của nó. Có ai biết lý do Google có an toàn hơn không? - funroll
tôi tin nó không phải an toàn hơn theo bất kỳ cách nào. Cung cấp OWASP ở đây có vẻ là một lý do đủ tốt cho +1. - vaxquis
Những trình duyệt nào trong năm 2014 cho phép bạn thay thế hàm tạo của Array hoặc Object? - Filipe Giusti
Nó có thể đáng chú ý tại sao trả về một đối tượng theo nghĩa đen không thành công script thẻ hoặc eval chức năng. Niềng răng {} có thể được hiểu như là một khối mã hoặc một đối tượng theo nghĩa đen, và tự nó, JavaScript thích cái cũ hơn. Như một khối mã nó là, tất nhiên, không hợp lệ. Theo logic này, tôi không thể thấy bất kỳ thay đổi nào có thể dự đoán trước trong hành vi của trình duyệt trong tương lai. - Manngo
Mã không hợp lệ là không đủ vì kẻ tấn công cũng có thể chiếm đoạt trình xử lý lỗi-kịch bản của trình duyệt (window.onerror) Tôi không chắc hành vi của onerror với lỗi cú pháp. Tôi đoán Google cũng không chắc chắn. - oriadam


Điều này là để đảm bảo một số trang web khác không thể thực hiện các thủ thuật khó chịu để cố lấy cắp dữ liệu của bạn. Ví dụ, bởi thay thế hàm tạo mảng, sau đó bao gồm URL JSON này qua <script> , một trang web độc hại của bên thứ ba có thể lấy cắp dữ liệu từ phản hồi JSON. Bằng cách đặt while(1); khi bắt đầu, kịch bản sẽ thay thế.

Một yêu cầu cùng một trang web sử dụng XHR và một trình phân tích cú pháp JSON riêng biệt, mặt khác, có thể dễ dàng bỏ qua while(1); tiếp đầu ngữ.


344
2018-05-16 02:08



Về mặt kỹ thuật, trình phân tích cú pháp JSON "bình thường" sẽ đưa ra lỗi nếu bạn có tiền tố. - Matthew Crumley
Kẻ tấn công sẽ chỉ sử dụng một đồng bằng cũ <script> phần tử, không phải là XHR. - Laurence Gonsalves
@Matthew, chắc chắn, nhưng bạn có thể xóa nó trước khi chuyển dữ liệu đến trình phân tích cú pháp JSON. Bạn không thể làm điều đó với một <script> nhãn - bdonlan
Có ví dụ nào về điều này không? Việc thay thế hàm tạo mảng được tham chiếu một lần nữa, nhưng đó là một lỗi được sửa chữa lâu dài. Tôi không hiểu làm thế nào người ta có thể truy cập vào dữ liệu nhận được thông qua thẻ script. Tôi rất muốn nhìn thấy một thực hiện giả mà hoạt động trong trình duyệt gần đây. - Dennis G
@joeltine, không, không phải. Xem stackoverflow.com/questions/16289894/… .


Điều đó sẽ gây khó khăn cho bên thứ ba để chèn phản hồi JSON vào một tài liệu HTML với <script> nhãn. Hãy nhớ rằng <script> thẻ được miễn Chính sách xuất xứ giống nhau.


98
2018-04-19 18:04



Đây chỉ là một nửa câu trả lời. Nếu nó không phải là lừa gạt Object và Arraycác nhà xây dựng, thực hiện một phản hồi JSON hợp lệ như thể JavaScript là hoàn toàn vô hại trong mọi trường hợp. Vâng while(1); ngăn không cho phản hồi được thực thi dưới dạng JavaScript nếu được nhắm mục tiêu bởi <script> nhưng câu trả lời của bạn không giải thích tại sao điều đó là cần thiết. - Mark Amery
nhưng làm thế nào nó sẽ ngăn chặn iframe - Ravinder Payal
@RavinderPayal <iframe> các thẻ không được miễn trừ Chính sách xuất xứ giống nhau ... - YoYoYonnY
Thẻ tập lệnh không bao giờ được miễn trừ chính sách gốc. Bạn có thể xóa nó cho tôi không? - Suraj Jain


Nó ngăn không cho nó được sử dụng làm mục tiêu đơn giản <script> nhãn. (Vâng, nó không ngăn chặn nó, nhưng nó làm cho nó khó chịu.) Đó là cách kẻ xấu không thể chỉ cần đặt thẻ script đó trong trang web của riêng họ và dựa vào một phiên hoạt động để làm cho nó có thể lấy nội dung của bạn.

chỉnh sửa - lưu ý nhận xét (và các câu trả lời khác). Vấn đề phải làm với các tiện ích tích hợp bị lật đổ, cụ thể là Object và Array nhà thầu. Chúng có thể được thay đổi sao cho JSON vô hại vô hại, khi được phân tích cú pháp, có thể kích hoạt mã tấn công.


65
2018-04-19 18:02



Đây chỉ là một nửa câu trả lời. Nếu nó không phải là lừa gạt Object và Arraycác nhà xây dựng, thực hiện một phản hồi JSON hợp lệ như thể JavaScript là hoàn toàn vô hại trong mọi trường hợp. Vâng while(1); ngăn không cho phản hồi được thực thi dưới dạng JavaScript nếu được nhắm mục tiêu bởi <script> nhưng câu trả lời của bạn không giải thích tại sao điều đó là cần thiết. - Mark Amery


Kể từ khi <script> thẻ được miễn khỏi Chính sách xuất xứ tương tự, đây là một điều cần thiết về bảo mật trong thế giới web, trong khi (1) khi được thêm vào phản hồi JSON ngăn việc lạm dụng nó trong <script>nhãn.


3
2017-08-18 04:14