본문 바로가기

모의해킹/Dreamhack

Dream Gallery

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