이번에는 웹 해킹하는 방법 중 XSS에 대해서 알아보겠습니다.
XSS는 Cross Site Scripting으로 X는 약자가 아니라 Cross 즉 꼬인 모습을 표현하는 글자입니다. XSS는 지난번에 했던 SQLI와는 다르게 서버가 아닌 클라이언트측에서 스크립트를 삽입해서 공격하는 기법입니다. 그래서 SQLI가 서버측 코드를 삽입해 서버에게 받은 응답으로 공격하는 것과 다르게 클라이언트측에서 삽입한 코드로 클라이언트가 직접적으로 공격받는 방법입니다. 그래서 보통은 Javascript를 통해 공격이 많이 이뤄집니다.
코드를 삽입해 공격하기때문에 < ' " > 이 4가지 특수문자가 사용가능한지를 잘 확인해봐야하고, 필터링은 어떤 것이 되어있는지도 잘 확인해봐야합니다. 무엇보다 Form태그 메소드가 GET 메소드를 이용할 때엔 사용이 가능하지만 POST 메소드를 이용하는 경우에는 사용에 어려움이 있을 수 있으니 주의해야합니다.
XSS에는 Stored XSS와 Reflected XSS로 나뉩니다.
Stored XSS는 저장되는 코드를 이용해 공격하는 방법입니다. 클라이언트가 쓰는 것이 저장되는 경우, 예를 들면 게시판같은 경우가 있는데 이런 곳에 코드를 삽입할 수 있는지 확인하고, 만약 삽입된다면 악성코드가 포함된 글을 게시합니다. 그러면 그것을 읽는 모든 사용자들이 공격당하는 것입니다. 또한 이러한 공격 방식은 서버에 기록이 남게됩니다.
Reflected XSS는 내가 직접 입력한 파라미터가 그대로 출력되는 경우에 사용할 수 있는 공격 방법입니다. 그런데 입력한 것이 그대로 출력되는 경우라는 것은 어떤 것일까요? 예를 들어보면 ID 중복체크나 검색 페이지 등이 있을 수 있습니다. ID 중복체크에 apple이라는 것을 넣었을 때 apple은 사용 가능/불가능한 ID입니다. 라고 그대로 내가 적은 ID를 돌려주면서 출력해주는 사이트나, '사과'를 검색했을 때 사과에 대한 검색 결과입니다. 라던가 하는 문구를 그대로 돌려주는 경우가 공격가능한 경우입니다.
Reflected XSS는 Stored XSS와는 다르게 다수가 아닌 개인이 공격 대상이 됩니다. Reflected XSS를 통해 악성코드를 심은 URL을 다른 사람에게 e-mail 등을 통해서 링크 형식으로 전달하고, 사용자가 그 링크를 클릭하면 공격당하는 방식입니다.