크로스 사이트 스크립트 공격 (XSS : Cross-site Scripting Attacks)

신뢰할 수 없는 데이터란, 외부의 파일이나 페이스북의 댓글과 같은 나의 웹 애플리케이션이 통제할 수 없는 데이터를 의미합니다.

이러한 데이터를 href 경로에 또는 innerHTML 속성을 이용하여 페이지에 HTML을 추가하는 경우, XSS 공격에 의해 보안이 위험해집니다.


XSS 공격은 사이트에 스크립트 코드를 삽입하는 공격기법을 의미합니다.

DOM 트리에 접근 할 수 있고, 쿠키와 세션 정보를 탈취해 사용자 인증을 수행 할 수 있습니다.

그 결과로 해커가 유저의 계정으로 물품을 구매할 수 있게 되고, 또한 악성코드가 널리 퍼질수도 있습니다.




예시

XSS 공격은 스크립트를 도구로하여 공격하는 방법입니다.

먼저 해커는 악성코드 파일을 자신의 서버에 올려둡니다.

그리고 해킹하고자 하는 사이트에 스크립트 코드를 심습니다.

<img src="#" onerror="location.href='해커의주소'">


해커가 올린 이미지 파일은 제가 통제할 수 없는 파일입니다.

즉 신뢰할 수 없는 파일이기 때문에 XSS공격의 위험이 있습니다.


위의 예제는 이벤트를 이용한 공격기법이고, 그 밖에 <script> 코드 내에서도 작성할 수 있으므로 XSS 공격에 신경을 해야합니다.





공격 방지

이를 막을 수 있는 방법으로는

1) 사용자 입력이 필요할 경우 클라이언트 단에서 유효성 검사를 하는 방법

2) 서버 단에서 데이터 유효성 검사를 하는 방법

3) innerHTML 속성이 아닌 textContent 속성을 이용하여 마크업이 아닌 이스케이프로 처리된 텍스트로 코드를 처리할 것

    jquey에서는 html()함수가 아닌 text()함수를 사용


이스케이프로 처리된 텍스트란 다음을 의미합니다.

&    =>  &amp;

'      =>  &#x27;

"     =>  &quot;

<    =>  &lt;

>    =>  &gt;

/     =>  &#x2F;


즉 코드로써 작성될 수 있는 기호들을 이스케이프 처리한 텍스트로 작성하는 것이 XSS공격을 막는 방법 중 하나입니다.

이 방법으로도 안심할 수는 없지만 위의 사항이 가장 기본적인 방어대책입니다.




이상으로 XSS공격에 대해 알아보았습니다.

XSS공격은 스크립트를 통해 이루어지며, 웹 사이트의 보안을 위해서는 신뢰할 수 없는 데이터에 대해서 필터링 및 유효성 검사를 하는 작업을 해야 합니다.



[ 참고 ]

https://namu.wiki/w/XSS