문제 풀이 질문

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/../flagGET 요청을 보내는 것은 웹 서버의 로컬호스트라서 가능하지 않나요..?

#web
작성자 정보
답변 1
avatar
rubiya
강의 수강: 10

이론상 맞습니다만, 브라우저는 요청을 보내기 전에 URL에 대해서 정규화(normalization)를 수행합니다.
크롬 등 대부분의 현대 브라우저에서는 상위 디렉토리를 의미하는 ../ 가 들어오면 이를 먼저 해석한 후 그 결과를 서버로 넘깁니다.
/api/user/../flag 를 url창에 넣고 엔터를 누르더라도 서버로 /api/user/../flag 가 그대로 넘어가지 않고 브라우저에서 정규화를 수행한 결과인 /api/flag 가 넘어가기에 flag가 출력되지 않습니다.
버프나 파이썬 requests라이브러리에서는 풀리는건 그들은 정규화를 하지 않기에 그렇구요.

2024.11.06. 00:10
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기