服务端模板注入:现代WEB长途代码履行
0x01 开发Exploit
许多的模板引擎都会企图约束模板程序履行恣意代码才能,来防止应用层逻辑对表达式引擎的进犯。还有一些模板引擎则测验经过沙盒等手法来安全处理不可信的用户输入。在这些办法之下,开发一个模板后门变得十分有挑战性。
FreeMarker
FreeMarke是最盛行的Java模板之一,也是最频频的交给用户操作的模板。FreeMarker官网解说了答应“用户供给”模板的危险性:
对应翻译:
22.能够答应用户上传模板文件吗,这对安全性有影响吗? 一般来说,你不应该答应用户做这样的操作,除非是管理员或许可信用户。考虑到模板便是和*.java文件相似的源代码文件。假如你仍然想要答应用户上传模板文件,这里是你应该考虑的东西:http://freemarker.org/docs/app_faq.html#faq_template_uploading_security
在一些相似DoS这种低危险安全问题之后,咱们能够看到下面这个:
对应翻译:
内置的new操作符 (Configuration.setNewBuiltinClassResolver,Environment.setNewBuiltinClassResolver):在模板文件中像这样运用”com.example.SomeClass”?new(),这个对FTL库来说很重要,可是在正常的模板文件中时不需求运用。FreeMarker中包括一个TemplateModel接口,这个接口能够用于结构恣意java目标,new操作符能够实例化TemplateModel的完结类。有一些危险的TemplateModel完结类有或许会在classpath中。 就算一个类没有完结TemplateModel接口,这个类里边的静态代码块也会被履行。为了防止这种状况呈现,你能够运用TemplateClassResolver类来限制对类的拜访,像下面这样:TemplateClassResolver.ALLOWS_NOTHING_RESOLVER
这条正告略显奥秘,可是它让咱们想到经过内置的new操作符来完结exp也许是能够的。让咱们看一下关于new操作符的文档:
对应翻译:
这个内置的操作符需求引起安全重视,由于模板的编写人能够经过它来结构恣意java目标然后运用这些结构处理的java目标,只需他们完结了TemplateModel接口。而且模板编写者还能够触发类中静态代码块中的代码,即便这个类没有完结TemplateModel接口。假如你答应不是很信赖的用户上传模板,你应该看一下下面这个主题。http://freemarker.org/docs/ref_builtins_expert.html#ref_builtin_new
TemplateModel的完结类中存在对咱们有用的类吗?让咱们来看一下这个接口的JavaDoc:
一个类的姓名呈现了:Execute。
检查这个类的概况能够发现它能够做咱们想要做的事:接纳输入而且履行
运用它十分简略:
${ ex("id") }
uid=119(tomcat7) gid=127(tomcat7) groups=127(tomcat7)
这个payload在后面将会十分有用。
弥补:
经过对TemplateModel的其他完结类进行研究,发现ObjectConstructor类相同很有用,从姓名上就能够看出来,这个类是用来结构其他类的目标的,看一下代码就能够理解怎么运用了:
经过代码能够看到供给类称号和结构函数的参数,就能够使用ObjectConstructor类结构咱们想要的类,有了这个咱们就能够履行恣意java代码了,下面给出两个实例,一个是履行指令,另一个是文件读取。
指令履行:
${line}
${"
"}
文件读取:
${line?html}
${"
"}
Velocity
Velocity是另一个盛行的Java模板结构,十分难exploit。没有“安全注意事项”页面来指出存在危险的函数和内部变量。下面这张截图显现的是用Burp暴力破解变量名,左边是payload右边是服务器的返回值。
变量class看起来有用,由于它返回了一个Object类的Class目标。经过Google找到了这个链接https://velocity.apache.org/tools/releases/2.0/summary.html:
能够看到一个办法和一个特点:
[1] [2] [3] 黑客接单网