#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
헤더를 확인하는 부분이 정확히 어떤 역할인지 모르겠습니다.
질문: 왜 서버의 공인 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