2017-09-26 2 views
0

내 URL의 해시를 가져 와서 정보를 사용하여 내 페이지의 다른 요소에 클래스를 설정할 수 있습니다. 이렇게하는 것은 간단하지만 XSS를 사용하여 취약해질 수 있으며 set 변수를 사용하기 전에 위생적으로 만들고 싶습니다. 문제는 그것이 작동하도록 할 수 없다는 것입니다.자바 스크립트에서 작동하도록 대체 할 수 없습니다.

예를 들어, url : www.my-domain.com/#gallery에서 "gallery"에 "hash"라는 변수를 설정하고 싶습니다.

하지만이 내용이 www.my-domain.com/#Hello<script>malicious payload</script>과 같은지 확인하고 싶습니다. 3E

난 그냥 안녕하세요을받을 것으로 예상 안녕하세요 % 3Cscript % 3Enasty % 20payload % 3C/스크립트 %

문제는 콘솔이 다음과 같은보고 있다는 것입니다. 그래서, 분명히 나는 ​​잘못된 것을하고 있습니다. 그러나 나는 그것을 알아 내지 못합니다. 나는이 같은 일을 시도

<script type="text/javascript"> 
     jQuery(document).ready(function(){ 
      var hash = document.URL.substr(document.URL.indexOf('#')+1); 

      hash = hash.replace(/<script[^>]*?>.*?<\/script>/gi, ''). 
        replace(/<[\/\!]*?[^<>]*?>/gi, ''). 
        replace(/<style[^>]*?>.*?<\/style>/gi, ''). 
        replace(/<![\s\S]*?--[ \t\n\r]*>/gi, ''); 
      console.log(hash); //Check the result in the console 
       if (hash === 'gallery' || hash === 'galleria' || hash === 'galleri') { 
        jQuery('#prod_description').removeClass('uk-active'); 
        jQuery('#prod_gallery').addClass('uk-active'); 
       } else 
        if (hash === 'relations') { 
        jQuery('#prod_description').removeClass('uk-active'); 
        jQuery('#prod_relation').addClass('uk-active'); 
       } else 
        if (hash === 'other') { 
        jQuery('#prod_description').removeClass('uk-active'); 
        jQuery('#prod_other').addClass('uk-active'); 
       } else 
        if (hash === 'promotion') { 
        jQuery('#prod_description').removeClass('uk-active'); 
        jQuery('#prod_promotion').addClass('uk-active');       
       } 
      } 
     ); 
    </script> 

:

내 코드입니다 .replace ('L', '') 예상대로 즉, 첫 번째 인스턴스 작품 '해시의 난'이다 결과에서 제거되었습니다. 어느 날 내 정규 표현식이 잘못되었다고 생각하게 만들었으므로 다음과 같은 훨씬 간단한 접근법을 시도했습니다. .replace (/ [^ 0-9a-z]/gi, '')하지만 그 중 하나는 작동하지 않습니다.

나는 무엇을하고 있는지에 대한 생각을 잘못하고 있습니까?

+1

잘 dencode하지 않았다. – epascarello

답변

0

간단한 indexOf을 수행 할 수 있습니다. 데이터가 eval이 아닌지 확인하십시오. 서버 쪽에서 보낸다면 제대로 처리해야합니다.

끝없는 가능성이 있기 때문에 이런 식으로 교체하면 안됩니다.

예 :

var h = decodeURIComponent(window.location.hash.substr(1)); 
if (h.indexOf('promotion') > -1) { 
    // do some logic 
} 
+0

필자는 이전에 발견하지 못했던이 indexOf를 이해하고 싶다. 만약 내가 올바르게 이해한다면 : if (hash.indexOf ('promotion')> -1 {myLogic};) 여러개의 유효 문자열을 검사하고 싶다면 원래 예제에서 gallery, galleri, galleria를 유효한 문자열. 이들 중 하나를 확인하고 논리를 실행할 수 또는 하나씩 그들을 테스트 할 필요가 있습니다. 또한 해시 경우 논리를 실행하는이 접근 방식 :/# junkjunk junkjunk도 – Carramone

+0

' indexOf'는 제공된 문자열 내에서 지정된 부분 문자열을 찾습니다. 따라서 해쉬가'junk ___ junk_mystring_junk ** __'이고's.indexOf ('mystring')하면 제공된 문자열에서 해당 부분 문자열이 발견되는 색인을 반환합니다 문자열, 또는 -1을 찾을 수없는 경우 – epoch

+0

괜찮지 만 해시 Junk___gallery___junk___promotion___junk가 있고이를 테스트 할 경우 : if (hash.indexOf ('promotion')> -1 {myLogic} else if (hash.indexOf ('gal lery ')> -1 {myLogic}; 두 논리가 모두 실행된다는 것을 의미하지 않을까요? – Carramone

1

당신이 페이지에 직접 그 해시를 넣어하지 않는 한 당신이 그것을

var hash = decodeURIComponent(window.location.hash.substr(1)); 

를 디코딩 할 수 있도록 잘 그것은이 인코딩, 해시에서 해당 스크립트 태그는, 아무것도 할 일이 일어날 수있는 유일한 일을하려고하지 않습니다 당신의 문자열 비교에서 일치하지 않을 것입니다.

2

하지만 난이

을 수행하여 당신은 아니에요 XSS에 취약 할 수 있다는 걱정 - 당신이하지 않기 때문에 해시를 출력 어디에서나 HTML 컨텍스트의 값.

여기서하고있는 일은 여러 텍스트 리터럴과 비교하는 것입니다. foo<script>malicious()</script>과 같이 foo<script>malicious()</script>gallery과 비교하면 전혀 변하지 않으므로 hash 변수의 값은 입니다.이 경우에는 false가됩니다. 단순히 문자열을 비교하는 코드는 실행되지 않습니다.

페이지에 값을 삽입하지 않는 한 여기에 XSS 위험이 없습니다.물건을 교체하려고 시도했던 선을 완전히 제거 할 수 있습니다.

+0

나는 이것을 듣기 위해 매우 안심입니다. 감사. 문제는 스크립트를 확장하여 제공된 해시와 페이지의 사용 가능한 모든 ID를 비교할 생각입니다. 이유는 내가 이런 식으로 문자열 검사를 하드 코딩해야하기 싫기 때문입니다. 예를 들어 ID = "TheBestID"를 요소에 설정하면 #TheBestID가 URL과 함께 제공되면 논리가 작동하는지 확인하려고합니다. 하지만 실제로 변수 "해시"를 출력으로 사용하지 않는 한 안전해야합니다. 다시 한 번 감사드립니다! – Carramone

+0

값만 비교하는 한 여전히 괜찮습니다. XSS는 코드가 문서 내부에 배치되고 HTML로 해석되도록 요구합니다. 예를 들어'someElement.innerHTML = hash;'와 같은 것을 할 경우 _that_이 XSS 문제 일 수 있습니다. – CBroe

관련 문제