3 -【 API 开放平台安全设计 】- 5 抓包工具分析 HTTP 请求
1 什么是 HTTP
请求
底层为 Socket
TCP
长连接技术。
HTTP
请求是客户端与服务器端超文本传输协议。
HTTP
协议中分为:请求头
、请求体
、响应头
、响应体
。
请求与响应是同步的。
2 抓包环境搭建
1 依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- SpringBoot web 核心组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- JSTL 标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- tomcat 的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- SpringBoot 外部tomcat支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- SpringBoot 对lombok 支持 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2 配置文件
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
3 启动项
package com.snow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
4 页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆</title>
</head>
<body>
<form action="loginJSON" method="post">
<span> 用户名称:</span><input type="text" value="" name="userName"><br>
<span>用户密码:</span><input type="password" name="passWord" value=""><br>
<input type="submit" value="提交"><br>
</form>
</body>
</html>
5
Controller
package com.snow.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
/**
* @author :yang-windows
* @Title : springboot
* @Package :com.snow.controller
* @Description : 首页访问
* @date :2020/4/17 1:21
*/
@Controller
public class IndexController {
/**
* 登陆页面
*
* @return
*/
@RequestMapping("/loginPage")
public String loginPage() {
return "loginPage";
}
/**
* 登陆返回json格式
*
* @param userName
* @param passWord
* @return
*/
@PostMapping("/loginJSON")
@ResponseBody
public String login(String userName, String passWord) {
System.out.println("userName:" + userName + ",passWord:" + passWord);
return "userName:" + userName + ",passWord:" + passWord;
}
/**
* 自定义重定向
*
* @param response
*/
@RequestMapping("/customRedirection")
public void customRedirection(HttpServletResponse response) {
// 告诉给客户端重定向
response.setStatus(302);
response.setHeader("location", "loginPage");
return;
}
/**
* 重定向到登陆页面
*
* @return
*/
@RequestMapping("/redirectloginPage")
public String redirectLogin() {
return "redirect:/loginPage";
}
}
3 HTTP
重定向原理
重定向底层实现原理:
客户端向服务器端发送请求时,服务器端如果重定向的话,返回的状态码为 302
给客户端,在响应头中存放 location
,对应的值就是重定向的地址,客户端如果收到 302
的状态码的话,那么直接浏览器本地进行访问。
/**
* 自定义重定向
*
* @param response
*/
@RequestMapping("/customRedirection")
public void customRedirection(HttpServletResponse response) {
// 告诉给客户端重定向
response.setStatus(302);
response.setHeader("location", "loginPage");
return;
}
/**
* 重定向到登陆页面
*
* @return
*/
@RequestMapping("/redirectloginPage")
public String redirectLogin() {
return "redirect:/loginPage";
}
启动项目,浏览器访问:http://127.0.0.1:8080/redirectloginPage
抓包工具分析:
重定向与转发区别:
转发是发生在单个服务器内部的,而重定向是将 302
状态码和 location
里面的地址发送搭配浏览器,由浏览器本地访问 location
里面的地址。
4 抓包获取密码
启动项目,浏览器访问:http://127.0.0.1:8080/loginPage
输入用户名和密码:
抓包工具抓取 HTTP
请求:
5 常用抓包工具
5.1 Flidder
fiddler 是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。也可以用来检测网络安全。反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能用了之后就忘记了,每次去网站上找也很麻烦,所以搜集各大网络的资料,总结了一些常用的功能。
5.2 wireshark
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
网络封包分析软件的功能可想像成 “电工技师使用电表来量测电流、电压、电阻” 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。
6 抓包工具原理
是位于客户端和服务器端的 HTTP
代理,也是目前最常用的 http 抓包工具之一 。
它能够记录客户端和服务器之间的所有 HTTP 请求,可以针对特定的 HTTP 请求,分析请求数据、设置断点、调试 web 应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 web 调试的利器。
7 Fiddler
简介
fiddler 是一款功能强大的抓包工具,在测试 web 安全性,查看请求数据或者头文件的时候能起到很大的作用,今天给大家介绍利用Fiddler来修改请求或者返回的数据,以此来验证网站完全漏洞;
为什么移动端传输需要加密?因为可能会被抓包工具获取到明文参数
7.1 使用 fiddler
拦截请求参数
配置拦截 Http 请求信息:
重新提交表单:
修改 Http 请求基本信息,修改参数,再点击 Run to Completion
:
发现参数被篡改了:
7.2 使用 fiddler
修改响应参数
配置拦截 Http 请求信息:
重新提交表单:
修改 Http 响应基本信息,修改参数,再点击 Run to Completion
:
显示:
8 如何防御抓包工具篡改数据
验签,参数虽然是明文,但是可以防止篡改
抓包工具原理: