Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 네트워크
- XSS
- 해킹
- dreamhack
- ftz
- 드림핵
- webhacking
- 네트워크보안
- bee-box
- Webhaking
- 시스템해킹
- WarGame
- System
- 모의해킹
- reversing
- hacking
- 알고리즘
- 순서도
- Web
- network
- CodeEngn
- 리버싱
- 비박스
- 워게임
- TCP
- 웹해킹
- 시스템
- 소프트웨어
- 소프트웨어보안
- 웹
Archives
- Today
- Total
Without a Break
[Dreamhack] csrf-2 본문
[문제 파일]
vuln()
@app.route("/vuln")
def vuln():
param = request.args.get("param", "").lower()
xss_filter = ["frame", "script", "on"]
for _ in xss_filter:
param = param.replace(_, "*")
return param
- 이용자에게 요청(입력)받은 param의 값을 소문자로 변경한다.
- xss_filter에 저장된 문자열은 필터링하여 *로 치환한다.
flag()
@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'
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>'
- GET method를 요청받은 경우, flag.html 페이지를 보여준다.
- POST method를 요청받은 경우, 16진수로 16비트의 랜덤 세션 아이디를 생성하고 admin에 대한 세션을 생성한다.
change_password()
@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'
- pw 변수에 get 방식으로 패스워드의 파라미터 값과 세션 아이디를 가져온다.
- session_id 변수에 요청받은 쿠키의 sessionid 값을 저장한다.
- session_id가 session_storage에 없을 경우 'please login'을 출력한다.
- user의 비밀번호를 변경할 수 있음
[풀이]
vuln 페이지에서는 script가 필터링 되어 팝업창이 뜨지 않고 다음과 같이 뜬다.
users = {
'guest': 'guest',
'admin': FLAG
}
문제 코드의 이 부분을 보면 guest와 admin의 2개의 계정이 있음을 알 수 있다.
현재 비밀번호를 아는 계정은 guest밖에 없으므로 guest로 로그인을 해 준다.
로그인을 하면 당신은 admin이 아니라는 문구가 뜬다.
이제 flag 페이지에서 admin이 되도록 조작할 것이다.
vuln 페이지에서 알 수 있듯이 script 태그는 사용할 수 없으므로 csrf 취약점임을 이용해 img 태그를 사용한다.
chage_password()에서 admin의 비밀번호를 조작할 수 있었으므로
<img src="/change_password?pw=1111">
위의 코드를 flag 페이지에 입력하고 제출한다.
그 다음, 바꾼 비밀번호를 통해 admin 계정으로 로그인 하면
플래그가 출력되는 것을 알 수 있다.
답 : DH{c57d0dc12bb9ff023faf9a0e2b49e470a77271ef}
'Web > Wargame' 카테고리의 다른 글
[Dreamhack] simple_sqli (0) | 2022.09.24 |
---|---|
[Dreamhack] SQL Injection (0) | 2022.09.24 |
[Dreamhack] csrf-1 (0) | 2022.09.24 |
[Dreamhack] ClientSide: CSRF (0) | 2022.09.21 |
[Dreamhack] xss-2 (0) | 2022.09.21 |