Có phải JSON Hijacking vẫn là một vấn đề trong các trình duyệt hiện đại?


149

Tôi đang sử dụng Backbone.js và máy chủ web Tornado. Hành vi tiêu chuẩn để nhận dữ liệu thu thập trong Backbone là gửi dưới dạng JSON Array.

Mặt khác, hành vi tiêu chuẩn của Tornado là không cho phép JSON Array do lỗ hổng sau:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subussy-json-vulnerability.aspx

Một liên quan là: http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Tôi cảm thấy tự nhiên hơn khi không phải bọc JSON của mình trong một đối tượng khi nó thực sự là một danh sách các đối tượng.

Tôi không thể tái tạo các cuộc tấn công này trong các trình duyệt hiện đại (ví dụ Chrome, Firefox, Safari và IE9 hiện tại). Đồng thời tôi không thể xác nhận bất cứ nơi nào các trình duyệt hiện đại đã giải quyết các vấn đề này.

Để đảm bảo rằng tôi không bị đánh lừa bởi bất kỳ kỹ năng lập trình kém hay kỹ năng lập trình kém nào:

Có phải các cuộc tấn công Hijacking JSON này vẫn còn là một vấn đề ngày nay trong các trình duyệt hiện đại?

(Lưu ý: Xin lỗi vì sự trùng lặp có thể: Có thể làm 'JSON tặc' trên trình duyệt hiện đại? Nhưng kể từ khi câu trả lời được chấp nhận dường như không trả lời câu hỏi - Tôi nghĩ đó là thời gian để hỏi nó một lần nữa và nhận được một số lời giải thích rõ ràng hơn .)


dùng eval? sau đó có thể khác. Nếu không có gì bị thay đổi hoặc thay đổi theo cách phân tích phản hồi xương sống thì bạn nên an toàn
Deeptechtons

10
Nói chung, bạn không bao giờ nên tiếp cận bảo mật web với giả định rằng ai đó sẽ sử dụng trình duyệt "hiện đại".
Lu-ca

7
@Luke - Xem bình luận bên dưới để Reid. Điểm tuyệt vời nói chung - nhưng tôi không hỏi một câu hỏi bảo mật chung. (Người dùng của tôi sẽ chỉ có thể xác thực nếu họ đang sử dụng trình duyệt hiện đại ở nơi đầu tiên.)
Rocketman

4
@Luke, đôi khi chúng tôi phải tiếp tục và cho phép chúng tôi phát triển với các mẫu hiện đại (chẳng hạn như REST trong trường hợp này: lấy dữ liệu là thao tác GET và không nên là thứ gì khác) mà không bảo vệ chống lại các mối đe dọa cũ nếu bây giờ chúng chỉ xuất hiện để áp dụng đến một đối tượng nhỏ. Vì vậy, câu hỏi này thực sự có giá trị, để cho phép một người đánh giá liệu anh ta có thể bỏ qua mối đe dọa này hay không cho trường hợp ứng dụng của mình. Tại một số điểm, người dùng có phần mềm rất lỗi thời rất có thể có các loại mối đe dọa (phần mềm độc hại) khác mà từ đó chúng tôi sẽ không thể bảo vệ chúng.
Frédéric

2
@jpaugh, bạn thấy những giả định như vậy ở đâu? Tôi chỉ phần nào cho rằng những người có phần mềm lỗi thời như vậy dù sao cũng "không thể bảo vệ được". (Về việc chứng minh chi phí cho giày trượt của tôi, tôi đã quen với một phần ba giá của chúng trong giày trượt tốc độ carbon đã bị hao mòn trong chưa đầy một phần ba thời gian tôi phải mang giày trượt băng hiện tại. Và dù sao, tôi nghĩ rằng chúng đáng giá, miễn là bạn thích cưỡi chúng, đó là trường hợp của tôi.)
Frédéric

Câu trả lời:


112

Không, không còn có thể nắm bắt các giá trị được chuyển đến []hoặc các nhà {}xây dựng trong Firefox 21, Chrome 27 hoặc IE 10. Đây là một trang thử nghiệm nhỏ, dựa trên các cuộc tấn công chính được mô tả trong http://www.thespanner.co.uk / 2011/05/30 / json-cướp / :

( http://jsfiddle.net/ph3Uv/2/ )

var capture = function() {
    var ta = document.querySelector('textarea')
	ta.innerHTML = '';
	ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
	return arguments;
}
var original = Array;

var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
    var isOn = toggle.checked;
    window.Array = isOn ? capture : original;
    if (isOn) {
        Object.defineProperty(Object.prototype, 'foo', {set: capture});    
    } else {
        delete Object.prototype.foo;
    }
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();

[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
    el.addEventListener('click', function() {
        document.querySelector('textarea').innerHTML = 'Safe.';
        eval(this.value);
    });
});
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>

Nó ghi đè window.Arrayvà thêm một trình thiết lập Object.prototype.foovà kiểm tra khởi tạo mảng và đối tượng thông qua các hình thức ngắn và dài.

Thông số ES4 , trong phần 1.5, "yêu cầu các ràng buộc tiêu chuẩn, toàn cầu của Object và Array được sử dụng để xây dựng các đối tượng mới cho các trình khởi tạo đối tượng và mảng" và ghi chú trong "Precentent" mà Internet Explorer 6, Opera 9.20 và Safari 3 thực hiện không tôn trọng các phản ứng cục bộ hoặc toàn cầu của Object và Array, nhưng sử dụng các hàm tạo Object và Array gốc. " Điều này được giữ lại trong ES5, phần 11.1.4 .

Allen Wirfs-Brock giải thích rằng ES5 cũng chỉ định rằng việc khởi tạo đối tượng không nên kích hoạt setters, vì nó sử dụng DefineOwnProperty. MDN: Làm việc với các đối tượng lưu ý rằng "Bắt đầu trong JavaScript 1.8.1, setters không còn được gọi khi thiết lập các thuộc tính trong các trình khởi tạo đối tượng và mảng." Điều này đã được giải quyết trong vấn đề V8 1015 .


28
Trở lại năm 2009, Brendan Eich đã đề xuất rằng các trình duyệt không đánh giá các tập lệnh được phân phát dưới dạng application / json ( bugzilla.mozilla.org/show_orms.cgi?id=376957#c75 ), đây vẫn có vẻ là một ý tưởng tốt đối với tôi.

2
Lưu ý rằng POST CSRF mù vẫn có thể sử dụng các biểu mẫu, đặc biệt với mã hóa văn bản / thuần túy và cần phải bị đánh bại bằng cách sử dụng mã thông báo / nonces.

1
Có cho POST CSRF. Cảm ơn tất cả các thông tin tuyệt vời của bạn ở đây.
Rocketman

5
Tuyên bố của bạn là chính xác khi nó chỉ đề cập đến việc ghi đè đơn giản của hàm tạo Array. Mặc dù vậy, microsofts IE và Edge vẫn dễ bị tấn công khi chiếm quyền điều khiển JSON UTF-7. Đã thử nghiệm nó gần đây (và cho vui ngày hôm nay một lần nữa), và nó vẫn hoạt động.
dùng857990

2
UTF-16BE cũng vậy, cảm ơn Gareth Heyes, blog.portswigger.net/2016/11/json-hijacking-for-modern-web.html
lươn ghEEz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.