XSS(크로스사이트스크립팅) 기본 우회 방법 및 스킬업
XSS(크로스 사이트 스크립팅, Cross-Site Scripting)은 웹 어플리케이션의 보안 취약점 중 하나로, 공격자가 웹 사이트에 악성 스크립트를 주입하여 사용자의 브라우저에서 실행되게 만드는 공격 기법이다.
이를 통해 공격자는 사용자의 세션 쿠키, 토큰 등을 탈취하거나, 사용자를 대신하여 의도하지 않은 행동을 실행시킬 수 있다.
XSS 공격의 원리
XSS 공격의 기본 원리는 사용자로부터 입력 받은 데이터를 적절히 검증하거나 이스케이프 처리하지 않고 웹 페이지에 그대로 반영할 때 발생한다. 공격자는 이러한 취약점을 이용해 스크립트 코드를 웹 어플리케이션에 주입하고, 이 코드가 다른 사용자의 브라우저에서 실행되도록 한다. 실행된 스크립트는 공격자에게 사용자의 데이터를 전송하거나, 사용자를 속여 피싱 사이트로 유도하는 등 다양한 악의적 행위를 할 수 있다.
XSS 공격의 유형
- 저장된 XSS (Stored XSS): 악성 스크립트가 웹 어플리케이션 서버에 저장되어, 해당 페이지를 방문하는 모든 사용자에게 영향을 미치는 형태이다. 포럼 게시물, 댓글, 사용자 프로필 정보 등에 악성 스크립트를 삽입할 수 있다.
- 반사된 XSS (Reflected XSS): 사용자가 공격자가 조작한 링크를 클릭할 때, 서버로부터 악성 스크립트가 포함된 응답이 바로 반환되어 실행되는 형태이다. 검색 엔진, 메일, 메시지 등을 통해 공격 링크를 유포할 수 있다.
- DOM 기반 XSS (DOM-based XSS): 원래의 서버 응답은 변경하지 않고, 클라이언트 측에서 DOM(Document Object Model)을 조작하여 악성 스크립트를 실행시키는 형태이다. URL의 해시(#) 뒤에 있는 데이터를 이용하는 경우가 대표적이다.
XSS 공격 대응 방법
- 입력 검증: 사용자 입력 데이터에 대한 검증을 철저히 수행하여, 스크립트 등의 실행 가능한 코드가 포함되어 있지 않도록 한다.
- 출력 이스케이프 처리: 사용자 입력을 웹 페이지에 출력할 때, 스크립트와 같은 실행 가능한 코드가 브라우저에 의해 실행되지 않도록 HTML 엔티티 등으로 이스케이프 처리한다.
- 콘텐츠 보안 정책 (CSP): CSP를 사용하여, 특정 도메인이나 방식으로만 스크립트를 실행할 수 있도록 제한함으로써, XSS 공격의 위험을 줄일 수 있다.
- 쿠키에 HttpOnly와 Secure 플래그 설정: 이 플래그들을 설정함으로써, 스크립트를 통한 쿠키의 접근을 차단하고, HTTPS를 통해서만 쿠키를 전송하도록 한다.
반사된 XSS 공격 예시
사용자 입력 검증이 없는 검색 기능:
- 피해자 유인: 공격자는 악성 스크립트를 포함하는 URL을 생성하여 피해자에게 전송한다.
- URL 예시: https://example.com/search?query=<script>alert('XSS');</script>
- 피해자 피해: 피해자가 링크를 클릭하면, 브라우저에서 alert 창이 표시되고, 악성 스크립트가 실행될 수 있다.
XSS 취약점 실습
필요 준비물:
- HTML 및 서버 사이드 언어 지식 (PHP, Node.js 등)
- 웹 서버 환경
실습 단계:
1. 취약점 코드 작성:
- HTML 폼과 서버 사이드 언어를 이용하여 간단한 검색 기능 구축
- 취약점 존재: 사용자 입력을 검증하지 않고 출력
- 예시 코드:
<form action="search.php" method="GET">
<input type="text" name="query">
<input type="submit" value="Search">
</form>
2. XSS 공격 시도:
- 악성 스크립트를 포함하는 URL 생성
- 예시: https://example.com/search?query=<script>alert('XSS');</script>
- URL 실행 후 브라우저에서 alert 창 확인
3. XSS 대응 방법 실습:
사용자 입력 이스케이프 처리:
- 특수 문자를 HTML 엔티티로 변환하여 스크립트 실행 방지
- PHP 예시:
<?php
// search.php 수정
$query = htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8');
echo "검색 결과: " . $query;
?>
4. 이스케이프 처리 확인:
- 이스케이프 처리 후 공격 시도, alert 창 표시되지 않음
주의 사항:
- 다양한 이스케이프 처리 함수 존재 (각 언어마다 다름)
- 사용되는 함수 및 옵션에 따라 처리 결과 차이 발생
XSS 우회 방법
HTML 엔티티 사용
웹 어플리케이션이 특정 태그를 필터링하는 경우, HTML 엔티티를 사용하여 필터를 우회할 수 있다.
- 예시: < 대신 < 또는 > 대신 >를 사용할 수 있다.
이벤트 핸들러
일부 웹 어플리케이션은 <script> 태그를 필터링하지만, 다른 HTML 요소의 이벤트 핸들러 내에서 JavaScript 코드를 실행할 수 있는 것을 허용할 수 있다.
- 예시: <img src=x onerror=alert(1)> - 이 코드는 이미지 로드에 실패했을 때 alert를 실행한다.
JavaScript URL 사용
<a> 태그의 href 속성이나 다른 네비게이션 목적의 속성에 JavaScript 코드를 삽입하여 필터를 우회할 수 있다.
- 예시: <a href="javascript:alert(1)">클릭</a> - 이 링크를 클릭하면 JavaScript 코드가 실행된다.
문자열 분할
공격자는 필터링 시스템이 특정 문자열을 검출하는 것을 회피하기 위해 문자열을 분할할 수 있다.
- 예시: JavaScript에서 eval 함수를 사용하여 분할된 문자열을 실행할 수 있다.
var payload = "al" + "ert(1)";
eval(payload);
CSS를 이용한 공격
일부 케이스에서는 CSS를 이용하여 XSS 공격을 시도할 수 있다. 예를 들어, CSS 내에서 expression 속성(현재는 대부분의 브라우저에서 사용 중지)을 사용하여 JavaScript 코드를 실행할 수 있었다.
- 예시: <div style="width: expression(alert(1));"></div>
고급 인코딩 기법
공격자는 URL 인코딩, UTF-8 인코딩 또는 다른 인코딩 방식을 사용하여 필터링 메커니즘을 우회할 수 있다.
- 예시: URL 인코딩을 사용하여 스크립트 태그를 인코딩할 수 있다.
%3Cscript%3Ealert(1)%3C/script%3E
데이터 URI 사용
데이터 URI 스킴을 사용하면, 외부 리소스를 로드하는 대신 URI 내에 직접 데이터를 포함시킬 수 있다. 이를 이용해 XSS 공격 코드를 포함시킬 수 있다.
(데이터 URI 스킴(data:)을 사용하는 XSS 공격은 웹 페이지가 외부 리소스를 로드할 때 발생할 수 있는 취약점을 이용)
( Data URI는 HTML 및 CSS에 이미지를 포함하거나 외부 파일을 인라인으로 넣기 위해 사용)
- 예시: <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=">클릭</a> - Base64로 인코딩된 스크립트가 있는 데이터 URI이다.
- ( data:text/html,<script>alert('XSS');</script>)
https://www.hahwul.com/2022/03/05/data-uri-xss-v2/
SVG 이미지 이용
SVG(Scalable Vector Graphics) 파일 내에 JavaScript를 포함시킬 수 있으므로, SVG 이미지를 이용한 XSS 공격이 가능하다.
- 예시: <svg/onload=alert('XSS')> - SVG 태그 내에 onload 이벤트를 사용하여 XSS 공격을 수행한다.
Polyglot XSS
Polyglot XSS 공격은 하나의 문자열이 여러 컨텍스트(HTML, JavaScript, URL 등)에서 유효한 코드로 해석될 수 있도록 작성되는 기법이다. 이는 다양한 파싱 방식을 가진 환경에서 유용하게 사용될 수 있다.
고급 JavaScript 우회 기법
JavaScript의 유연성을 이용하여, 문자열을 다양한 방식으로 조합하거나, 이스케이프 시퀀스를 사용하여 필터를 우회한다.
- 예시: String.fromCharCode() 함수를 사용하여 각 문자의 아스키 코드를 이용해 스크립트를 조합할 수 있다.
타입 조작을 통한 우회
일부 애플리케이션은 특정 타입의 입력만을 허용할 수 있다. 이를 우회하기 위해 입력 타입을 조작할 수 있다.
- 타입 변환을 이용한 우회: 문자열이 필터링되는 경우, 문자열을 다른 타입으로 변환하여 실행할 수 있다. 예를 들어, 문자열 대신 정수형이나 배열을 사용할 수 있다.
DOM 조작을 통한 공격 실습
웹 페이지가 사용자 입력을 URL의 일부로 사용하는 경우, URL을 조작하여 XSS 공격을 시도할 수 있다.
<script>
function displayInput() {
var userInput = document.getElementById('userInput').value;
document.getElementById('display').innerHTML = userInput;
}
</script>
<input type="text" id="userInput">
<button onclick="displayInput()">Display</button>
<div id="display"></div>
전체 코드 document.getElementById('display').innerHTML는 페이지에서 ID가 'display'인 요소를 찾고, 그 요소의 내부 HTML 콘텐츠를 가져오거나 변경하는 데 사용된다. 예를 들어, 이 코드 뒤에 = '<p>Hello, World!</p>'를 추가하면, ID가 'display'인 요소 내부에 <p>Hello, World!</p>라는 HTML 마크업을 삽입할 수 있다. 이를 통해 웹 페이지의 특정 부분을 동적으로 업데이트하는 데 자주 사용된다.
'Attack' 카테고리의 다른 글
타인의 PC를 정복하다 - 백도어 (루트킷) 개념 및 실습 (0) | 2023.11.22 |
---|---|
파일 업로드 대응 -- (파일 내용 악성 코드 및 여러가지 대응 방법) (0) | 2023.10.21 |
Kali 한영 설정 fcitx 안될 때!! (0) | 2023.10.13 |
[Attack] Web shell? 웹 쉘 ? (0) | 2023.09.14 |
[Attack] 퍼징 ? 알아볼게요 (0) | 2023.09.10 |