문제화면
문제화면에 보면 Ping을 보낼 수 있게 Host 란 IP를 입력하는 칸이 있다.
8.8.8.8 그대로 넣어 한번 실험해보자.
실행
Ping 명령어로 잘 먹히는 거 같다.
시퀀스 번호를 보여주는 형식을 보아하니 Linux 운영 체제인걸 알 수 있다.
윈도 cmd에서는 byte 크기를 보여준다.
코드를 한번 확인해 보자.
Code_read
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)
import subprocess
중요한 부분을 보면...
cmd = f'ping -c 3 "{host}"'
이 부분이 submit 했을 때 실행되는 거 같다.
문제 이름이 injection 이니까 injection 해보자.
개인적인 문제 해결 방식으로 생각하는 것은 ping 명령어와 함께 내가 injection 할 명령어를 같이 넣어주는 방법으로 할 생각이다.
값을 받는 "{host}" 안에 넣을 명령어를 생각하면 된다.
그러면 먼저 ping 보내기 위해 8.8.8.8" 넣어준다면 cmd 변수는 값을 'ping -c 3 "8.8.8.8""' 이런 상태로 받아들이게 된다.
리눅스 명령어를 넣고 뒷부분은 주석처리 한다면 먹힐 거 같다.
코드를 읽어서 문제풀이에 대한 방법을 얻을 수가 있다.
문제풀이 방법
injection을 하려면 싱글쿼터(') , 더블쿼터(")를 써야 하는데...
넣어보니까 요청한 형식과 일치시키라고 한다.
input tag를 자세히 보면
<input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required="">
pattern 속성 값을 보면 '[A-Za-z0-9.]{5,20}로 사용자가 입력할 수 있는 값의 형식을 제한하는 기능이 있다.
(이 값만 쓰세요 ~)
정규표현식을 이용해서 대문자 알파벳, 소문자 알파벳 0~9까지의 숫자 마침표 '.' 쓸 수 있게 만들었다.
그러면 우회하려면 그냥 개발자 도구에서 elements에서 pattern 속성을 지워주도록 하자
그러면 아무 값이나 넣어도 된다.
해결
Ping 명령어와 따로 넣은 명령어가 같이 들어가서 플래그 값을 얻을 수가 있다.
'DreamHack' 카테고리의 다른 글
DreamHack - simple-phparse (0) | 2024.07.28 |
---|---|
DreamHack - simple-ssti (0) | 2024.05.17 |
DreamHack - image-storage (0) | 2024.05.17 |
DreamHack - baby-sqlite (0) | 2024.04.30 |
Dreamhack - Csrf2 (수정) (0) | 2024.04.05 |