Google이 JSON 응답 앞에 (1)을 추가하는 이유는 무엇입니까?
은 왜 ""를 선두에 ?while(1);
JSON의 (개인) 응답에 대해 어떻게 생각하십니까?
예를 들어, Google 캘린더에서 캘린더를 설정하거나 해제할 때 다음과 같은 응답이 있습니다.
while (1);
[
['u', [
['smsSentFlag', 'false'],
['hideInvitations', 'false'],
['remindOnRespondedEventsOnly', 'true'],
['hideInvitations_remindOnRespondedEventsOnly', 'false_true'],
['Calendar ID stripped for privacy', 'false'],
['smsVerifiedFlag', 'true']
]]
]
위한 합니다.eval()
위에 있지만, 해야 할 은 '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥' '그냥'을 바꾸면 요'while
해석코드를 합니다.평가 예방은 사람들이 안전한 JSON 구문 분석 코드를 작성하도록 하는 것이라고 생각합니다.
다른 곳에서도 사용되지만 Google(메일, 캘린더, 연락처 등)에서는 훨씬 더 많이 사용됩니다.이상하게도 Google Docs는&&&START&&&
는 "로하는 것 같습니다.while(1); &&&START&&&
.
이게 무슨 일이야?
ECMAScript 5를 통해 2011년 이후 모든 주요 브라우저에서 공식적으로 수정된 주요 JSON 보안 문제인 JSON 하이잭을 방지합니다.
된 예:은 다음과 같습니다: "URL" "" "URL은 "URL"입니다.mail.google.com/json?action=inbox
그러면 받은 편지함의 처음 50개의 메시지가 JSON 형식으로 반환됩니다.인 웹 정책 에 이 요청을 수 , 이은 AJAX를 통해 할 수 .<script>
태그. URL은 쿠키와 함께 방문되며, 글로벌 배열 생성자 또는 접근자 메서드를 재정의하여 오브젝트(배열 또는 해시) 속성이 설정될 때마다 호출되는 메서드를 가질 수 있으며, 이를 통해 JSON 콘텐츠를 읽을 수 있습니다.
while(1);
★★★★★★★★★★★★★★★★★」&&&BLAH&&&
는 이를는 다음과 같습니다.mail.google.com
텍스트 콘텐츠에 대한 전체 액세스 권한을 가지며 삭제할 수 있습니다....<script>
태그 삽입은 처리 없이 JavaScript를 맹목적으로 실행하므로 무한 루프 또는 구문 오류가 발생합니다.
JSON 하이잭을 통한 대응 공개를 방지합니다.
이론적으로 HTTP 응답의 내용은 동일한 오리진 정책에 의해 보호됩니다.한 도메인의 페이지는 명시적으로 허가되지 않는 한 다른 도메인의 페이지에서 정보를 얻을 수 없습니다.
는 사용자 다른 할 수 . 사용자 대신 "Deager"를 합니다. ★★★★★★★★★★★★★★★★★,<script src=...>
★★★★★★★★★★★★★★★★★」<img>
태그는 지정되지만 결과(예, 내용)에 대한 정보를 얻을 수 없습니다.
따라서 공격자 페이지를 방문해도 gmail.com에서 사용자의 이메일을 읽을 수 없습니다.
스크립트 태그를 사용하여 JSON 콘텐츠를 요청할 때 JSON은 공격자가 제어하는 환경에서 JavaScript로 실행됩니다.공격자가 Array 또는 Object Constructor 또는 객체 구축 중에 사용된 다른 메서드를 대체할 수 있는 경우 JSON 내의 모든 것이 공격자의 코드를 통과하여 공개됩니다.
이 문제는 JSON이 해석될 때가 아니라 JavaScript로 실행될 때 발생합니다.
다음과 같은 여러 가지 대책이 있습니다.
JSON이 실행되지 않는지 확인
「 」를 while(1);
JSON JSON 자바스크립트
수 것은 내용을 할 수 없습니다.while(1);
JSON을 사용하다
★★★★★★★★★★★★★★★★★★★ 등for(;;);
예를 들어 페이스북에서도 같은 결과가 나왔습니다.
JSON이 유효한 JavaScript가 아닌지 확인
앞에 합니다.를 들어, 「JSON」은 「JSON」이라고 하는 입니다.&&&START&&&
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.
항상 외부에 있는 개체와 함께 JSON을 반환
이것은 JSON의 하이잭으로부터 보호하기 위해 OWASP가 권장하는 방법으로, 침입이 적은 방법입니다.
이전 대책과 마찬가지로 JSON이 JavaScript로 실행되지 않도록 합니다.
유효한 오브젝트는 있지 않은 JavaScript에서는 .JSON 오브젝트는 JavaScript에서 할 수 없습니다.★★★★★★★★★★★★★★★★★★,{ }
코드 블록으로 해석됩니다.
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
단, 이것은 유효한 JSON입니다.
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
따라서 항상 응답 최상위 수준에서 개체를 반환하고 JSON이 유효한 반면 JSON은 유효한 JavaScript가 아닌지 확인하십시오.
빈 오브젝트 「@hvd」는 「@hvd」로 되어 .{}
자바스크립트개체가 비어 있는 것을 아는 것 자체가 귀중한 정보일 수 있습니다.
상기 방법의 비교
OWASP 방식은 클라이언트라이브러리를 변경할 필요가 없고 유효한 JSON을 전송하기 때문에 간섭이 적습니다.그러나 과거의 브라우저 버그나 미래의 브라우저 버그가 이를 극복할 수 있을지는 확실하지 않습니다.@oriadam이 지적한 바와 같이 오류 처리를 통해 해석 오류로 데이터가 유출될 수 있는지 여부(예: window.onerror)가 불분명합니다.
Google의 방법은 자동 직렬화를 지원하기 위해 클라이언트 라이브러리가 필요하며 브라우저 버그에 대해 더 안전하다고 간주할 수 있습니다.
두 방법 모두 개발자가 실수로 취약한 JSON을 전송하지 않도록 서버 측을 변경해야 합니다.
이는 다른 사이트가 사용자의 데이터를 훔치려고 하는 비열한 속임수를 쓰지 못하도록 하기 위한 것입니다.예를 들어 어레이 컨스트럭터를 교체한 후 를 통해 이 JSON URL을 포함하면<script>
태그: 악의적인 서드파티 사이트가 JSON 응답에서 데이터를 훔칠 수 있습니다.를으 a a를 while(1);
이치노
와의 JSON에서는, 「」, 「XHR」, 「JSON」은 무시되기 .while(1);
프레픽스
응답을 .<script>
. 억해해기<script>
태그는 같은 오리진정책에서 면제됩니다.
주의: 2019년 현재, 이 질문에서 설명하는 예방 조치로 이어지는 오래된 취약성의 대부분은 최신 브라우저에서는 더 이상 문제가 되지 않습니다.역사적 호기심으로 아래에 답변을 남깁니다만, 실제로 토픽 전체가 2010년(!!)부터 크게 바뀌었습니다.
단순한 타겟으로 사용되는 것을 방지합니다.<script>
태그를 붙입니다.(음, 예방은 안 되지만 불쾌하게 만듭니다.)이렇게 하면 악당은 스크립트 태그를 자신의 사이트에 삽입하고 액티브한 세션에 의존하여 콘텐츠를 가져올 수 없습니다.
edit : 코멘트(및 기타 응답)를 기록합니다.이 문제는 전복된 빌트인 설비, 특히Object
★★★★★★★★★★★★★★★★★」Array
「 「」는, 공격자 코드를 할 수 할 수 .이 경우, 무해한 JSON이 해석되었을 때 공격자 코드를 트리거할 수 있도록 변경할 수 있습니다.
★★★★★★★★★★★★★★★★★.<script>
는, , 「됩니다.while(1)
으로써 JSON 합니다.<script>
이것은 높은 트래픽 포스트이기 때문에, 원래의 질문에 조금 더 불명확한 답변을 여기서 제공하고, 따라서 JSON 납치 공격과 그 결과에 대한 추가 배경을 제공하고 싶습니다.
JSON 하이잭은 이름에서 알 수 있듯이 크로스 사이트 요청 위조와 유사한 공격입니다.이 공격에서는 공격자가 중요한 데이터를 어레이 리터럴로 GET 요청에 반환하는 애플리케이션에서 도메인 간 기밀 JSON 데이터에 액세스할 수 있습니다.어레이 리터럴을 반환하는 JSON 콜의 예를 다음에 나타냅니다.
[{"id":"1001","ccnum":"4111111111111111","balance":"2345.15"},
{"id":"1002","ccnum":"5555555555554444","balance":"10345.00"},
{"id":"1003","ccnum":"5105105105105100","balance":"6250.50"}]
이 공격은 다음 3가지 주요 단계로 이루어집니다.
순서 1: 인증된 사용자가 악의적인 페이지를 방문하도록 합니다.스텝 2: 악의적인 페이지는 사용자가 로그인한 응용 프로그램에서 중요한 데이터에 액세스하려고 시도합니다.스크립트 태그에는 동일한 원본 정책이 적용되지 않으므로 HTML 페이지에 스크립트 태그를 포함하면 됩니다.
<script src="http://<jsonsite>/json_server.php"></script>
을 "GET"으로 .json_server.php
사용자의 인증 쿠키가 요청과 함께 전송됩니다.스텝 3: 이 시점에서 악의적인 사이트는 스크립트를 실행한 상태에서는 기밀 데이터에 액세스할 수 없습니다.오브젝트 프로토타입 세터를 사용하여 데이터에 액세스할 수 있습니다.. 이때 프로토타입 속성은 "개체 프로토타입 설정"을합니다.ccnum
「프로퍼티.
Object.prototype.__defineSetter__('ccnum',function(obj){
secrets =secrets.concat(" ", obj);
});
인 '타격'에 했습니다.(ccnum)
byjson_server.php
JSON
모든 브라우저가 이 방법을 지원하는 것은 아닙니다.파이어폭스 3.X자형되어 「」로 되었습니다.useObject.defineProperty
이 JavaScript "JavaScript")가 있는 모든 .pi=3.14159
JSON 배열 대신 )이 반환됩니다.
JSON 하이잭을 방지하는 방법은 다음과 같습니다.
SCRIPT 태그는 HTTP GET 요구만 생성할 수 있으므로 POST 요구에 대한 JSON 개체만 반환합니다.
웹 브라우저가 JSON 개체를 유효한 JavaScript 코드로 해석하지 못하도록 합니다.
모든 JSON 요청에 대해 사전 정의된 랜덤 값이 필요하도록 요구함으로써 사이트 간 요청 위조 방지 기능을 구현합니다.
While(1)
마지막 옵션 아래에 있습니다.으로 말하면, '우리'는 '우리'입니다.while(1)
는 브레이크 스테이트먼트가 명시적으로 발행될 때까지 실행되는 무한 루프입니다.따라서 키를 적용하기 위한 잠금(구글 브레이크 스테이트먼트)이라고 할 수 있습니다.따라서 해커가 키를 가지고 있지 않은 JSON 하이잭은 일관되게 무시됩니다.JSON의 JSON은 (1)의 JSON이 있다.
이 책은while(1)
루프는 구글이 데이터 흐름을 제어하기 위해 사용할 수 있는 단순한 브레이크 스테이트먼트 사이퍼로 더 쉽게 시각화 될 수 있습니다.
그러나 그 문장의 키워드는 '단순'입니다.인증된 무한 루프의 사용은 다행히 분리 시 CPU 사용률이 절대적으로 낮아지기 때문에 2010년 이후 몇 년 동안 기본 관행에서 제외되었습니다(또한 인터넷은 '퀵 픽스'를 통한 강제에서 벗어났습니다).오늘날 코드베이스에는 예방책이 포함되어 있어 시스템은 더 이상 중요하거나 효과적이지 않습니다(이것의 일부는 JSON Hijacking에서 현재는 사용하지 않는 보다 효과적인 데이터 팜 기술로 이행하는 것입니다).
인증이 시행되면 JSON 하이잭 보호는 다양한 형태로 이루어집니다.Google은 (1)을 JSON 데이터에 추가하므로 악의적인 스크립트가 이를 평가할 경우 해당 스크립트는 무한 루프에 들어갑니다.
레퍼런스:Web Security Testing 요리책: 문제를 신속하게 발견하는 체계적인 기술
언급URL : https://stackoverflow.com/questions/871505/why-have-while1-in-xmlhttprequest-response
'source' 카테고리의 다른 글
'data:font/woff.....' 글꼴 로드를 거부했습니다. 이는 "default-src 'self' 컨텐츠 보안 정책 지시문을 위반합니다.'font-src'는 (0) | 2023.03.15 |
---|---|
Wordpress에서 홈 페이지로 다시 연결 (0) | 2023.03.15 |
get_module은 플러그인에서 "구체 분류법"을 제공합니다. (0) | 2023.03.15 |
@Scope("protype") bean 스코프가 새로운 bean을 생성하지 않음 (0) | 2023.03.15 |
PyMongo를 사용하여 regex 쿼리 수행 (0) | 2023.03.15 |