문제 풀이 질문
Burp Suite랑 request 모듈로 문제를 풀이하긴 했는데, 왜 웹서버에서 바로 ../flag
를 폼에 입력하면 flag가 나오지 않는걸까요?
elif request.method == 'POST':
userid = request.form.get('userid', '')
info = requests.get(f'{API_HOST}/api/user/{userid}').text
return render_template('get_info.html', info=info)
어쩌피 위에서 info
에 값을 가져올 때, API_HOST/api/user/../flag
로 GET
요청을 보내는 것은 웹 서버의 로컬호스트라서 가능하지 않나요..?
#web
작성자 정보
답변
1
rubiya
강의 수강: 10
이론상 맞습니다만, 브라우저는 요청을 보내기 전에 URL에 대해서 정규화(normalization)를 수행합니다.
크롬 등 대부분의 현대 브라우저에서는 상위 디렉토리를 의미하는 ../ 가 들어오면 이를 먼저 해석한 후 그 결과를 서버로 넘깁니다.
즉 /api/user/../flag
를 url창에 넣고 엔터를 누르더라도 서버로 /api/user/../flag
가 그대로 넘어가지 않고 브라우저에서 정규화를 수행한 결과인 /api/flag
가 넘어가기에 flag가 출력되지 않습니다.
버프나 파이썬 requests라이브러리에서는 풀리는건 그들은 정규화를 하지 않기에 그렇구요.