1、Web 应用表现形式
不一定为用户可见页面:各类 API 接口
不一定要依托浏览器才能使用: 用爬虫脚本,构造 HTTP Request 包即可
不一定需要标准的 Web 中间件:利用编程语言编写对应处理规则也可实现对用户请求的处理
2、Web 存在安全隐患的核心问题
- Web 应用类型复杂,防护经验无法复用
- Web 应用包含的服务组件众多,任意一个组件出现问题都会影响整体的安全程度
-
3、常见的抓包工具
Wireshark(抓取网卡通信的数据包)
- Burpsuite(利用 HTTP 代理抓取数据包)
Fiddler(HTTP 代理,效果类似 Burpsuite)
4、URL的基本格式
scheme:指定低层使用的协议,如 HTTP/HTTPS 等,目前浏览器默认以 HTTP 开头
- host: HTTP服务器的IP地址或者域名,如 www.XXXXXX.com/ 119.188.50.116
- port: 如果不是默认端口,则需注明端口( HTTP 默认端口为 80;https 默认端口为 443;端口与域名之间用冒号隔开;8080 不是 HTTP 默认端口,因此必须标明)
- path:访问资源的路径,在服务器中以 www 开头的路径,通常表示访问文件的地点
query-string:发送给 HTTP 服务器的数据;应用 GET 方式传输才有效;多个数据可用&进行分割,实现多组数
5、HTTP 协议
请求方式存在的漏洞:主要使用 GET 和 POST 两种方式开展请求
- GET 和 POST 请求方式的漏洞:可能因链路劫持而出现参数泄漏
PUT 请求方式的漏洞:早期 ASP 系统中存在大量 IIS PUT 漏洞,导致攻击者可直接利用 PUT 工具上传木马以获得 Webshell
5.1 请求消息报头涉及安全的内容
Host(必须存在): Host主要用于指定被请求资源的Internet主机和端口号,即标识请求目标。其来源为当前访问的URL。缺省端口号为 80,若指定了端口号(以8000为例)进行防卫,则变成 Host:www.a.com:8000
Content-Length: 标识当前请求包中的内容长度
- Origin: 用来标识本次请求的发起源、只适用于POST方式
- Referer: 用来标识当前请求的发起页面
- Accept: 用于指定客户端接收哪些类型的信息
- Accept-Encoding: 告知服务器端当前客户端可接受的内容编码
User-Agent:(简称UA,是必需存在的): 其中包含当前用户的操作系统、浏览器的基本信息,用于告知Web服务器当前访问者的情况。经常被Web服务器用于统计当前用户状态及行为
5.2 请求正文涉及安全的内容
参数命名应模糊,使得参数名称无法通过表面意思被理解,从而增加攻击者的分析难度
5.2.1 响应的类别
1XX 表示提示信息,说明请求已被成功接收,继续处理
- 2XX 表示成功,说明请求已被成功接收、理解、接受(200:OK,客户端请求成功;203:Temporarily Moved,页面临时重定向)
- 3XX 表示重定向,要完成请求必须进行更进一步处理(301:Permanently Moved,页面重定向)
- 4XX 表示客户端错误,请求有语法错误或请求无法实现
- 400:Bad Request,客户端请求有语法错误,不能被服务器所理解
- 401:Unauthorized,请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
- 403:Forbidden,服务器收到请求,但是拒绝提供服务。
- 404:Not Found,请求资源不存在,或者请求无法实现。
5XX:表示服务器端错误,服务器处理请求时出错。
Server Server 响应报头域包含服务器用来处理请求的软件信息
- Server:Apache 用来告知用户端提供本次响应的服务器端采用的中间件是 Apache
- X-Powered-By 用来标识实现当前 Web 站点所采用的语言及版本号
- Set-cookie 根据响应包生成 Cookie,并提供给客户端
- Content-Length 与请求包中的用法相同,用以标识当前响应包中的内容长度
HTTP协议涉及的安全问题:HTTP协议在传输内容时并没有采取任何加密措施,可利用网络抓包方法来直接获得HTTP包的内容,利用爆破等手段获得用户的敏感内容
6、HTTPS 协议
6.1 加密算法
在 HTTP 协 议基础上,利用 SSL 技术进行数据包的传输,避免传输内容在链路中被劫持,保障用户传输中的数据不被窃听。在安全传输反面,采用加密算法:
- 对称加密:服务器端和客户端使用相同的密钥来对信息进行加密与解密;处理速度非常快
- 非对称加密:客户端具有公钥,用来对数据进行加密,并且公钥可以公开传输,服务器端具有私钥,用于对用户的数据解密(建立安全通道时可利用非对称加密方式实现)
- 当用户利用HTTPS协议访问Web站点时,Web站点会向用户发送其加密算法的公钥。用户根据公钥对数据进行加密,从而实现建立安全通道的基础需求;验证站点发送的公钥是否真实
6.2 单双向认证
根据其认证次数可分 单向认证、双向认证
单向认证的主要流程如下:
- 客户端向服务器发起请求,其中包含各种 SSL 参数,并从服务器端拿到证书
- 客户端将从服务器端获得的证书提交至 CA,CA 验证该证书的合法性并告知客户端,客户端根据 CA 验证结果来确认目标站点的真实性
- 从服务器端的证书中取出公钥,利用公钥对客户端产生的密钥加密(对称密钥),并利用公钥将加密后的密钥发送到服务器端
- 服务器端用其私钥解密出数据,即得到客户端发送来的对称密钥,之后均利用这个对称密钥对传输文件进行加密/解密
但单向认证有一定的漏洞风险,不过也有应对措施:
- SSL 剥离攻击是针对 HTTPS 单向认证环境的攻击手段
- SSL 剥离攻击常用于 WiFi 劫持、ISP 层面的流量劫持等环境
- 经常访问的站点突然由 HTTPS 协议变成了 HTTP 协议,那么就需格外小心
- 这类劫持行为对用户的数据会产生较大的危害,同时也会危害到网站的利益
- 应对:在大型站点的高价值业务或者两个站点互联互通时均会利用HTTPS双向验证技术来解决上述安全隐患
双向认证的主要流程如下:
- 客户端向服务器发起请求,其中包含各种 SSL 参数,并从服务器端拿到证书
- 客户端将从服务器端获得的证书提交至 CA,CA 验证该证书的合法性并告知客户端,客户端根据 CA 验证结果来确认目标站点的真实性。
- 双方利用对方公钥加密来协商可支持的传输类型及密码方案。
- 服务器端要求客户端发送证书并验证,并接受用户的公钥。
- 客户端从服务器端的证书中取出公钥,利用公钥对客户端产生的密钥加密(对称密钥),并利用公钥将加密后的密钥发送到服务器端
- 服务器端用私钥解密出数据,即得到客户端发送来的对称密钥,之后所有内容均利用这个对称密钥对传输文件进行加密/解密
双向认证的优点:增加了服务器对客户端的合法性校验
双向认证的前提: 由于客户端没有针对特定网站的密钥生成机制,因此在双向认证时站点会要求客户端安装特定的插件
双向认证的适用场景:并不适用于全部的场景、只是在传输过程中利用SSL/TLS技术进行加密、 有效避免来自运营商层面的TCP劫持、主要防护传输过程中的安全
6.3 HTTPS 的优缺陷
- HTTPS 协议的优点:解决的是传输过程中的安全问题,可用来保障客户端的传输数据安全
HTTPS 协议的局限:并不会直接提升 Web 站点的安全性
7、Web 应用中的编码与加密
7.1 针对字符的编码:
单字节编码:8bit 只能提供 256 个编码定义, 常用 ASCII 编码
- 双字节编码:两个 8bit,可支持 65536 个汉字 ,常用 GBK、GB2312
查看方式:利用 Chrome 浏览器观察各种编码的效果、 Set Character Encoding 插件 指定编码格式
7.2 传输过程的编码 – URL
允许包含英文字母(a~z、A~Z)、数字(0~9)、4个特殊字符(-、_、.、~)以及所有保留字
- 还带有单引号、百分号、中文等(实际 Web 应用中所使用的字符)
- 主体采用的是 ASCII 编码表
- 编码方式:用%(百分号)加上两位字符代表一个字节(例如,单引号在 ASCII 中的十六进制编码为 27,在 URL 编码中就是 %27)
- 对中文字符的编码:先将其转换成当前页面所用的编码格式,然后在每个字符的每一组编码前添加%
对中文字符编码的举例:
当前页面使用utf-8编码 则在url编码前连接为 HTTP://172.29.152.23/loginPage.jsp?name=测试&passwd=ww121%$
则“测试”字符的 UTF-8 编码,其十六进制编码就是 “E6 B5 8B E8 AF 95”
进行 url 编码后变为:HTTP://172.29.152.23/loginPage.jsp?name=%E6%B5%8B%E8%AF%95&passwd=ww121%25$
7.3 Web 系统中的加密措施
标准的加密方法:对用户提交的参数(如密码、特定内容等)进行加密后再传输,避免参数在传输过程中被劫持
不需要服务器知道明文的内容:用户的隐私信息、不直接存储密码明文、利用 MD5/SHA-1 实现加密、信息摘要算法、 转换成长度固定的密文;针对相同内容每次执行算法得到的密文完全相同
需要服务器知道明文的内容:
- HTTP 协议传输过程中不会对其中的内容加密,导致在传输过程中内容被抓包
- 在 HTTP 下保障传输安全,采用对称加密(如 AES 方式等),但需要考虑加密算法的单次持续时间及重复程度、优化整体业务流程,从根本上降低需要加密传参的业务数量、利用JS混淆技术来提升加密算法的安全性
