@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\n"
return "Ok"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
두번째 조건문을 보고 /flag에서 <img src="/admin/notice_flag?userid=admin">
넣어서 여차저차 풀었는데, 첫번째 조건문에서의 127.0.0.1이라는 주소가 무엇을 뜻할까요? 그리고 처음 문제를 받았을때 /admin/notice_flag 페이지에서 Access Denied가 뜨면 현재 주소가 127.0.0.1이 아니라는 뜻 아닌가요...? 그리고 왜 <img src="/admin/notice_flag?userid=admin">넣은것으로 바로 해결됬을까요?
- if request.remote_addr != "127.0.0.1":에서 뜻하는 주소의 의미를 알려주세요
- if request.remote_addr != "127.0.0.1":의 조건문에서 주소가 127.0.0.1인 경우에만 두번째 조건문으로 들어가 userid를 확인하는 것이 아닌가요?
- <img src="/admin/notice_flag?userid=admin">를 넣으면 주소가 127.0.0.1로 되는 것일 까요?
- 아직 모르는것이 많아 어떤분이 보시기엔 너무나 당연한 것을 질문한 것일지 모르겠습니다. 답변해주시는 분들 감사드리며 드림핵내부에서 참고할만한 문서가 있을까요?
127.0.0.1은 루프백 IP 주소로, 컴퓨터 자기 자신을 가리킵니다. 따라서 해당 코드는 외부에서 접속한 사용자가 아니라 서버 컴퓨터 내부에서 요청이 발생한 경우에만 다음 조건으로 넘어가도록 조건문을 걸어 놓은 것입니다.
따라서 /admin/notice_flag
경로에 풀이자 분이 브라우저를 이용해서 직접 접근할 시 Access Denied가 뜨는 것은 문제 서버 내부가 아닌 외부에서 접근하였기 때문에 그러한 문구가 출력되는 것입니다.
페이로드를 입력하면 해결이 되는 이유는 서버 코드와 내부 작동 원리를 이해하면 알 수 있는데 입력된 페이로드가 문제 서버 내부에서 요청이 발생하도록 프로그래밍되어 있기 때문입니다.
웹 해킹을 공부할 때 웹 애플리케이션이 어떻게 작동하고 브라우저와 웹 서버가 어떻게 통신하는지 네트워크는 어떤 원리로 작동하는지 등을 아는 것은 매우 중요합니다. 따라서 웹 개발과 네트워크 쪽 함께 웹 해킹 공부와 병행해보시면 좋을 것 같습니다.