xss-1

- VM 생성 후 인덱스 페이지로 접근하면 3개의 링크를 확인할 수 있습니다.

- 각 링크로 접속해서 기능을 사용해보면 아래와 같은 결과를 확인할 수 있었습니다.
- 1번 링크(/vuln) - Reflected XSS 공격에 취약
- 2번 링크(/memo) - GET 요청 시 전달된
memo파라미터 값이 저장, <> 문자는 HTML 엔티티로 치환 - 3번 링크(/flag) - 임의 값 입력 후 제출 버튼을 누르면
good팝업창 발생

- 음.. 소스코드를 분석해보겠습니다.
- 문제를 풀기 위한 주요 포인트는
flag, check_xss, read_url함수입니다.
1. def flag()
- /flag 경로에서 입력 폼을 채우고 “제출” 버튼을 누르면
check_xss함수가 호출되는데요. check_xss함수가 호출될 때, 2번째 인자를 보면 플래그(FLAG.strip()) 값이 함께 전달됩니다.

2. check_xss()
flag함수에서 전달받은 값을 다시read_url함수로 넘깁니다.

3. read_url()
- 34, 35 라인을 보면, 전달 받은 쿠키를 셀레니움 브라우저의 쿠키 값으로 추가한 후 해당 URL로 접근하고 있습니다.
- 34 라인에서 사용된
cookie값은{'name': 'flag', 'value': FLAG.strip(), 'domain', '127.0.0.1'}이고, 35라인에서 사용된url값은http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}가 됩니다.
- 34 라인에서 사용된
{urllib.parse.quote(param)}값은 /flag 경로에서 POST 요청을 보낼 때, 사용자가 조작 가능한 부분입니다.- 따라서, 공격자는 이 공격 포인트를 활용해서
read_url함수가 호출될 때 플래그 값을 출력하도록 해야 합니다.- 그런데, 셀레니움 브라우저는 대상 호스트 내부에서 실행되므로 이를 확인할 수 있는 방법을 찾아야 하는데요.
- 이건 아까 /memo 경로로 접근할 때, GET 파라미터(memo)에 넘어온 값이 저장되던 걸 이용하면 될 것 같습니다.

Proof of Concept
- 최종 공격 흐름을 정리해보면 다음과 같습니다.
- (1) /flag 경로에서 쿠키 값을 출력하는 스크립트 삽입
- (2) 출력만 하면 쿠키 값 확인이 불가능하므로, 이 값을 /memo 경로에 저장하는 스크립트 추가
- (3) 제출 버튼 클릭
<script>window.open('http://127.0.0.1:8000/memo?memo=' + document.cookie);</script>
- 위 과정을 거친 후에,
/memo경로로 접속해보면 플래그 정보가 저장된 것을 확인할 수 있습니다.

🐛.. 🐛.. 🐛..