조금 어려웠던 웹해킹 문제
일반적인 해킹 기법에 대한 문제가 아니라서
적당한 페이로드를 찾는데 시간이 걸렸다.
반응형
문제에서는 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 을 눌러주면
플래그를 확인할 수 있다.
반응형
'CTF > 웹해킹' 카테고리의 다른 글
[TMUCTF] Login - 웹해킹 / PHP (67) | 2023.07.07 |
---|---|
[n00bzCTF] Secret Group - 웹해킹 / 헤더변조 (73) | 2023.06.26 |
[n00bzCTF] Club_N00b - 웹해킹 (83) | 2023.06.21 |
[DanteCTF] Dumb Admin - 웹해킹 / Webshell (84) | 2023.06.18 |
[DanteCTF] Dante Barber Shop - 웹해킹 / SQL Injection (76) | 2023.06.16 |