渗透测试网站安全漏洞检测大体方法

发布时间:2020-08-04 23:33:58 作者:网站安全
来源:ITPUB博客 阅读:192

近期对平台安全渗透测试中遇到有JAVA+mysql架构的网站,针对此架构我们Sine安全渗透工程师整理了下具体的漏洞检测方法和防护修复方法,很多像执行框架漏洞获取到系统权限,以及跨权限写入木马后门等等操作,希望大家在渗透测试的道路中发现更多的知识和经验。

渗透测试网站安全漏洞检测大体方法

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 <class 'int'>"

从上面这个简单的例子不难知道,当我们可以控制要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())

"csubprocess\nPopen\np1\n((S'cmd.exe'\np2\ntp3\ntp4\nRp5\n."

4.2.2.2. 其他

4.2.3. 沙箱

4.2.3.1. 常用函数

4.2.3.2. 绕过

4.2.3.3. 防御

Python官方给出了一些防御的建议

4.2.4. 框架

4.2.4.1. Django

4.2.4.1.1. 历史漏洞

4.2.4.1.2. 配置相关

4.2.4.2. Flask

Flask默认使用客户端session,使得session可以被伪造

4.2.5. 危险函数 / 模块列表

4.2.5.1. 命令执行

4.2.5.2. 危险第三方库

4.2.5.3. 反序列化

Java

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远程调用步骤:

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. 生命周期为

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. 请求流程

4.3.2.2.3. 相关CVE

4.3.2.3. Spring MVC

4.3.2.3.1. 请求流程

4.3.3. 容器

常见的Java服务器有Tomcat、Weblogic、JBoss、GlassFish、Jetty、Resin、IBM Websphere等,这里对部分框架做一个简单的说明。

4.3.3.1. Tomcat

Tomcat是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,用于开发和调试JSP程序。

在收到请求后,Tomcat的处理流程如下:

Tomcat服务器是由一系列可配置的组件构成的,其中核心组件是Catalina Servlet容器,它是所有其他Tomcat组件的顶层容器。

4.3.3.1.1. 相关CVE

4.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

4.3.3.3. JBoss

4.3.3.3.1. 简介

JBoss是一个基于J2EE的管理EJB的容器和服务器,但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。

4.3.3.3.2. 相关CVE

4.3.4. 沙箱

4.3.4.1. 简介

Java实现了一套沙箱环境,使远程的非可信代码只能在受限的环境下执行。

4.3.4.2. 相关CVE

4.3.5. 反序列化

4.3.5.1. 简介

序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。Java中的 ObjectOutputStream 类的 writeObject() 方法可以实现序列化,类 ObjectInputStream类的readObject() 方法用于反序列化。

如果要实现类的反序列化,则是对其实现 Serializable 接口。

4.3.5.2. 序列数据结构

4.3.5.3. 序列化流程

4.3.5.4. 反序列化流程

4.3.5.5. 相关函数

4.3.5.6. 主流JSON库

4.3.5.6.1. GSON

Gson默认只能反序列化基本类型,如果是复杂类型,需要程序员实现反序列化机制,相对比较安全。

4.3.5.6.2. Jackson

除非指明@jsonAutoDetect,Jackson不会反序列化非public属性。在防御时,可以不使用enableDefaultTyping方法。

相关CVE有

4.3.5.6.3. Fastjson

相关CVE有

4.3.5.7. 存在危险的基础库

4.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漏洞渗透测试有想进一步了解的可以咨询专业的网站安全公司,国内推荐Sinesafe,绿盟,启明星辰等等专业的安全维护公司。

推荐阅读:
  1. hadoop生态的大体介绍
  2. 网站渗透测试公司的成长之路

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

大体 安全漏洞 方法

上一篇:logstash快速入门

下一篇:如何保护云中的工作负载

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》