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
- 알고리즘
- 워게임
- 드림핵
- 네트워크
- bee-box
- webhacking
- 시스템
- XSS
- 리버싱
- 소프트웨어보안
- 해킹
- CodeEngn
- 네트워크보안
- Web
- ftz
- System
- hacking
- 모의해킹
- 시스템해킹
- 비박스
- reversing
- network
- Webhaking
- TCP
- 순서도
- 웹해킹
- dreamhack
- 소프트웨어
- 웹
- WarGame
Archives
- Today
- Total
Without a Break
[Dreamhack] csrf-1 본문
vuln 페이지에서 Param 옆에 이미지 태그를 넣어서 먹히면 csrf 문제임을 알 수 있다.
[문제 파일]
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에 저장된 문자열들은 필터링한다.
- 만약 xss_filter에 저장된 문자열들이 있다면 param의 값을 *로 대체한다.
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", "")
if not check_csrf(param):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
- GET method의 요청을 받은 경우, flag.html(링크를 입력 받는 화면)을 보여준다.
- POST method의 요청을 받은 경우, param을 가져오고 이를 인자로 check_csrf 함수로 관리자에게 접속을 요청한다.
check_csrf()
def check_csrf(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)
- 로컬 url을 설정하고 이를 토대로 url을 답문 해준다.
memo()
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", None)
if text:
memo_text += text
return render_template("memo.html", memo=memo_text)
- 이용자가 요청(입력)한 메모 값을 가져온다.
- memo_text에 이용자가 입력한 값이 추가된다.
- memo.html에 기록된 메모를 출력한다.
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"
- 로컬호스트가 아니면 Access Denied 리턴한다.
- userid가 admin(관리자)이 아닐 경우, Access Denied 2를 리턴한다.
- 위의 조건들을 만족한 경우 메모에 플래그를 기록한다.
[풀이]
admin_notice_flag() 함수에서 로컬호스트가 아니면 Access Denied를 리턴한다고 하였으므로, 로컬호스트가 되도록 코드를 조작해야함을 알 수 있다.
vuln 페이지에 들어가면
스크립트가 필터링 되어 팝업창이 뜨지 않고 다음과 같은 화면이 뜨게 된다.
vuln 페이지의 검색창에서 스크립트 코드를 지우고 param에 img 태그를 입력하고 Dreamhack Tools의 Request Bin에서 생성한 링크를 입력하면
위와 같이 이미지 아이콘이 뜨는 것을 볼 수 있다.
따라서, 이 문제는 csrf 취약점을 이용하는 문제임을 알 수 있다.
우리는 로컬호스트가 관리자가 되도록 코드를 조작해야 한다.
즉, notice flag의 userid가 관리자가 되도록 해야 한다.
<img src="/admin/notice_flag?userid=admin" />
따라서, 위와 같이 입력한 후 메모 페이지로 이동하면
플래그 값이 출력된 것을 볼 수 있다.
답 : DH{11a230801ad0b80d52b996cbe203e83d}
'Web > Wargame' 카테고리의 다른 글
[Dreamhack] SQL Injection (0) | 2022.09.24 |
---|---|
[Dreamhack] csrf-2 (0) | 2022.09.24 |
[Dreamhack] ClientSide: CSRF (0) | 2022.09.21 |
[Dreamhack] xss-2 (0) | 2022.09.21 |
[Dreamhack] xss-1 (0) | 2022.09.21 |