Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 자바스크립트
- 보안뉴스 요약
- 보안뉴스
- 자바스크립트 node
- 자바스크립트 기본 문법
- javascript
- GIT
- ES6
- 오라클
- oracle db
- php
- 보안뉴스요약
- 자바스크립트 API
- 깃허브
- 자바스크립트 jQuery
- 카카오프로젝트100
- 다크웹
- 카카오프로젝트 100
- oracle
- 자바스크립트 prototype
- 보안뉴스한줄요약
- Oracle SQL
- 자바스크립트 객체
- numpy
- 보안뉴스 한줄요약
- 카카오프로젝트
- python
- 랜섬웨어
- 자바스크립트 element api
- 파이썬
Archives
- Today
- Total
FU11M00N
[ DreamHack ] csrf-1 본문
- 문제 정보
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
CSRF 취약점을 이용해 플래그를 획득하세요.
#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for, session, g
from selenium import webdriver
import urllib
import os
app = Flask(__name__)
app.secret_key = os.urandom(32)
try:
FLAG = open('./flag.txt', 'r').read()
except:
FLAG = '[**FLAG**]'
def read_url(url, cookie={'name': 'name', 'value': 'value'}):
cookie.update({'domain':'127.0.0.1'})
try:
options = webdriver.ChromeOptions()
for _ in ['headless', 'window-size=1920x1080', 'disable-gpu', 'no-sandbox', 'disable-dev-shm-usage']:
options.add_argument(_)
driver = webdriver.Chrome('/chromedriver', options=options)
driver.implicitly_wait(3)
driver.set_page_load_timeout(3)
driver.get('http://127.0.0.1:8000/')
driver.add_cookie(cookie)
driver.get(f'http://127.0.0.1:8000/csrf?csrf={urllib.parse.quote(url)}')
except:
driver.quit()
return False
driver.quit()
return True
@app.route('/')
def index():
return render_template('index.html')
@app.route('/csrf')
def csrf():
csrf = request.args.get('csrf', '').lower()
xss_filter = ['frame', 'script', 'on']
for _ in xss_filter:
csrf = csrf.replace(_, '*')
return csrf
@app.route('/flag', methods=['GET', 'POST'])
def flag():
if request.method == 'GET':
return render_template('flag.html')
elif request.method == 'POST':
csrf = request.form.get('csrf', '')
if not read_url(csrf):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
memo_text = ''
@app.route('/memo')
def memo():
global memo_text
text = request.args.get('memo', None)
if text:
memo_text += text.replace('<', '<') + '\n'
return render_template('memo.html', memo=memo_text)
@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 'Your not admin'
memo_text += f'[Notice] flag is {FLAG}\n'
return 'Ok'
app.run(host='0.0.0.0', port=8000)
flag 값은 /admin/notice_flag에서 얻을수있다.
csrf 라우트를 보면 'frame' , 'script' 'on' 이 세개가 *로 치환되어 필터링된다.
즉 <script> <iframe> onerror 와 같은것을 써서 문제를 풀지못하므로 img 태그를 사용하여 문제를 풀어야한다.
/admin/notice_flag 라우트를 보면
global memo_text
if request.remote_addr != '127.0.0.1':
return 'Access Denied'
if request.args.get('userid', '') != 'admin':
return 'Your not admin'
memo_text += f'[Notice] flag is {FLAG}\n'
userid가 admin이면 flag값을 memo_text에 넣어주는데 memo_text는 글로벌 변수이므로 flag를 memo에 출력된다는것을 알수있다. 또한 127.0.0.1로 접근해야한다. 이는 관리자가 아니면 확인 할 수없다는것이다.
그리고 바로 /admin/notice_flag 에 접근을 하면 'Your not admin' 이 출력이 되므로,
uesrid를 admin으로 변경 후 요청 해야한다.
즉 페이로드는 아래와 같다.
<img src="/admin/notice_flag?userid=admin">
/flag 페이지에서 페이로드를 요청하면 /memo 페이지에 flag가 적힌다.
'Web Hacking > DreamHack' 카테고리의 다른 글
[ DreamHack ] command-injection-1 (0) | 2021.03.28 |
---|---|
[ DreamHack ] simple-ssti (0) | 2021.03.28 |
[ DreamHack ] proxy-1 (0) | 2021.03.28 |
[ DreamHack ] image-storage (0) | 2021.03.28 |
[ DreamHack ] file-download-1 (0) | 2021.03.28 |
Comments