xss 문제에서는 임의의 사용자가 내가 원하는 페이지에 쿠키를 넣어서 보내게 했다면
csrf 문제에서는 임의의 사용자가 로그인한 상태로 내가 원하는 페이지에 특정 요청을 하게 만들면 된다.
CSRF-1
4개의 페이지가 있고 /vuln 페이지는 xss 문제와 다르게 'iframe, script, on' 문자열 필터를 걸어 못 쓰게 만들었다.
xss-2 에서 script가 막혀서 우회했던 3가지 방법 중 iframe과 svg/onload는 막혔지만 img 태그는 필터링 되지 않았으니 이걸 이용해보자
CSRF 문제는 다른 사용자의 쿠키를 탈취하는 것이 목적이 아닌 다른 사용자가 특정 페이지를 요청하도록 만들어야한다.
여기서 특정 페이지는 /admin/notice_flag 이다.
@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\n"
return "Ok"
코드를 보면 IP 주소는 반드시 "127.0.0.1" 이어야 하고 userid는 "admin" 이어야한다.
<img src="/admin/notice_flag?userid=admin"> 를 입력하면 /memo에서 flag를 확인할 수 있다.
CSRF-2
이번에는 /admin/notice_flag 페이지가 없어지고 login 페이지가 생겼다.
@app.route("/change_password")
def change_password():
pw = request.args.get("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'
코드를 보면 /change_password라는 숨겨진 페이지가 있다.
GET 요청하면 해당 URL에서 pw 라는 파라미터의 값을 가져와 사용자의 패스워드로 변경시키도록 되어있다.
/flag 페이지를 통해 '/change_password?pw=1234' 와 같은 URL을 요청하게 하면 admin 계정의 비밀번호를 쉽게 얻어낼 수 있다.
'dreamhack' 카테고리의 다른 글
[Dreamhack] Mango (0) | 2024.01.10 |
---|---|
[Dreamhack] simple_sqli (1) | 2024.01.09 |
[Dreamhack] xss-2 (0) | 2023.12.31 |
[Dreamhack] xss-1 (0) | 2023.12.31 |
[Dreamhack] phpreg (0) | 2023.12.29 |