서버 생성 / 문제 파일 받기
페이지를 살펴보면 host를 입력하여 ping 명령어가 작동되는 걸 알 수 있습니다
host 이외의 다른 명령어를 대입해 봤는데 올바른 형식이 아니라고 나오네요
#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template, redirect
from flag import FLAG
APP = Flask(__name__)
@APP.route('/')
def index():
return render_template('index.html')
@APP.route('/ping', methods=['GET', 'POST'])
def ping():
if request.method == 'POST':
host = request.form.get('host')
cmd = f'ping -c 3 "{host}"'
try:
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
return render_template('ping_result.html', data=output.decode('utf-8'))
except subprocess.TimeoutExpired:
return render_template('ping_result.html', data='Timeout !')
except subprocess.CalledProcessError:
return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')
return render_template('ping.html')
if __name__ == '__main__':
APP.run(host='0.0.0.0', port=8000)
소스 코드를 살펴보면 POST 방식으로 host 입력란을 전달받아 cmd 변수로 ping 명령어를 실행하고 있습니다
하지만 어디에도 host 입력란을 필터링하는 부분을 찾을 수 없어 페이지로 돌아가 개발자 도구를 이용하여 host 입력란 요소를 살펴보니 pattern 부분을 찾아냈습니다 [A-Za-z0-9.]{5,20}은 정규식 표현으로 길이가 5~20 사이인 영문 대소문자와 숫자 0~9를 의미하는 필터링입니다
이 pattern 부분을 지우니 정상적으로 "요청한 양식과 일치시키세요"라는 문구가 표시되지 않아 [Ping!]을 눌러 ls 명령어와 같이 전달했는데 명령어 오류가 발생했습니다
cmd = f'ping -c 3 "{host}"'
아마 "{host}" 쪽에서 "을 우회하여 명령어를 전달할 필요성이 보입니다
쌍따옴표(")를 우회해서 ls 명령어와 같이 전달하니 정상적으로 현재 디렉터리의 파일을 확인하여 flag 파일을 알아냈습니다 이제 cat 으로 flag 파일을 읽어봅시다
이후 8.8.8.8";"cat flag.py를 입력했는데 위와 같이 오류가 또 발생했습니다 결국 cat flag.py 부분에 공백도 쌍따옴표(")로 묶었습니다
명령어와 공백을 쌍따옴표(")로 묶고 전달하니 정상적으로 flag 값을 확인할 수 있었습니다
[ 선수 학습 내용 ]