SSTI (Server Side Template Injection)
RootedCON рд╕реНрдкреЗрди рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд╛рдЗрдмрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдФрд░ рдпреВрд░реЛрдк рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рддрдХрдиреАрдХреА рдЬреНрдЮрд╛рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдорд┐рд╢рди рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рдВрдЧреНрд░реЗрд╕ рд╣рд░ рдЕрдиреБрд╢рд╛рд╕рди рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдФрд░ рд╕рд╛рдЗрдмрд░ рд╕реБрд░рдХреНрд╖рд╛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдмрд╛рд▓рддрд╛ рд╣реБрдЖ рдмреИрдардХ рдмрд┐рдВрджреБ рд╣реИред
What is SSTI (Server-Side Template Injection)
Server-side template injection рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░реА рд╣реИ рдЬреЛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрдордЬреЛрд░реА рд╡рд┐рднрд┐рдиреНрди рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Jinja рд╢рд╛рдорд┐рд▓ рд╣реИред
Jinja рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рд╣реИ рдЬреЛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ Jinja рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрдордЬреЛрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
рдЗрд╕ рдХрдордЬреЛрд░ рдХреЛрдб рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ name
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реАрдзреЗ render
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ name
рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЗрд▓реЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
The payload {{bad-stuff-here}}
рдХреЛ name
рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкреЗрд▓реЛрдб Jinja рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЕрдирдзрд┐рдХреГрдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИред
рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рд╛рдл рдФрд░ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдорд╛рдиреНрдпрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╕рдВрджрд░реНрдн-рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд▓реЗ рдПрд╕реНрдХреЗрдкрд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕ рдХрдордЬреЛрд░реА рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
Detection
рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди (SSTI) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрдЬрд╝ рдХрд░рдирд╛ рдПрдХ рд╕реАрдзрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдЗрд╕рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ (${{<%[%'"}}%\
) рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рдФрд░ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкреЗрд▓реЛрдб рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдВрддрд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдХрдордЬреЛрд░реА рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
рдлреЗрдВрдХреЗ рдЧрдП рддреНрд░реБрдЯрд┐рдпрд╛рдБ, рдЬреЛ рдХрдордЬреЛрд░реА рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИрдВред
рдкрд░рд╛рд╡рд░реНрддрди рдореЗрдВ рдкреЗрд▓реЛрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдпрд╛ рдЗрд╕рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдЧрд╛рдпрдм рд╣реЛрдирд╛, рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
Plaintext Context: XSS рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ,
{{7*7}}
,${7*7}
)редCode Context: рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдХрд░ рдХрдордЬреЛрд░реА рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
http://vulnerable-website.com/?greeting=data.username
рдореЗрдВgreeting
рдХреЛ рдмрджрд▓рдХрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрддрд┐рд╢реАрд▓ рд╣реИ рдпрд╛ рд╕реНрдерд┐рд░, рдЬреИрд╕реЗgreeting=data.username}}hello
рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред
Identification Phase
рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЗрд▓реЛрдб рдХрд╛ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдкреЗрд▓реЛрдб рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЙрдирдореЗрдВ ${7/0}
, {{7/0}}
, рдФрд░ <%= 7/0 %>
рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
Tools
рдПрдХ рдкреНрд░рднрд╛рд╡реА SSTI + CSTI рд╕реНрдХреИрдирд░ рдЬреЛ рдирд╡реАрдирддрдо рдкреЙрд▓реАрдЧреНрд▓реЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЯреЗрдмрд▓ рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреЙрд▓реАрдЧреНрд▓реЙрдЯреНрд╕ рдФрд░ 44 рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
Exploits
Generic
рдЗрд╕ wordlist рдореЗрдВ рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреБрдЫ рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
Java
Java - Basic injection
рдЬрд╛рд╡рд╛ - рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
Java - /etc/passwd рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
FreeMarker (Java)
рдЖрдк рдЕрдкрдиреЗ рдкреЗрд▓реЛрдбреНрд╕ рдХреЛ https://try.freemarker.apache.org рдкрд░ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} рдХреБрдЫ рдирд╣реАрдВ
${foobar}
Freemarker - рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрд╛рдпрдкрд╛рд╕
тЪая╕П рдХреЗрд╡рд▓ Freemarker рдХреЗ 2.3.30 рд╕реЗ рдиреАрдЪреЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
https://portswigger.net/research/server-side-template-injection рдХреЗ FreeMarker рдЕрдиреБрднрд╛рдЧ рдореЗрдВ
Velocity (Java)
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
https://portswigger.net/research/server-side-template-injection рдХреЗ Velocity рдЕрдиреБрднрд╛рдЧ рдореЗрдВ
Thymeleaf
Thymeleaf рдореЗрдВ, SSTI рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ${7*7}
, рдЬреЛ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рджреВрд░рд╕реНрде рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
SpringEL:
OGNL:
Thymeleaf рдХреЛ рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рднреАрддрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, expression inlining рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ [[...]]
рдпрд╛ [(...)]
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╕рд░рд▓ SSTI рдкрд░реАрдХреНрд╖рдг рдкреЗрд▓реЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ [[${7*7}]]
ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреЗрд▓реЛрдб рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдХрдо рд╣реЛрддреА рд╣реИред Thymeleaf рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЧрддрд┐рд╢реАрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ; рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдСрди-рдж-рдлреНрд▓рд╛рдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ TemplateResolver
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред
Thymeleaf expression preprocessing рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдбрдмрд▓ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ (__...__
) рдХреЗ рднреАрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╕рдВрд╕реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ Thymeleaf рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Example of Vulnerability in Thymeleaf
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рд╢реЛрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдЗрди рдЗрдирдкреБрдЯреНрд╕ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреВрд░рд╕реНрде рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ URLs рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ:
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЬрд╛рд╡рд╛)
рдлрд┐рд▓реНрдЯрд░ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдВ
рдпрджрд┐ ${...}
рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХрдИ рд╡реЗрд░рд┐рдПрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ #{...}
, *{...}
, @{...}
рдпрд╛ ~{...}
ред
/etc/passwd
рдкрдврд╝реЗрдВ
рдкреЗрд▓реЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реНрдпреВ рдореИрдирд┐рдкреБрд▓реЗрд╢рди (рдЬрд╛рд╡рд╛)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Pebble рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг ( < рд╕рдВрд╕реНрдХрд░рдг 3.0.9):
рдирдИ рд╕рдВрд╕реНрдХрд░рдг Pebble :
рдЬрд┐рдирдЬрд╛рд╡рд╛ (Java)
Jinjava рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ Hubspot рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдкрд▓рдмреНрдз рд╣реИ https://github.com/HubSpot/jinjava/
Jinjava - рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди
рдЗрд╕рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ https://github.com/HubSpot/jinjava/pull/230
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
Hubspot - HuBL (Java)
{% %}
рдХрдерди рд╕реАрдорд╛рдВрдХрдХ{{ }}
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реАрдорд╛рдВрдХрдХ{# #}
рдЯрд┐рдкреНрдкрдгреА рд╕реАрдорд╛рдВрдХрдХ{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
"com.hubspot.content.hubl.context.TemplateContextRequest" рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ рдФрд░ Jinjava рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ Github рдкрд░ рдЦреЛрдЬреЗрдВ.
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Expression Language (EL) рдПрдХ рдореМрд▓рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд (рдЬреИрд╕реЗ рд╡реЗрдм рдкреГрд╖реНрда) рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ (рдЬреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдмреАрди) рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реБрдЧрдо рдмрдирд╛рддреА рд╣реИ JavaEE рдореЗрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ JavaEE рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред EL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдореБрдЦ JavaEE рддрдХрдиреАрдХреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
JavaServer Faces (JSF): JSF рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмреИрдХрдПрдВрдб рдбреЗрдЯрд╛ рдФрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП EL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
JavaServer Pages (JSP): JSP рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдФрд░ рдореИрдирд┐рдкреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП EL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
Contexts and Dependency Injection for Java EE (CDI): EL CDI рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗрдм рдкрд░рдд рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдмреАрди рдХреЗ рдмреАрдЪ рдирд┐рд░реНрдмрд╛рдз рдмрд╛рддрдЪреАрдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрдЧрдард┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддреА рд╣реИред
EL рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╢реЛрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рджреЗрдЦреЗрдВ:
EL - Expression LanguageрдЧреНрд░реВрд╡реА (Java)
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдмрдВрдзрдХ рдмрд╛рдпрдкрд╛рд╕ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред
тАЛтАЛRootedCON рд╕реНрдкреЗрди рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд╛рдЗрдмрд░рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдФрд░ рдпреВрд░реЛрдк рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рддрдХрдиреАрдХреА рдЬреНрдЮрд╛рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдорд┐рд╢рди рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рдВрдЧреНрд░реЗрд╕ рд╣рд░ рдЕрдиреБрд╢рд╛рд╕рди рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдФрд░ рд╕рд╛рдЗрдмрд░рд╕реБрд░рдХреНрд╖рд╛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдмрд╛рд▓рддрд╛ рд╣реБрдЖ рдмреИрдардХ рдмрд┐рдВрджреБ рд╣реИред
Smarty (PHP)
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
Smarty рдЕрдиреБрднрд╛рдЧ рдореЗрдВ https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╛рд░реВрдк
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
https://portswigger.net/research/server-side-template-injection рдХреЗ Twig рдФрд░ Twig (Sandboxed) рдЕрдиреБрднрд╛рдЧ рдореЗрдВ
Plates (PHP)
Plates рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯрд┐рдВрдЧ рдЗрдВрдЬрди рд╣реИ рдЬреЛ PHP рдХреЗ рд▓рд┐рдП рд╕реНрд╡рджреЗрд╢реА рд╣реИ, рдЬреЛ Twig рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, Twig рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдПрдХ рдирдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, Plates рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕реНрд╡рджреЗрд╢реА PHP рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
Controller:
рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ:
рд▓реЗрдЖрдЙрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ:
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
PHPlib рдФрд░ HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB PHPlib рдХреЗ рд╕рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ Pear рдкрд░ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
authors.tpl