JAVA架构网站安全漏洞渗透测试检测手法
gaoyangw 2024-10-16 09:37 47 浏览 0 评论
近期对平台安全渗透测试中遇到有JAVA+mysql架构的网站,针对此架构我们安全渗透工程师整理了下具体的漏洞检测方法和防护修复方法,很多像执行框架漏洞获取到系统权限,以及跨权限写入木马后门等等操作,希望大家在渗透测试的道路中发现更多的知识和经验。
4.2.1. 格式化字符串
在Python中,有两种格式化字符串的方式,在Python2的较低版本中,格式化字符串的方式为 "this is a %s" % "test" ,之后增加了format的方式, 语法为 "this is a {}".format('test') 或者 "this is a {test}".format(test='test')
当格式化字符串由用户输入时,则可能会造成一些问题,下面是一个最简单的例子
'class of {0} is {0.__class__}'.format(42)
"class of 42 is "
从上面这个简单的例子不难知道,当我们可以控制要format的字符串时,则可以使用 init / globals 等属性读取一些比较敏感的值,甚至任意执行代码。
4.2.2. 反序列化
4.2.2.1. pickle
class A(object):
... a = 1
... b = 2
... def __reduce__(self):
... return (subprocess.Popen, (('cmd.exe',),))
cPickle.dumps(A())
"csubprocessnPopennp1n((S'cmd.exe'np2ntp3ntp4nRp5n."
4.2.2.2. 其他
PyYAMLmarshalshelve4.2.3. 沙箱
4.2.3.1. 常用函数
eval / exec / compiledir / typeglobals / locals / varsgetattr / setattr4.2.3.2. 绕过
最简单的思路是在已有的模块中import,如果那个模块中已经 import 可以利用的模块就可以使用了在父类中寻找可用的模块,最常见payload是 ().__class__.__bases__[0].__subclasses__() 或者用魔术方法获取全局作用域 init__.__func__.__globals有些网站没有过滤 pickle 模块,可以使用 pickle 实现任意代码执行,生成 payload 可以使用有的沙箱把相关的模块代码都被删除了,则可以使用libc中的函数,Python 中调用一般可以使用 ctypes 或者 cffi。"A""B" == "AB"4.2.3.3. 防御
Python官方给出了一些防御的建议
使用Jython并尝试使用Java平台来锁定程序的权限使用fakeroot来避免使用一些rootjail的技术4.2.4. 框架
4.2.4.1. Django
4.2.4.1.1. 历史漏洞
CVE-2016-7401 CSRF BypassCVE-2017-7233/7234 Open redirect vulnerabilityCVE-2017-12794 debug page XSS4.2.4.1.2. 配置相关
Nginx 在为 Django 做反向代理时,静态文件目录配置错误会导致源码泄露。访问 /static.. 会 301 重定向到 /static../4.2.4.2. Flask
Flask默认使用客户端session,使得session可以被伪造
4.2.5. 危险函数 / 模块列表
4.2.5.1. 命令执行
os.popenos.systemos.spawnos.forkos.execpopen2commandssubprocessexecexecfileevaltimeit.systimeit.timeitplatform.osplatform.sysplatform.popenpty.spawnpty.osbdb.oscgi.sys…4.2.5.2. 危险第三方库
Templatesubprocess324.2.5.3. 反序列化
marshalPyYAMLpicklecPickleshelvePILJava
4.3.1. 基本概念
JVM是Java平台的核心,以机器代码来实现,为程序执行提供了所需的所有基本功能,例如字节码解析器、JIT编译器、垃圾收集器等。由于它是机器代码实现的,其同样受到二进制文件受到的攻击。
JCL是JVM自带的一个标准库,含有数百个系统类。默认情况下,所有系统类都是可信任的,且拥有所有的特权。
4.3.1.2. JNDI
JNDI(Java Naming and Directory Interface,JAVA命名和目录接口)是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。
4.3.1.3. OGNL
OGNL(Object-Graph Navigation Language,对象导航语言)是一种功能强大的表达式语言,通过简单一致的表达式语法,提供了存取对象的任意属性、调用对象的方法、遍历整个对象的结构图、实现字段类型转化等功能。
Struts2中使用了OGNL,提供了一个ValueStack类。ValueStack分为root和context两部分。root中是当前的action对象,context中是ActionContext里面所有的内容。
4.3.1.4. RMI
RMI(Remote Method Invocation,远程方法调用)能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java虚拟机中的对象上的方法。
RMI远程调用步骤:
客户调用客户端辅助对象stub上的方法客户端辅助对象stub打包调用信息(变量,方法名),通过网络发送给服务端辅助对象skeleton服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton服务端辅助对象将结果打包,发送给客户端辅助对象stub客户端辅助对象将返回值解包,返回给调用者客户获得返回值4.3.2. 框架
4.3.2.1. Servlet
4.3.2.1.1. 简介
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
4.3.2.1.2. 生命周期为
客户端请求该 Servlet加载 Servlet 类到内存实例化并调用init()方法初始化该Servlet service()(根据请求方法不同调用 doGet() / doPost() / … / destroy()4.3.2.1.3. 接口
init()
在 Servlet 的生命期中,仅执行一次 init() 方法,在服务器装入 Servlet 时执行。
service()
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet对象,该对象的 service() 方法就要被调用,而且传递给这个方法一个”请求”(ServletRequest)对象和一个”响应”(ServletResponse)对象作为参数。
4.3.2.2. Struts 2
4.3.2.2.1. 简介
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
4.3.2.2.2. 请求流程
客户端发送请求的tomcat服务器请求经过一系列过滤器FilterDispatcher调用ActionMapper来决定这个请求是否要调用某个ActionActionMppaer决定调用某个ActionFilterDispatcher把请求给ActionProxyActionProxy通过Configuration Manager查看structs.xml,找到对应的Action类ActionProxy创建一个ActionInvocation对象ActionInvocation对象回调Action的execute方法Action执行完毕后,ActionInvocation根据返回的字符串,找到相应的result,通过HttpServletResponse返回给服务器4.3.2.2.3. 相关CVE
CVE-2016-3081 (S2-032)CVE-2016-3687 (S2-033)CVE-2016-4438 (S2-037)CVE-2017-5638CVE-2017-7672CVE-2017-9787CVE-2017-9793CVE-2017-9804CVE-2017-9805CVE-2017-12611CVE-2017-15707CVE-2018-1327CVE-2018-117764.3.2.3. Spring MVC
4.3.2.3.1. 请求流程
用户发送请求给服务器服务器收到请求,使用DispatchServlet处理Dispatch使用HandleMapping检查url是否有对应的Controller,如果有,执行如果Controller返回字符串,ViewResolver将字符串转换成相应的视图对象DispatchServlet将视图对象中的数据,输出给服务器 服务器将数据输出给客户端4.3.3. 容器
常见的Java服务器有Tomcat、Weblogic、JBoss、GlassFish、Jetty、Resin、IBM Websphere等,这里对部分框架做一个简单的说明。
4.3.3.1. Tomcat
Tomcat是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,用于开发和调试JSP程序。
在收到请求后,Tomcat的处理流程如下:
客户端访问Web服务器,发送HTTP请求Web服务器接收到请求后,传递给Servlet容器Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器Tomcat服务器是由一系列可配置的组件构成的,其中核心组件是Catalina Servlet容器,它是所有其他Tomcat组件的顶层容器。
4.3.3.1.1. 相关CVE
CVE-2019-0232CVE-2017-12615CVE-2013-2067CVE-2012-4534CVE-2012-4431CVE-2012-3546CVE-2012-3544CVE-2012-2733CVE-2011-3375CVE-2011-3190CVE-2008-29384.3.3.2. Weblogic
4.3.3.2.1. 简介
WebLogic是美国Oracle公司出品的一个Application Server,是一个基于Java EE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。其将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
WebLogic对业内多种标准的全面支持,包括EJB、JSP、Servlet、JMS、JDBC等。
4.3.3.2.2. 相关CVE
CVE-2019-2658CVE-2019-2650CVE-2019-2649CVE-2019-2648CVE-2019-2647CVE-2019-2646CVE-2019-2645CVE-2019-2618CVE-2019-2615CVE-2019-2568CVE-2018-3252CVE-2018-3248CVE-2018-3245CVE-2018-3201CVE-2018-3197CVE-2018-3191CVE-2018-1258CVE-2017-10271CVE-2017-3248CVE-2016-3510CVE-2015-48524.3.3.3. JBoss
4.3.3.3.1. 简介
JBoss是一个基于J2EE的管理EJB的容器和服务器,但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
4.3.3.3.2. 相关CVE
CVE-2017-121494.3.4. 沙箱
4.3.4.1. 简介
Java实现了一套沙箱环境,使远程的非可信代码只能在受限的环境下执行。
4.3.4.2. 相关CVE
CVE-2012-0507CVE-2012-4681CVE-2017-3272CVE-2017-32894.3.5. 反序列化
4.3.5.1. 简介
序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。Java中的 ObjectOutputStream 类的 writeObject() 方法可以实现序列化,类 ObjectInputStream类的readObject() 方法用于反序列化。
如果要实现类的反序列化,则是对其实现 Serializable 接口。
4.3.5.2. 序列数据结构
0xaced 魔术头4.3.5.3. 序列化流程
ObjectOutputStream实例初始化时,将魔术头和版本号写入bout (BlockDataOutputStream类型) 中调用ObjectOutputStream.writeObject()开始写对象数据○ObjectStreamClass.lookup()封装待序列化的类描述 (返回ObjectStreamClass类型) ,获取包括类名、自定义serialVersionUID、可序列化字段 (返回ObjectStreamField类型) 和构造方法,以及writeObject、readObject方法等○writeOrdinaryObject()写入对象数据
■写入对象类型标识
■writeClassDesc()进入分支writeNonProxyDesc()写入类描述数据写入类描述符标识写入类名写入SUID (当SUID为空时,会进行计算并赋值)计算并写入序列化属性标志位写入字段信息数据写入Block Data结束标识写入父类描述数据
■writeSerialData()写入对象的序列化数据若类自定义了writeObject(),则调用该方法写对象,否则调用defaultWriteFields()写入对象的字段数据 (若是非原始类型,则递归处理子对象)4.3.5.4. 反序列化流程
ObjectInputStream实例初始化时,读取魔术头和版本号进行校验调用ObjectInputStream.readObject()开始读对象数据○读取对象类型标识○readOrdinaryObject()读取数据对象
■readClassDesc()读取类描述数据读取类描述符标识,进入分支readNonProxyDesc()读取类名读取SUID读取并分解序列化属性标志位读取字段信息数据resolveClass()根据类名获取待反序列化的类的Class对象,如果获取失败,则抛出ClassNotFoundExceptionskipCustomData()循环读取字节直到Block Data结束标识为止 读取父类描述数据initNonProxy()中判断对象与本地对象的SUID和类名 (不含包名) 是否相同,若不同,则抛出InvalidClassExceptionObjectStreamClass.newInstance()获取并调用离对象最近的非
■Serializable的父类的无参构造方法 (若不存在,则返回null) 创建对象实例
■readSerialData()读取对象的序列化数据若类自定义了readObject(),则调用该方法读对象,否则调用defaultReadFields()读取并填充对象的字段数据4.3.5.5. 相关函数
ObjectInputStream.readObjectObjectInputStream.readUnsharedXMLDecoder.readObjectYaml.loadXStream.fromXMLObjectMapper.readValueJSON.parseObject4.3.5.6. 主流JSON库
4.3.5.6.1. GSON
Gson默认只能反序列化基本类型,如果是复杂类型,需要程序员实现反序列化机制,相对比较安全。
4.3.5.6.2. Jackson
除非指明@jsonAutoDetect,Jackson不会反序列化非public属性。在防御时,可以不使用enableDefaultTyping方法。
相关CVE有
CVE-2017-7525CVE-2017-150954.3.5.6.3. Fastjson
相关CVE有
CVE-2017-183494.3.5.7. 存在危险的基础库
commons-fileupload 1.3.1
commons-io 2.4
commons-collections 3.1
commons-logging 1.2
commons-beanutils 1.9.2
org.slf4j:slf4j-api 1.7.21
com.mchange:mchange-commons-java 0.2.11
org.apache.commons:commons-collections 4.0
com.mchange:c3p0 0.9.5.2
org.beanshell:bsh 2.0
b5org.codehaus.groovy:groovy 2.3.9
org.springframework:spring-aop 4.1.4.
RELEASE4.3.5.8.
网站漏洞修复和防护
4.3.5.8.1. Hook resolveClass
在使用 readObject() 反序列化时会调用 resolveClass 方法读取反序列化的类名,可以通过hook该方法来校验反序列化的类,一个Demo如下
以上的Demo就只允许序列化 SerialObject ,通过这种方式,就可以设置允许序列化的白名单
4.3.5.8.2. ValidatingObjectInputStream
Apache Commons IO Serialization包中的 ValidatingObjectInputStream 类提供了 accept 方法,可以通过该方法来实现反序列化类白/黑名单控制,一个demo如下
4.3.5.8.3. ObjectInputFilter
Java 9提供了支持序列化数据过滤的新特性,可以继承 java.io.ObjectInputFilter 类重写 checkInput方法来实现自定义的过滤器,并使用 ObjectInputStream 对象的 setObjectInputFilter 设置过滤器来实现反序列化类白/黑名单控制,对JAVA漏洞渗透测试有想进一步了解的可以咨询专业的网站安全公司。
相关推荐
- 手把手教你30分钟搭建企业官网:零基础也能搞定的傻瓜式教程
-
想给公司做个网站展示产品,又怕被程序员忽悠花冤枉钱?今天教你个绝招——用现成的网站模板"拼"网站!就像搭乐高一样简单,全程鼠标点点就能搞定,连代码都不用碰。第一步:挑个合身的"...
- 以Twig模板为例浅学一手SSTI(twig中文)
-
什么是SSTISSTI:开局一张图,姿势全靠ySSTI,即服务器端模板注入(Server-SideTemplateInjection)...
- 成功上岸腾讯运营,教你如何写校招简历?
-
产品策划/运营的校招简历应该怎么写?作者从自身实际情况出发,总结分享了相关经验,希望对你有用。写在前面红红火火恍恍惚惚,本人是一位2020届本科毕业生,校招意向互联网产品类。此前有过产品相关的项目&a...
- 50个精彩的响应式HTML和CSS模板:上
-
自由设计固然是一件好事儿,然而经常关注先进的设计作品,久而久之,就会帮你节省更多的布景设计时间,视觉效果也明显会更为专业,可以参考以下这些响应式HTML/CSS模板,实用性高,你肯定能从中汲取不...
- 你的人生,有多少“模板”?(扣好人生第一粒扣子手抄报模板可打印)
-
你浏览网页时,注意过那些海报吗?海报不仅仅是广告,还可以传递新闻信息,也常常摘要一些金句热词。作为一种新的传播形式,海报传递信息,简洁快捷,鲜明突出,往往有意想不到的效果。然而,做一张网络海报并不容易...
- 5款值的推荐的高效工具软件(高效工作软件哪个好用)
-
现在,有很多实用的工具和软件可以帮助我们更高效地完成各种任务。以下是几个值得推荐的工具和软件,能够极大地提高我们的工作效率。1.矢量设计——AffinityDesigner...
- 广州津虹YY直播成立“麦絮”厂牌 打造直播界短剧新标杆
-
3月31日,广州津虹YY直播在广州举办了生态大会暨麦絮短剧星光点映礼,宣布正式成立短剧厂牌“麦絮”,旨在宣传和推广自制短剧。广州津虹YY直播计划聚焦生态故事,与旗下公会、主播,以及百度、七猫、爱奇艺、...
- 广州哪家小程序开发公司比较靠谱?这三家值得推荐
-
小程序已成为企业数字化的重要工具,广州作为互联网产业重镇,小程序开发公司众多。如何选择靠谱的服务商?本文推荐三家实力突出的公司,供您参考。一、广州聆科网络技术有限公司本土老牌技术团队,专注小程序定制开...
- 西北嚎狼解析SEOer如何写好优质的软文
-
什么是软文?狭义:指企业花钱在报纸或杂志等宣传载体上刊登的纯文字性的广告。广义:企业通过策划在杂志或网络等宣传载体上刊登的提升企业品牌形象和知名度。软文:以摆事实讲道理的方式使用使消费者走进企业设定的...
- 花了15分钟答题,成功成为内容品鉴官了
-
午后的阳光在手机屏上碎成光斑,我盯着弹窗里闪烁的「恭喜」二字,指尖悬停在半空忘了动作。第三次了,那些被题库支配到深夜的郁结,此刻正顺着喉咙往上涌,最终化成一声压在胸腔里的叹息——这次终究是不同的。(一...
- 怎样写出能突破一切封锁的好广告(怎样写出能突破一切封锁的好广告作文)
-
每天拿出一分钟来学习,你得生命会更加精彩,我是洪雨有个朋友跟我讲,“现在发广告真难啊,发个链接就被删了,有时候你起的名字里带点广告都不行,引流真难啊……洪雨为什么你几乎可以在任何地方做广告,是怎么做到...
- 你能看出几个广告?软文分享《一个程序员的一天》
-
从电视广告到平面广告,再到各个banner、病毒视频、软文、HTML5等等等,各家公司为了给自家的产品做广告费尽了心思,无所不用其极。小编近日看见一篇文章,一时间竟没反应出这是一篇软文!只能说6666...
- 中小企业发稿总被拒?资深编辑教你3招软文发布轻松过审
-
中小企业新闻媒体发稿经常被拒怎么办?资深编辑教你3招软文发布轻松过审:发稿流程和投稿要点、注意事项分享...
- 「源生活」那些让人惊喜的中秋节软文广告
-
说起中秋节,我相信很多人会想起来很多物品,小编想到的是:水果,月亮,月饼,鲜花。此外还有数不尽好广告,好文案。当然了中秋节作为下半年的第一个大节日,显得就比较重要了。特别是又是传统佳节,又是法定节假日...
- 软文案例标题和内容怎么写(软文优秀案例)
-
1:软文营销专家南昌牛推科技(媒介星软文平台)全网营销+一对一服务成长软文案例标题和内容怎么写?软文营销专家南昌牛推科技(媒介星软文平台)全网营销+一对一服务成长,从业务经验出发分享一些心得。软文标题...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)
- 百度收录批量查询工具 (48)
- 网站服务器 (53)
- 学生个人网页制作html (56)
- 一键优化 (67)
- 网页制作软件 (49)