728x90
@app.route('/request')
def url_request():
url = request.args.get('url', '').lower()
title = request.args.get('title', '')
if url == '' or url.startswith("file://") or "flag" in url or title == '':
return render_template('request.html')
try:
data = urlopen(url).read()
mini_database.append({title: base64.b64encode(data).decode('utf-8')})
return redirect(url_for('view'))
except:
return render_template("request.html")
바로 소스코드를 확인해 봤다.!
소스코드에는 file:// 또는 flag 가 입력이 안되게 필터링이 되어있는 검증 로직이 존재한다.
그러면 우리가 해야 하는 일은 이 부분들을 우회하는 것이다.
1. file:// 우회
startswith("file://") 은 결국에 앞 문자열이 file:// 이 아니면 된다 그렇기 때문에 앞 문자열에 ''file:// 공백으로 처리하여 우회를 할 수 있다.
다른 방법으로는 <file://> 양 옆에 <>을 넣거나 file:/처럼 /을 하나만 넣어 우회가 가능하다.!
2. flag 우회
flag 같은 경우는 더블 인코딩을 하여 우회하는 방법이 있다.
flag을 fl%61g로 인코딩을 하면 검증 로직에 걸리지 않는다.
3. payload
<file://fl%61g.txt>
해당 payload를 보내면 urlopen(file://flag.txt). read()가 실행이 되면서 flag값을 얻을 수 있다.
flag값이 base64 형태로 인코딩 되어 있다.!
base64로 디코딩을 하면 flag 값을 얻을 수 있다.
'모의해킹 > Dreamhack' 카테고리의 다른 글
node-serialize (0) | 2023.12.18 |
---|---|
Relative Path Overwrite Advanced (0) | 2023.12.06 |
Relative Path Overwrite (0) | 2023.12.02 |
phpMyRedis (0) | 2023.12.01 |
Client Side Template Injection (0) | 2023.11.25 |