Programing

'for (;;);와 같은 Ajax 호출 응답은 무엇입니까?

lottogame 2020. 5. 11. 07:56
반응형

'for (;;);와 같은 Ajax 호출 응답은 무엇입니까? {json data} '의미? [복제]


가능한 중복 :
사람들이 왜“throw 1; <악 하지마 >>와 "for (;;);" json 응답 앞에?

Ajax 호출을 위해 Facebook에서 이러한 종류의 구문이 사용되고 있음을 발견했습니다. 나는 for (;;);응답의 시작 부분에서 혼란스러워합니다 . 무엇을 위해 사용됩니까?

이것은 전화와 응답입니다.

GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0

응답:

for (;;);{"t":"continue"}

나는 조금 늦었고 TJ는 기본적으로 수수께끼를 해결했지만, 좋은 예가 있고이 메커니즘에 대한 더 깊은 통찰력을 제공하는이 특정 주제에 대한 훌륭한 논문을 공유 할 것이라고 생각했습니다.

이러한 무한 루프는 Jeremiah Grossman 이 발행 한 Gmail에 대한 공격으로 대중의 주목을받는 일종의 공격 인 "자바 스크립트 하이재킹"에 대한 대책 입니다.

아이디어는 매우 간단합니다. 많은 사용자가 Gmail이나 Facebook에 영구적으로 로그인하는 경향이 있습니다. 따라서 사이트를 설정하고 악의적 인 사이트의 Javascript에서 객체 또는 배열 생성자를 재정의합니다.

function Object() {
    //Make an Ajax request to your malicious site exposing the object data
}

그런 다음 <script>해당 사이트에 태그 를 포함 시킵니다.

<script src="http://www.example.com/object.json"></script>

마지막으로 악성 서버 로그에서 JSON 객체에 대한 모든 내용을 읽을 수 있습니다.

약속 한대로 용지에 대한 링크 .


나는 그것이 통제가있는 주된 이유를 의심합니다. 그것은 강제로 아약스를 통해,하지 (사용 JSON-P 또는 유사한을 통해 데이터를 검색 할 script그 때문에 실패 때문에 태그를하고 for, 따라서 보장 루프는 무한하다) 같은 기원 정책 에 발 차기. 이것은 어떤 문서들을 제어 할 수 있습니다 API 호출, 특히 해당 API 호출과 동일한 출처를 가진 문서 또는 Facebook이 CORS (CORS를 지원하는 브라우저) 를 통해 액세스 권한을 부여한 문서 만 발행 할 수 있습니다 . 따라서 브라우저가 SOP를 시행하는 메커니즘을 통해 데이터를 요청해야하며 데이터를 역 직렬화하기 전에 해당 서문을 알고 제거해야합니다.

따라서 해당 데이터에 대한 (유용한) 액세스 제어에 관한 것입니다.


Facebook에는 많은 프로젝트에서 내부적으로 작업하는 수많은 개발자가 있으며, 사소한 실수를 저지르는 것은 매우 흔한 일입니다. HTML 또는 SQL 템플릿에 삽입 된 데이터를 이스케이프 처리하지 못하는 것만 큼 간단하고 진지하거나 " eval비효율적이며 논란의 여지 JSON.parse가없는"또는 "알려지지는 않지만 일반적으로 구현되지 않은 확장" 을 사용하는 것처럼 복잡하고 미묘한 것 좋은 JSON 디코더를 사용하려면이 개발자 집단에 모범 사례를 쉽게 적용 할 수있는 방법을 찾아야합니다.

이러한 도전에 직면하기 위해 Facebook은 최근에 이러한 모범 사례를 적절하게 시행하도록 설계된 내부 프로젝트를 통해 "전반적으로"진행되고 있으며,이 특정 사례에 진정으로 적합한 유일한 설명은 정직합니다. 파싱은 핵심 라이브러리에서 단일 구현을 거쳐야하며이를 구현하는 가장 좋은 방법은 모든 단일 API 응답이 for(;;);자동으로 전면에 고정되도록하는 것입니다.

그렇게하면 개발자는 "게으른"사람이 될 수 없습니다. 개발자는를 사용하는 경우 즉시 알아 차리고 eval()무슨 일이 있었는지 궁금해하고 실수를 깨닫고 승인 된 JSON API를 사용합니다.

제공되는 다른 답변은 모두 두 가지 범주 중 하나에 해당합니다.

  1. JSONP 오해 또는
  2. "JSON 하이재킹"오해.

첫 번째 범주의 사람들은 공격자가이를 지원하지 않는 API에 "JSONP를 사용하여"요청을 할 수 있다는 아이디어에 의존합니다. JSONP는 서버와 클라이언트 모두에서 지원되어야하는 프로토콜입니다 myFunction({"t":"continue"}). 결과는 로컬 함수로 전달되도록 서버가 비슷한 것을 반환해야합니다 . 우연히 "JSONP"를 사용할 수는 없습니다.

두 번째 범주의 사람들은 태그를 통해 JSONP를 사용 하지 않는 API (예 : 이와 같은)에 대한 사이트 간 요청 위조를 허용하여 "JSON 하이재킹"형식을 허용하는 것으로 설명 된 매우 실제적인 취약점을 인용하고 있습니다. 이는 배열 / 객체 생성자를 변경하여 수행되므로 랩핑 기능없이 서버에서 반환되는 정보에 액세스 할 수 있습니다.

그러나이 경우에는 단순히 불가능합니다. 작동하는 이유는 유명한 배열 (예 : 유명한 Gmail 예제와 같은 많은 JSON API의 가능한 결과)이 유효한 표현식 문이기 때문입니다. 나체.

실제로 JSON으로 정의 된 객체 (이 예제에서 볼 수있는 필드 이름 주위에 따옴표 포함)의 구문은 블록의 구문과 충돌하므로 스크립트의 최상위 수준에서 사용할 수 없습니다.

js> {"t":"continue"}
typein:2: SyntaxError: invalid label:
typein:2: {"t":"continue"}
typein:2: ....^

이 예제를 Object () 생성자 리매핑을 통해 이용할 수 있으려면 API가 대신 괄호 안에 객체를 반환하여 유효한 JavaScript가 아닌 유효한 JSON으로 만들어야합니다.

js> ({"t":"continue"})
[object Object]

지금, 그것은 이 있다고 할 for(;;);접두사 트릭은 "실수로"이 예에 표시 아니라, 실제로 배열을 반환하는 다른 내부 페이스 북의 API에 의해 반환되는; 그러나이 경우 실제로 주목해야 할 이유 for(;;);는이 특정 스 니펫에 나타나는 '실제'원인 일 수 있기 때문입니다 .


Well the for(;;); is an infinite loop (you can use Chrome's JavaScript console to run that code in a tab if you want, and then watch the CPU-usage in the task manager go through the roof until the browser kills the tab).

So I suspect that maybe it is being put there to frustrate anyone attempting to parse the response using eval or any other technique that executes the returned data.

To explain further, it used to be fairly commonplace to parse a bit of JSON-formatted data using JavaScript's eval() function, by doing something like:

var parsedJson = eval('(' + jsonString + ')');

...this is considered unsafe, however, as if for some reason your JSON-formatted data contains executable JavaScript code instead of (or in addition to) JSON-formatted data then that code will be executed by the eval(). This means that if you are talking with an untrusted server, or if someone compromises a trusted server, then they can run arbitrary code on your page.

Because of this, using things like eval() to parse JSON-formatted data is generally frowned upon, and the for(;;); statement in the Facebook JSON will prevent people from parsing the data that way. Anyone that tries will get an infinite loop. So essentially, it's like Facebook is trying to enforce that people work with its API in a way that doesn't leave them vulnerable to future exploits that try to hijack the Facebook API to use as a vector.


This looks like a hack to prevent a CSRF attack. There are browser-specific ways to hook into object creation, so a malicious website could use do that first, and then have the following:

<script src="http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0" />

If there weren't an infinite loop before the JSON, an object would be created, since JSON can be eval()ed as javascript, and the hooks would detect it and sniff the object members.

Now if you visit that site from a browser, while logged into Facebook, it can get at your data as if it were you, and then send it back to its own server via e.g., an AJAX or javascript post.

참고URL : https://stackoverflow.com/questions/6339790/what-does-a-ajax-call-response-like-for-json-data-mean

반응형