기본 내장 함수나 객체의 문자를 사용하는 방법
내장 함수나 객체를 toString 함수를 이용하여 문자열로 변경하는 방식이다.
history.toString()은 [object History]라는 문자열을 반환하고, URL.toString()은 function URL() { [native code] } 문자열을 반환한다. 코드에 history+'c' , URL+3, URL+[] 같은 부분이 보이는데 이 처럼 함수나 객체와 산술 연산을 수행하면 연산을 위해 객체 내부적으로 toString 함수를 호출해 문자열로 변환한 후에 연산을 수행하여 결과가 위처럼 나오게 되는 것이다.
위는 toString 함수가 호출되지 않은 raw한 값!
숫자 객체의 진법 변환
10진수 숫자를 36진수로 변경하여 아스키 영어 소문자 범위를 모두 생성할 수 있다. 36진수는 알파벳 F까지만 사용하던 16진수와는 다르게 알파벳 Z까지 전부 사용하는 진법을 말한다. 이를 이용해 원하는 문자열을 10진수 숫자로 만들 수 있는 방법이다.
점 하나로는 소수점으로 인식될 수 있으니 위와 같이 괄호를 이용하고 점을 찍을 수도 있고, 점 두 개를 사용할 수도 있고, 공백과 점을 사용할 수도 있다.
Symbol.hasInstance 오버라이딩
Symbol.hasInstance를 이용하면 instanceof 연산자를 오버라이드할 수 있다. 말이 어렵지만 0 instanceof C를 연산할 때 C에 Symbol.hasInstance 속성에 함수가 있을 경우 메소드로 호출하여 instanceof 연산자의 결과 값으로 사용하게 된다.
원래 instanceof는 객체가 특정 클래스에 속하는지를 확인하는 연산자이지만 위의 특성을 이용해 연산하게 되면 인스턴스 체크 대신에 원하는 함수를 메소드로 호출되도록 할 수 있는 것이다.
"alert\x28document.domain\x29"instanceof{[Symbol.hasInstance]:eval};
공부하던 곳에 예시는 위와 같이 되있었다. 러프하게 보면 instanceof 연산자가 뒤의 Symbol.hasInstance 속성에 있는 eval 함수를 실행시켜 앞의 alert문을 실행시키는 것이다.
조금 알아둘 부분은 eval 함수는 이미 위험한 함수로 정평이 나있는 녀석이라 사용이 안될 수도 있다.
document.body.innerHTML
자바스크립트에서는 문서 내에 새로운 HTML 코드를 추가하는 것이 가능하다.
document.body.innerHTML에 코드를 추가할 경우 새로운 HTML 코드가 문서에 추가되고 이를 이용해서 자바스크립트 코드를 실행할 수 있다.
주의할 점은 innerHTML로 HTML 코드를 실행할 때는 보안상 script 태그를 삽입해도 실행되지 않는다고 한다.
'XSS > XSS' 카테고리의 다른 글
a 태그 자동 실행 기법(tabindex/onfocusin) (0) | 2024.11.16 |
---|---|
XSS 필터링 우회 2 (0) | 2024.06.27 |
XSS 블랙 리스트 기반 필터링 우회(javascript:,정규화) (0) | 2024.06.24 |
XSS event handler (0) | 2024.06.23 |
DOM based XSS (0) | 2024.06.21 |