안녕하세요.
해킹과 방어 시리즈를 연재하고 있는 Ziqon입니다.
이번엔 그 두번째 공격과 방어를 해보겠습니다.
게시판 등에 악의적인 스크립트를 넣어 조회자의 세션을 탈취할 수 있는 공격!
바로 XSS(Cross site scripting)입니다.
XSS메뉴에서 Tom Cat 계정으로 로그인하기 (암호 : tom)
ViewProfile 버튼 클릭 후 EditProfile클릭
street필드 마지막에 아래 스크립트 삽입하고 UpdateProfile버튼 클릭
위는 간단한 스트링으로 XSS 공격이 먹힌다는 걸 검증하기 위해서이며 실제 공격자는 아래와 같은 형태로 스크립트를 작성합니다.
이러면 사용자의 쿠키값을 공격자가 원하는 서버로 전송하게 됩니다.
- 피해자의 입장에서 새롭게 로그인을 합니다. Jerry Mouse로 로그인하며 암호는 Jerry입니다.
로그인 후 , 직원 목록에서 tom cat의 프로파일을 조회합니다.
해킹되었다는 Alert창이 뜹니다.
이제 코드 수정을 해보도록 하겠습니다
SQL인젝션에서 했었던 것처럼 위험도 상(Scary)에서 Normal Confidence의 Potential XSS in Servlet 부분으로 탐지된 것을 확인합니다.
Out객체들은 입력값을 출력하는 부분으로 XSS의 취약점이 발생하는 부분입니다.
위 취약점을 제거하기 위해서는 외부 입력값에 대한 악의적인 문자열을 제거하는 보안 필터(클래스)를 사용해야 합니다. 필터의 동작 방식은 아래와 같습니다.
아래 path에 클래스를 생성합니다.
클래스 이름은 securityFilter로 합니다.
XSS에 사용되는 "<", ">"문자열을 Null로 만들도록 코딩해보겠습니다.
이제 만든 필터를 써볼까요? 아까 취약점이라고 발견된 곳에 돌아가 아래와 같이 필터를 적용합니다.
-그러나 여전히 차단되지 않고 있습니다.
- 그 이유는 findbugs가 java파일의 취약점만 탐지가능하고 JSP등은 탐지가 어려운 한계를 가지고 있기 때문입니다.
JSP파일에서 XSS를 방어하는 코딩을 해보겠습니다.
-먼저 http://tomcat.apache.org/taglibs/standard/에서 download -> binaries 디렉터리에서 jakarta-taglibs-standard-1.1.1.zip을 다운로드 받습니다.
압축을 풀고 lib에 있는 jstl.jar, stanard.jar를 WEB-INF하위 lib디렉터리에 놓습니다.
이제 취약한JSP파일을 열어보겠습니다.
JSTL표현식으로 수정하면..
취약코드 : <%=employee.getAddress1()%>
수정코드 : <c:out value="${employee.getAddress1()}"></c:out>팝업이 차단되고 정상적으로 표시되는 것을 볼 수 있습니다.
이것으로 오늘의 강좌를 마칩니다..