: 2021 목록에서 세 번째에 해당하는 웹 애플리케이션 보안 취약점이다. 인젝션은 사용자가 전달하는 데이터(파라미터, 헤더, URL, 쿠키(Cookie), Json 데이터, SOAP, XML 등 모든 형태)를 신뢰할 수 없는 데이터로 조작해서, 서버 측에서 명령어나 쿼리문의 일부로 인식하게 만들 때 발생한다.
1. SQL 인젝션(SQL Injection)
: 가장 잘 알려진 인젝션 공격. 공격자가 SQL 쿼리에 악의적인 코드를 삽입해 데이터베이스를 조작할 수 있게 한다. 이를 통해 비밀번호나 개인정보를 탈취하거나, 데이터베이스 내용을 변경, 삭제할 수 있다.
2. 크로스 사이트 스크립팅(XSS, Cross-Site Scripting)
: 웹 애플리케이션에서 신뢰할 수 없는 데이터를 적절한 검증 없이 사용자 브라우저에 전달할 때 발생. 공격자는 악성 스크립트를 삽입해 피해자의 브라우저에서 해당 스크립트가 실행되도록 유도할 수 있으며, 이를 통해 쿠키, 세션 토큰, 기타 민감한 정보를 탈취할 수 있습니다.
ex) CWE–79 : Cross-site Scripting (XSS)
<% String eid = request.genParameter("eid"); %>
...
직원 ID: <%= eid %>
코드 문제점: request.getParameter("eid")로 읽은 eid값은 사용자가 요청으로 보낸 값인데
아무런 검증이나 인코딩 없이 그대로 HTML응답에 삽입되는 것이 문제다.
$username = $_GET['username'];
echo '<div class="header"> 환영합니다, ' . $username . '</div>';
코드 문제점: 매개변수는 임의적일 수 있기때문에 페이지의 url을 수정해서 $username에
스크립팅 구문을 포함시킬 수 있다.
Reflected XSS
: 반사형 XSS는 사용자가 특정 웹 페이지로 요청을 보낼 때, 그 요청에 포함된 악성 스크립트가 즉시 응답에 반영되어 브라우저에서 실행되는 방식입니다. 이 유형의 XSS는 주로 악성 링크를 클릭하거나, 의도된 요청을 서버로 보낼 때 발생합니다.
ex)
http://example.com/searchq=%3Cscript%3Ealert(%27XSS%27);%3C/script%3E%0A
공격자가 다음과 같은 URL을 사용자에게 보냅니다:
사용자가 이 링크를 클릭하면, q 파라미터에 있는 악성 스크립트가
서버 응답에 반영되어 브라우저에서 실행됩니다.
인코딩된 스크립트문 : <script>alert('XSS');</script>
Stored XSS
: 저장형 XSS는 악성 스크립트가 웹 애플리케이션의 데이터베이스 등에 저장된 후, 여러 사용자가 해당 데이터를 불러올 때마다 스크립트가 실행되는 방식입니다. 이 유형은 포럼, 댓글, 게시글 같은 사용자 입력을 저장하는 기능에서 주로 발생합니다.
ex)
<script>alert('You have been hacked');</script>
공격자가 댓글 창에 다음과 같은 코드를 입력:
해당 페이지를 방문하는 모든 사용자에게 이 악성 스크립트(alert())가 실행됩니다.
DOM-Based XSS
: DOM 기반 XSS는 서버 응답이 아닌, 브라우저에서 실행되는 자바스크립트가 DOM(Document Object Model)을 조작하면서 발생하는 XSS입니다. 공격자는 웹 페이지의 클라이언트 측 코드에 악성 데이터를 삽입해, 브라우저에서 실행되도록 만듭니다.
ex)
document.write(location.hash);
이 코드는 url 주소의 hash 값을 가져오는데, 이와 같은 코드가 페이지(html코드)에 삽입되어 있을때
http://example.com/#<script>alert('XSS');</script>
사용자가 URL에 다음과 같은 값을 추가하면:
브라우저는 location.hash 값을 DOM에 그대로 반영하여 스크립트(alert())를 실행시킵니다.
XSS와 CSRF의 차이?
: CSRF(Cross-Site Request Forgery)란?
CSRF는 웹 애플리케이션에서 사용자가 신뢰하는 상태를 악용하여, 사용자의 브라우저가 원치 않는 요청을 하도록 만드는 공격이다. 공격자는 사용자가 이미 인증된 상태임을 이용해, 피해자가 모르는 사이에 의도하지 않은 작업(예: 비밀번호 변경, 돈 송금)을 수행하도록 만든다.
XSS가 사용자가 특정 사이트를 신뢰하기 때문에 발생하는 문제라면,
CSRF는 특정 사이트가 사용자를 신뢰 하기 때문에 발생하는 문제이다.
XSS는 클라이언트의 브라우저에서 발생하는 문제이고, CSRF는 서버에서 발생하는 문제이다.
XSS는 사용자의 쿠키를 탈취할 수 있고, CSRF는 서버로부터 권한을 탈취할 수 있다.