공부/웹

XSS(Cross-Site Scripting)

B612 2024. 4. 23. 19:01

내가 어제 공부를 진득히 안했다는 생각이 들어서, 카페에 왔다.

오늘은 조금 더 꼼꼼히 공부해야지

 

XSS 취약점은 웹 리소스에 악성 스크립트가 삽입되기 때문에 발생한 취약점이다.

해당 취약점은 브라우저가 서버로부터 전달받은 컨텐츠를 신뢰한다는 점을 악용해 발생한다.

 

악성 스크립트를 삽입하고, 이후 이용자가 악성 스크립트가 포함된 페이지를 방문하면 스크립트가 실행되어 쿠키와 세션이 탈취 될 수 있다.

비록 SOP 보안 정책이 등장하며 이전에 비해 까다로워졌지만, 그럼에도 우회하는 다양한 기술을 통해 XSS 공격이 끊기지 않고 있다.

 

자바스크립트를 통해 웹 페이지를 조작하거나, 웹 브라우저의 위치를 임의의 주소로 변경할 수 있다.

때문에 자바스크립트를 좀 알아야 공격할 수 있다.

 

<내가 외워야 할 자바스크립트>

new Image() : 이미지 생성 함수

src : 이미지의 주소 지정

location.href : 이용자의 위치 변경

자바스크립트 코드를 실행할 수 있는 태그는 <script> 이외에도 상당수 존재한다. ex) onload, onerror, onfocus 등

 

:javascript 스키마는 URL 로드 시 자바스크립트 코드를 실행할 수 있다. → url을 속성 값으로 받는 a, iframe 태그 등에 사용 가능

⇒ 정규화를 이용해 우회할 가능성 존재

일반적으로 키워드를 필터링할 때는 정규표현식을 이용 → 정규표현식 필터링 자체에 문제가 있을 경우 xss 가능

 

문자열을 필터링 할 경우

→ Unicode escape sequence로 우회 가능

→ Computed member access : 속성 이름을 동적으로 계산

alert(document["\u0063ook" + "ie"]);  // alert(document.cookie)
window['al\x65rt'](document["\u0063ook" + "ie"]);  // alert(document.cookie)

 

따옴표가 필터링 된 경우

→ 템플릿 리터럴 사용 (내장된 표현식 허용) `를 이용해 선언할 수 있다.

var foo = "Hello";
var bar = "World";
var baz = `${foo},
${bar} ${1+1}.`; // "Hello,\nWorld 2."

하지만 따옴표와 `가 모두 필터링 된대도 문자열을 만들 수 있는 방법은 존재한다.

→ RegExp 객체 이용

→ String.fromCharCode 함수 사용

 

document.body.innerHTML

자바스크립트에서는 문서 내에 새로운 HTML 코드를 추가하는 것이 가능

→ innerHTML로 HTML 코드를 실행할 때는 보안 상 <script> 태그를 삽입해도 실행이 안된다

→ 이벤트 핸들러를 이용해 자바스크립트 코드 실행

document.body.innerHTML+="<img src=x: onerror=alert&#40;1&#41;>";
document.body.innerHTML+="<body src=x: onload=alert&#40;1&#41;>";

 

this['al'+'ert'](this['docu'+'ment']['coo'+'kie']);

 

발생 형태에 따라 다양한 종류로 구분된다

Stored : 서버의 db 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS

Reflected : 서버가 악성 스크립트가 담긴 요청을 출력할 때 발생. if 검색 결과가 응답에 포함되어 있을 경우 → 이용자의 요청에 의해 발생!

DOM-based

Universal

...

'공부 > ' 카테고리의 다른 글

웹 취약점  (0) 2024.01.21
웹페이지 개발 (flask 설치, 폴더 생성)  (0) 2023.10.21