CTF/웹해킹

[n00bzCTF] Conditions - 웹해킹

SecurityMan 2023. 6. 22. 11:00

 

조금 어려웠던 웹해킹 문제

 

일반적인 해킹 기법에 대한 문제가 아니라서

 

적당한 페이로드를 찾는데 시간이 걸렸다.

 

반응형

 

문제에서는 server.py 파일과

 

문제 페이지 주소가 주어진다.

 

 

문제 페이지에 접속하면

 

이렇게 Username 을 입력할 수 있는 칸이 나온다.

 

from flask import Flask, request, render_template, render_template_string, redirect
import subprocess
import urllib
flag = open('flag.txt').read()
app = Flask(__name__)
@app.route('/')
def main():
    return redirect('/login')

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        if len(request.values["username"]) >= 40:
            return render_template_string("Username is too long!")
        elif len(request.values["username"].upper()) <= 50:
            return render_template_string("Username is too short!")
        else:
            return flag
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

 

server.py 의 내용은 위와 같다.

 

flag 를 획득하려면

 

username 이 40 글자 미만이고,

 

username 의 .upper() (대문자) 가 50글자 초과여야 한다.

 

만약 요구사항을 충족하지 못하면

 

Username is too long/short! 라는 문구가 출력된다.

 

 

그런데 상식적으로

 

소문자가 대문자로 바뀌었다고 해서

 

usernmae(소문자) < 40, username(대문자) > 50 을 만족하는 글자가 있을리가 없다.

 

len 은 글자 수를 의미하는 것이기 때문에

 

대문자로 바꾼다고 해서 글자 수가 바뀌진 않기 때문이다.

 

그럼에도 이런 문제가 나왔다는 것은

 

대문자로 바꿨을때 글자수가 변하는 문자가 있기 때문이라고 생각했고,

 

한글, 한자 등등 각종 유니코드 문자들을 다 가져와서 테스트 해봤다.

 

 

그러다가 찾아냈다!

 

ß 요 문자인데

 

소문자일땐 ß 였다가,

 

대문자로 바꾸면 SS 가 되어서 2글자가 된다.

 

 

해당 문자를 30개 정도 넣어서 

 

Submit 을 눌러주면

 

 

플래그를 확인할 수 있다.

반응형