목차
Cross-site scripting이 본명(CSS와의 혼동을 우려하여 XSS로 변경) - 우리 말로는 “사이트 간 스크립팅”
종류
Reflected-XSS
http://127.0.0.1:8080/hello?username=<script>alert("XSS";);</script>;
Stored-XSS
<iframe ID="showFrame" SRC="javascript:document.write('
<script>
alert(3);
function show() {
alert(5);
}
alert(4);
</script>
');" width="0" height="0" frameborder="0"></iframe>
<button id="button" onClick='document.getElementById
("showFrame").contenWindow.show()'>버튼</button>
DOM-based-XSS
사용자의 입력에 대해 클라이언트측과 서버측이 모두 검증을 해야한다. - 우회할 수 있는 방법이 상상이상으로 많다.
출처 : 웹 해킹 강좌 ⑦ - XSS(Cross Site Scripting) 공격의 개요와 실습 (Web Hacking Tutorial #07) - https://www.youtube.com/watch?v=DoN7bkdQBXU
대신 img, form 태그 등 다양한 html 태그를 활용한다.
<form action="http://facebook.com/api/content" method="post">
<input type="hidden" name="body" value="여기 가입하면 돈 10만원 드립니다." />
<input type="submit" value="Click Me"/>
</form>
<script>
document.forms[0].submit();
</script>
해커의 계정으로 몰래 로그인을 시켜서, 사용자의 기록이 해커에게 그대로 전달된다.
<form method="POST" action="http://honest.site/login">
<input type="text" name="user" value="h4ck3r" />
<input type="password" name="pass" value="passw0rd" />
</form>
<script>
document.forms[0].submit();
</script>
- 다른 사이트에서 요청을 보내는 공격이므로, 다른 사이트에서 온 요청을 막거나 Origin을 확인하는 작업이 필요하다.
- CORS를 적용
- 사이트 간 요청을 불가능하게 한다.
- referer 헤더 설정
- 어디에서 요청이 왔는지 확인할 수 있다.
- Token 검증(Synchronizer Toekn Pattern, CSRF Token)
http://itnews.inews24.com/view/324577
https://velog.io/@shroad1802/CSRF
https://medium.com/@ashifm4/protection-from-cross-site-request-forgery-csrf-9cf4f542e268
실험
Thymeleaf로 했을 때는 th:text
의 경우 escaping이 자동적으로 진행되어 html 태그가 실행되지 않았지만, th:utext
일 때는 escaping이 진행되지 않아 html 태그가 실행되었음
th:text 일 때 (<td*th:text*="${item.orderItems[0].item.name}"></td>
)
th:utext 일 때 (<td*th:utext*="${item.orderItems[0].item.name}"></td>
)
React에도 기본적으로 escaping 되는 기능이 적용되어 있다고 함.
But 방법이 매우 다양해지면서, 막기 위한 수많은 방법이 고안되었음
React에서 XSS 공격을 방지하는 방법 10가지 : https://snyk.io/blog/10-react-security-best-practices/
템플릿 엔진을 사용하지 않을 때는 XSS 공격에 바로 노출되었음