crawling 풀이
2023. 4. 23. 17:27ㆍDreamhack Wargame
728x90
#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)
문제에서 제공해 준 app.py 파일입니다.
40번째 줄(/admin) 부분에서 request.remote_addr이 127.0.0.1이어야 FLAG를 획득할 수 있다고 되어있습니다.
그러나 check_get()에서 이 부분을 필터링 하고있습니다.
이 부분을 우회하면 될 것 같습니다.
문제 페이지가 어떻게 동작하는지 확인하기 위해 제 블로그 URL을 넣어보겠습니다.
들어간 URL의 정보를 크롤링해 줍니다.
그럼 문제에서 필터링하고 있는 URL을 넣어보겠습니다.
바로 필터링되네요.
필터링을 우회하기 위해 URL을 URL 단축 사이트에 넣어서 입력해 보겠습니다.
이게 되네
728x90
'Dreamhack Wargame' 카테고리의 다른 글
[CodeEngn] Malware L08 풀이 (0) | 2023.08.30 |
---|---|
crt rsa 풀이 (0) | 2023.04.24 |
Long Sleep 풀이 (0) | 2023.04.21 |
baseball 풀이 (4) | 2022.10.06 |
Basic_Forensics_1 풀이 (0) | 2022.07.23 |