반응형
CCE-2023 연습문제 풀이 - baby web
public/app.py
@app.route('/', methods=['GET','POST'])
def index():
if request.method == "POST":
try:
url = request.form['url']
result = urllib.parse.urlparse(url)
if result.hostname == 'flag.service':
return "Not allow"
else:
if(valid_ip(result.hostname)):
return "huh??"
else:
return requests.get("http://"+result.hostname+result.path, allow_redirects=False).text
except:
return "Something wrong..."
elif request.method == "GET":
return data
보면 POST로 들어온 값중에 url을 파싱해서 result라는 변수에 담고 result.hostname으로 flag.service라는 internal 서버로의 접근을 제어하고 있다. 서버가 두개가 있고, 외부 서버에서 내부 서버로 접근할 수 있는 부분이 있는걸 보니 전형적인 SSRF 문제이다.
internal/app.py
from flask import Flask
from flask import request
from secret import FLAG
app = Flask(__name__)
@app.route('/flag', methods=['GET'])
def index():
if request.host == "flag.service":
return FLAG
else:
return "Nice try :)"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80)
internal 서버의 코드를 보니 /flag로 요청할 때 host가 flag.service면 flag가 나온다.
그렇다면 외부서버에서 internal 서버로 요청을 주면 된다.
딱히 필터링 구문이 없어서 url 단축 링크로 공격을 시도했더니 안되었다.
그 다음 url encoding을 해서 우회를 시도했다.
flag가 나왔다.
WEB HACKING [100] - Login me
딱봐도 SQL Injection 문제이다.
몇 가지 테스트를 해보니까 쿼리가 올바르면 관리자 계정으로만 접근할 수 있다고 했다. 그래서 id에 admin이 들어가고 'admin'을 넣어서 true 값이 나오게 해줬다. 이후 나머지는 주석처리 했다.
WEB HACKING [100] - Request forgery
Request forgery 라고 해서 csrf를 생각하면서 문제를 풀다가, 웹페이지보고 파일다운로드인가 싶다가, ssrf로 풀었다.
파일을 다운로드 할 수 있으니까 file:/flag 를 넣어서 풀었다.
728x90
'웹해킹 > CTF' 카테고리의 다른 글
GCHD CTF Web PoC - SSTI URL Health Check and Heapdump (0) | 2023.11.27 |
---|---|
UDCTF 2023 web Writeup (0) | 2023.11.05 |
BucketCTF 2023 SQLi-1 Writeup (0) | 2023.04.11 |
Wolve CTF 2023 zombie101 Writeup (0) | 2023.03.21 |
b01lers CTF warmup Writeup (0) | 2023.03.20 |