W3B H4CK1NG

[dreamhack] csrf-2

hauni 2024. 10. 4. 16:32

가장 먼저 볼 수 있는 화면. vuln, flag, login 페이지가 있다.

read_url 함수: Python Selenium을 사용해 지정된 URL에 접속하고 쿠키를 설정한 후, 페이지를 로드하는 함수

cookie={“name”: “name”, “value”: :value”}: 이름과 값을 가지는 쿠키를 설정하는 딕셔너리

name = name, value=value로 설정되어 있음

 

/ (메인) 페이지 → 세션 기반 인증

session_id = request.cookies.get('sessionid', None): 쿠키에서 세션 아이디 가져오기. 없으면 none이 기본값

username = session_storage[session_id]: 가져온 session_id 사용해 storage라는 세션 정보 저장하는 곳에서 해당 세션에 연결된 사용자를 찾음

return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}’): username‘admin’이면 플래그 출력. 아닌 경우에는 you are not an admin 출력

 

vuln 페이지 → 익스플로잇 코드 삽입 페이지

xss_filter = [”frame”, “script”, “on”]

for _ in xss_filter:

  param = param.replace(, “*”)

: xss_filter라는 리스트에 frame, script, on 문자열 포함. for 루프 사용으로 해당 문자열이 param에 해당할 경우 그 문자열을 *로 대체

 

GET 방식으로 접근하면 flag.html 반환

POST 요청은 param받아옴

check_csrf~ : CSRF 검사를 위한 함수 호출. 해당 함수는 입력된 paramsessionid 쿠키값 비교&검증

 

 

맨 앞에서 봤던 main 페이지에는 없던 페이지가 있음

파라미터를 보니 비밀번호를 변경할 수 있는 페이지로 예상됨

URL에서 pw라는 파라미터로 새 비밀번호 생성

쿠키에서 sessionid 가져와 저장공간에서 해당 세션의 사용자를 찾음

세션이 유효하면 사용자의 비밀번호를 pw로 업데이트

 

해결 방법

vuln 페이지는 스크립트 필터링이 적용되어 있음

하지만 <img> 태그는 사용 가능함. 따라서 <img src=“”> 통해 /change_password에 접속 시도

파라미터를 이용하여 변수 pwadmin의 비밀번호를 설정하면 됨

<img src=/change_password?pw=1234> 입력하면 비밀번호가 변경됨

다시 로그인 페이지로 돌아가서

id: admin

pw: 1234

하면 플래그값을 찾을 수 있음