들어가기에 앞서 현재의 상황과 어떠한 방법으로 해결했는지 작성 해보고자 합니다.
현재 상황으로는 회사에서 프로젝트를 들어가게 되면서, 공지 사항(게시판) 쪽에 대해 회사 프레임워크 (솔루션)을 기반으로 기능을 구현해야 하는 상황이였다.
(아직 3개월된 신입 개발자)
→ 요기서 사수분이 웹 취약점에 대해서 학습해보면 좋을 것 같고 웹 취약점을 방어 할 수 있게 기능을 구현해 보라고 하셨다.
→ 아래의 이미지가 내 상황과 유사한것 같아서 가져와 봤다.
(대충 해커가 게시판에 함정 을 심는 짤)
이미지 출처 : https://wikidocs.net/127508
먼저 웹 취약점이 뭔지 개념에 대해 알아볼려고 한다.
간단히 말하여 웹 애플리케이션에서 시스템의 손실 (데이터 등의 손실), 손상의 원인을 줄 수 있는 보안상으로의 약점으로 말합니다.
→ 이러한 취약점을 발견한 해커는 집요하게 공격 한다.
취약점 공격 유형은 여러가지 종류가 있지만 취약점 공격 유형 (Reference) XSS
(Cross Site Scripting)에 대해서 알아보고 해결했던 과정을 정리 하고자 합니다.
아래는 XSS
공격을 테스트 해볼 수 있는 사이트 입니다.
http://testphp.vulnweb.com/
아래의
search art
칸이 게시판의 글 작성 혹은 작성된 게시글의 댓글을 작성 할 수 있는 칸이라고 생각하면 좋을 것 같다.
search art
칸에
<SCRIPT>alert("테스트!!!");</SCRIPT>
를 작성하게 되면
일반적인 게시글, 답장이 아닌 script라는 코드가 실행 되는 것을 확인 할 수 있습니다.
→ 해커는 저렇게 귀엽게 script를 활용하지 않습니다.
<SCRIPT>alert(document, cookie);</SCRIPT>
와 같이 사용자의 쿠키를 탈취 할 수도 있습니다.
사용자가 아래와 같은 링크를 클릭하게 되면 페이지가 이동하게 되며
4월 통신요금 도착
아래의 링크를 클릭하여 4월 통신요금을 확인하세요
bit.qw/bill -- url 링크
최악으로는 악성 파일을 다운 받게 되거나, 사용자의 Session
정보 혹은 Cookie
정보가 탈취 되게 됩니다.
XSS
공격을 막기 위해서는 게시판 글 작성, 작성된 게시글에 댓글을 작성 할 수 있는 기능에 대해서
게시글을 작성할 수 있는 input에 아래와 같이 작성하는 것을 막아야한다.
Ex : javascript
<SCRIPT>alert(document, cookie);</SCRIPT>
Ex : html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello</title>
</head>
<body>
<p>Hello</p>
</body>
</html>
script
언어 혹은 html
을 작성하지 못하게 막아야 합니다.
→ 아래의 코드를 작성하여 xss
공격을 예방 할 수 있습니다.
String cntn = ""; // 프론트 단에서 받아온 input 값
// <script>, <Script>, <sCript> 등의 입력을 막기 위한 정규식
cntn = cntn.replaceAll("(?i)<[sS][cC][rR][iI][pP][tT][\\/]?>", "");
// 이러한 if문을 쭉 작성하여 위에 작성한 html 코드를 replace 해줘야 하며,
// "<" ">" 등 의 대한 아스키 코드의 참조 문자를 찾아보면서 해야 된다.
if (cntn.equals("<") {
cntn.replace("<";);
}
코드를 작성하며 테스트 해본 결과로는
xss
공격은 데이터베이스에 script 언어 혹은 html로 저장이 되어야 xss
공격이 되는 것 같다.
-> JPA
를 사용하는 것 만으로도 파라미터 바인딩 방식으로 SQL 쿼리를 실행 하게끔 되어 있어서 XSS
공격에 대응 할 수 있다.