왜 서버의 공인 IP 를 직접 입력하면 접근이 안되는건가요??
#app.py
import socket
import requests
import ipaddress
from urllib.parse import urlparse
from flask import Flask, request, render_template

app = Flask(__name__)
app.flag = '__FLAG__'

def lookup(url):
    try:
        return socket.gethostbyname(url)
    except:
        return False

def check_global(ip):
    try:
        return (ipaddress.ip_address(ip)).is_global
    except:
        return False

def check_get(url):
    ip = lookup(urlparse(url).netloc)
    if ip == False or ip =='0.0.0.0':
        return "Not a valid URL."
    res=requests.get(url)
    if check_global(ip) == False:
        return "Can you access my admin page~?"
    for i in res.text.split('>'):
        if 'referer' in i:
            ref_host = urlparse(res.headers.get('refer')).netloc
            if ref_host == 'localhost':
                return False
            if ref_host == '127.0.0.1':
                return False 
    res=requests.get(url)
    return res.text

@app.route('/admin')
def admin_page():
    if request.remote_addr != '127.0.0.1':
        return "This is local page!"
    return app.flag

@app.route('/validation')
def validation():
    url = request.args.get('url', '')
    ip = lookup(urlparse(url).netloc)
    res = check_get(url)
    return render_template('validation.html', url=url, ip=ip, res=res)

@app.route('/')
def index():
    return render_template('index.html')

if __name__=='__main__':
    app.run(host='0.0.0.0', port=3333)

일단 SSRF와 Open Redirection을 활용해서 문제를 풀기는 했습니다. 근데 이 방법이 안 되는 이유를 정확히 모르겠네요.

문제 코드이고, index 페이지에서 그냥 서버 주소를 넣으면 어디서 막히는건지 잘 모르겠어요.
뭔가 False 하고 뜨는것도 아니고 그냥 한참 요청이 처리되지 않다가 오류가 표시되네욤

그리고 referer 헤더를 확인하는 부분이 정확히 어떤 역할인지 모르겠습니다.

#web
작성자 정보
답변 1

질문: 왜 서버의 공인 IP 를 직접 입력하면 접근이 안되는건가요?
일단 유효한 IP는 접근이 가능했습니다 아마도 질문자님이 유효하지 않은 IP를 입력한 경우에 왜 한참동안 아무 반응이 없는지 궁금하신거 같은데

코드 27번 라인의 res=requests.get(url) 에서 유효하지 않은 주소를 가져오려 했기 때문에 예외가 발생하고 이에 대한 예외처리가 되어있지 않아 서버가 클라이언트로 response를 돌려주기 이전에 코드 실행이 종료되는 것이 원인으로 생각됩니다.

질문: Referer가 어떤 의미인가요?

Referer는 현재 요청을 어떤 페이지에서 했는지 알려주는 header 입니다.
이 헤더가 localhost 혹은 127.0.0.1이면 이 요청 이전에 localhost에 접속한 것이기 때문에
SSRF 공격을 시도한 것으로 판단하는 구조입니다.

예를 들어 http://attacker.com 에 접속하고 이 사이트에서
http://localhost/admin 으로 리다이렉트 하거나 혹은 자바스크립트 코드
location.href = 'http://localhost/admin' 를 실행하면 다음과 같은 헤더가 표시됩니다

Referer: http://attacker.com

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