본문 바로가기

웹해킹/CTF

CCE-2023 연습문제 풀이 - baby web

반응형

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