- 이 글을 무단으로 전재 및 재배포를 금지하고 있습니다.
- 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위 입니다. 본 내용을 악의적인 목적으로 사용 시 그에 대한 법적 책임을 포함한 모든 책임은 당사자에게 있으며, 작성자는 어떠한 책임도 지지 않음을 밝힙니다.
- 크로스 사이트 스크립팅(XSS, Cross-site-scripting) 취약점은 입력 데이터가 적절한 값인지 검사하지 않을 때 발생
- 저장된 XSS(Stored Cross-Site-Scripting)은 악의적 스트립트 코드가 데이터베이스에 저장됨
- 링크를 이용하여 일회성으로 클릭을 유도하지 않고 불특정 다수 사용자가 게시물에 접근하면 지속적으로 악의적인 스크립트가 실행되기 때문에 위협 영향도가 높음
텍스트 입력 공간에 스크립트 삽입
<script>alert(document.cookie)</script>
🔑대응방안
htmlspecialchars 함수로 우회할 수도 있지만 텍스트 입력 공간으로 SQL 인젝션을 시도할 가능성이 있으므로 mysql_real_escape_string 함수를 사용하여 우회한다.
비밀번호 힌트를 새로 설정하는 페이지에서 스크립트 삽입 후 비밀번호 힌트를 확인할 수 있는 페이지로 이동하여 입력한 스크립트 코드가 실행되는지 확인한다.
sanders 사용자의 비밀번호 힌트를 확인한다.(I Like Honey)
비밀번호 힌트를 새로 설정하는 페이지(xss_stored_3.php)는 사용자 아이디를 웹페이지 소스 코드에 노출한다. 웹 개발자 도구로 hidden 타입으로 정의된 login 변수에 다른 사용자(sanders)의 아이디를 입력하고 그 사용자의 비밀번호 힌트를 수정한다.
비밀번호 힌트를 확인할 수 있는 페이지로 이동하여 sanders 사용자의 비밀번호 힌트를 확인할 시 스크립트가 실행되는 것을 확인할 수 있다.
난이도 상에서는 다른 사용자의 비밀번호 힌트를 변경하지 못하도록 사용자 정보를 토큰으로 받게 되어있다.
토큰 사용 시 sql 구문이 궁금하여 확인결과, 상단에서 토큰 일치 여부 확인 후 SQL문은 동일하게 login을 사용하는 것을 확인할 수 있었다.
🔑대응방안
xss_stored_3.php 페이지에서 변경한 비밀번호 힌트는 데이터베이스에 저장되므로 mysql_real_escape_string 함수를 사용하여 NULL, \n, \r, \, ', ",^Z에 백슬래시를 붙여 SQL인젝션 공격을 방어하고 htmlspecialchars 함수로 HTML에 사용되는 기호를 UTF-8로 반환하고 HTML 코드에 사용되는 문자들을 HTML 엔티티 코드로 변환한다.