3.1HTTP
HTTP(超文本协议),是访问万维网使用的核心通信协议。他是应用层
最初,Http只是一个获取基于文本的静态资源而开发的简单协议,后来经过慢慢拓展使他发展成支持如今常见的复杂分布式应用程序
HTTP使用是一种基于消息的模型:客户端送出一条消息,服务器返回一条响应消息。虽然HTTP使用有状态的TCP协议作为它的传输机制,但每次请求响应都是自动完成,并且可能使用不同TCP链接。
HTTP链接:https://blog.csdn.net/min996358312/article/details/68969519
3.1.1HTTP请求
HTTP请求所必备的几大要素:请求行、请求头(headerField)、请求体(body)
转自:https://blog.csdn.net/min996358312/article/details/68969519
***请求头内容
Host: 目标服务器的网络地址
Accept: 让服务端知道客户端所能接收的数据类型,如text/html */*
Content-Type: body中的数据类型,如application/json; charset=UTF-8
Accept-Language: 客户端的语言环境,如zh-cn
Accept-Encoding: 客户端支持的数据压缩格式,如gzip
User-Agent: 客户端的软件环境,我们可以更改该字段为自己客户端的名字,比如QQ music v1.11,比如浏览器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
Connection: keep-alive,该字段是从HTTP 1.1才开始有的,用来告诉服务端这是一个持久连接,“请服务端不要在发出响应后立即断开TCP连接”。关于该字段的更多解释将在后面的HTTP版本简介中展开。
Content-Length: body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有。
POST请求的body请求体也有可能是空的,因此POST中Content-Length也有可能为0
Cookie: 用于提交服务器向客户端发布的其他参数。
Referer:消息头用于表示发出请求的原始URL。
3.1.2HTTP响应
同理,响应也有状态行、响应头、实体内容
响应内容
HTTP/1.1 200 OK
Server:
Date: Mon, 15 Jul 2019 01:41:42 GMT
Content-Type: text/plain
Content-Length: 8
Connection: close
Last-Modified: Mon, 15 May 2017 18:04:40 GMT
ETag: "ae780585f49b94ce1444eb7d28906123"
Accept-Ranges: bytes
X-Amz-Cf-Id: XynSX2vzurE73kgtnAd736a-cM1psbRKfJ108_b7LtxUBjC-aTLoyQ==
3.1.3HTTP方法
当渗透测试员攻击Web应用程序坑定会用到 Get和Post 方法。我们要知道两者的差异,忽略差异可能危及应用程序的安全。
Get方法 作用于获取资源
Post 方法作用是执行操作。使用这个方法可以在URL查询字符串与主体消息中发送请求参数。如果用户单击浏览器上的“后退”按钮,返回一个使用这种方法访问的页面,浏览器不会自动发送请求而是会发送警告。这种操作可防止用户无意中多次执行同一个操作。因此执行某一操作是必须使用POST请求。
出了get和post外,http还支持其他目的而建立的方法。如下:
HEAD : 这个方法与GET类似,不同在于服务器不会再响应中返回消息主体。返回的消息头与对应的Get请求返回的消息相同。 这种方法用于检查某一资源在向其提交Get请求前是否存在。
Trace : 这种方法主要用于诊断。服务器应在响应主体中返回其受到的请求消息的具体内容(内容包含代理服务器相关操作的内容)。这种方法可用于检测客户端与服务器之间是否存在任何请求的代理服务器。
options: 这种方法要求服务器报告对某一特殊资源有效地HTTP方法(返回起作用的HTTP方法名)。服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效地方法。
put : 这个方法试图使用包含在请求主体中的内容,向服务器指上传定的资源。如果激活这个防滑没渗透测试员就可以利用它来攻击应用程序。例如,通过上传任意一段脚本并在服务器上执行该脚本来攻击应用程序。
3.1.4 URL
url(统一资源定位符)是标识Web资源唯一的标识符(正确用于是URI)
3.1.5 REST
表述性状态转移(Rest)是分布式系统的一种体系架构,在这类体系统架构中,请求和响应包含系统资源当前状态的表述。
查询字符串中包含参数的URL本身遵循REST约束,但不是“REST风格的”URL
查询字符串中包含参数的URL:http: // xxx.com/search?make=ford&model=pinto REST风格的”URL : http: //xxx.com/search/ford/pinto
3.1.6 Http 消息头
http支持很多不同的消息头,其中有一些专用于特殊用途。一些响应头可用在请求与响应中,而其他的智能专门用在某个特定的消息中。下面说一些渗透测试员在供给web应用程序时可能遇到的消息头。
1、常用消息头
Connection: 告诉通信的另一端 Http 完成传输后 TCP链接是保持连接以接受其他消息,还是关闭
Content - Encodin : 规定消息主体的字节长度
Content - Type : 规定消息主体的内容信息。例如HTML文档的内容类型为text/html。
Transfer- Encoding : 指定为方便其通过HTTP传输二队消息主体使用的任何编码。 通常用他指定块编码
2、请求消息头
Accept:告诉服务器,客户端愿意接受哪些内容。如图像、办公文档等
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为;Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:
先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content-Length:表示请求消息正文的长度。
Cookie:这是最重要的请求头信息之一
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host:初始URL中的主机和端口。
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304;Not Modified”应答。
Pragma:同于向浏览器传送缓存指令
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
X-Fram-Options. : 指示浏览器框架是否及如何加载当前响应(13章有详情)
Set - Cookie: 指令用于向浏览器发布cookie,浏览器会在随后的请求中将其返回给服务器。
3.1.7 cookie
cookie是HTTP协议的一个关键组成部分。攻击者常常通过它来利用Web应用程序中的漏洞。
*****服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。*******
客户端之后的每个请求都会继续重新向服务器提交cookie。
服务器使用 Set - Cookie 消息头发布多个cookie:
set - cookie : tracking = xxxxxxxxxxxxxxx
然后,用户浏览器自动将下面的消息头添加到随后返回给同一服务器请求中
Cookie : tracking = xxxxxxxxxxxxx
Cookie一般由一个名/值对构成, 但也可包含任何不含空格的字符串。 可以在服务器响应中使用几个Set-Cookie 消息头发布多个Cookie,并可在同一个Cookie消息中用分号分隔开不同的Cookie,将他们全部返回给服务器。
除了Cookie的实际值外,Set - Cookie消息头还可包含以下任何可选属性,控制浏览器处理Cookie的方式
expires : 用于设定Cookie有效地时间。在有效时间内,浏览器将Cookie保存在存储器中(更换浏览器也能使用),在随后的会话中重复利用。如果没设置这个属性,那么Cookie仅在当前浏览器的会话中。
domian : 用于 指定关联的WEB服务器或域。
值是域名,比如www.china.com。这是对path路径属性的一个延伸。如果我们想让 www.china.com能够访问bbs.china.com设置的cookies,该怎么办? 我们可以把domain属性设置成“china.com”,并把path属性设置成“/”。
path : 用于指定Cookie 的有效URL路径
secure : 如果设置这个属性,仅在HTTPS请求中提交cookie
HttpOnly : 如果设置这个属性 , 将无法通过客户端JavaScript直接访问cookie
上述每一个Cookie属性都可能影响应用程序安全。主要影响在于攻击者能对应用程序的其他用户发动攻击(详情12章,13章)
3.1.8 状态码
每个Http响应第一行都有一个状态码
1xx------ 提供信息
2xx------ 请求被成功提交
3xx------ 客户端被重定向到其他资源
4xx------ 请求包含某种错误
5xx------ 服务器执行请求时遇到错误
具体状态码出现问题可百度查询
3.1.9 HTTPS
HTTP使用普通的非加密TCP作为传输机制,因此在网络的某处的攻击者能够拦截下来这个机制。(防监听)
HTTPS本质上与HTTP一样,都属于应用层,但HTTPS通过安全传输机制—安全套接层(Secure Socket Layer,SSL)—传送数据。郑重机制可保护通过网络传送的所有数据的隐密性与完整性,显著降低非入侵性拦截攻击的可能性。 不论是否使用SSL传输,HTTP请求与响应都以完全相同的方式工作。
(如今SSL已经被TLS(Transport Layer Security 传输层安全)代替,但后者通常还是使用SSL这个名称)
拦截代理服务器与HTTPS:对于https通信,1、浏览器先使用connect方法向代理服务器提出明文请求(指定目标服务器的主机名称和端口),2、
3.1.10 HTTP代理
HTTP代理服务器是一个协调客户端浏览器与目标Web服务器之间访问的服务器。
当配置浏览器使用代理服务器时,浏览器会把所有请求提交到代理服务器,代理服务器再将请求转送给相关的web服务,并将响应返回给浏览器(使用bp时,bp代发请求,同时也会把响应拦截下来)。
大多数代理还使用其他的服务,比如缓存、验证、访问控制。
值得注意的是,如果使用代理服务器,HTTP的工作机制会出现两方面差异:1、浏览器向代理服务器发布HTTP请求时,他会把完整的URL插入请求中。代理服务器将提取主机名称和端口,并使用这些信息见请求指向正确的目标Web服务器。 2、当使用HTTPS时,浏览器无法与代理服务器进行SSL握手,因为这样做会破坏安全隧道。因此,浏览器必须将代理作为一个纯粹的TCP级中继,有它传递浏览器与目标Web浏览器之间的所有数据,并与浏览器进行正常握手。
3.1.11 HTTP身份验证
详细请看:https://blog.csdn.net/zwkkkk1/article/details/82179310
来自客户端的初始请求通常是匿名请求,不包含任何身份验证信息。 HTTP 服务器应用程序可以拒绝匿名请求,而同时指示必须进行身份验证。
服务器应用程序发送 WWW-Authentication
头来指示受支持的身份验证方案
HTTP拥有自己的用户验证身份机制,使用不同的身份验证方案。 basic : 基本认证)这是一种非常简单的身份验证机制,他在请求消息头中随每条以Base64编码字符串的形式发送用户证书。 NTLM : 这是一种质询 - 响应式机制,他使用某个Windows NTLM协议版本 Dig : 认证(摘要认证)这是一种质询 - 响应式机制,它随同用户证书一起使用一个随机值MD5校验和。 FormBase :认证(基于表单认证)
3.2 Wbe功能
客户端和服务器之间数据交互除了使用核心通信协议外,Web应用程序还使用许多不同的技术实现。在向Web应用发送攻击前渗透测试员必须对应用程序如何实现其功能、实现技术的运作方式还有程序可能存在的弱点要有一定了解。
3.2.1 服务器端功能
https://blog.csdn.net/wang907553141/article/details/80177450 Web动态和静态资源的区别
如今的Web程序仍使用相当数量的静态资源。但他们主要向用户提供动态生成的内容。当用户请求一个动态资源时,服务器会建立动态响应,每个用户都会受到满足其特定需求的内容。
动态内容由在服务器上执行的脚本或其他代码生成。
当用户的浏览器提出访问动态资源的请求时,它不仅仅是要求访问该资源的副本。还会随着请求提交各种参数。这些参数保证服务器能够生成合适各种用户需求的内容。
HTTP通过4种主要方式向应用传递参数:1、通过URL查询字符串 2、通过REST的风格的URL的文件路劲 3、通过HTTPcookie 4、通过在请求主体中使用的POST方法。 出了这些主要的传参输入源,理论上,服务器端应用程序还可以使用HTTP请求任何一个部分作为传参的输入源。例如:应用程序可能通过User-Agent消息头生成根据所使用的浏览器类型而优化的内容(浏览器类型本是在User-Agen中生成)
web应用程序也在服务器端使用大量的技术实现其功能,这些技术包括:
脚本语言:php,VbScript 和 Perl
Web应用程序平台: ASP.Net 和Java
Web服务器 : Apache、IIS 和 Netscape Enterprise
数据库 : 如MS-SQL 、 Oracle 和 MySQL
其他后端组建 : 如文件系统(cms) 继续SOAP的Web服务 和 目录服务
3.2.2客户端功能
服务器端要接受用户输入与操作,并返回其结果,他必须提供一个客户端用户界面。
同源策略:是浏览器实施的一种关键机制,主要用于防止不同来回来源的内容相互干扰。基本上从一个网站收到的内容可以读取并修改从该站收到的其他内容。但不得访问从其他站收到的内容。若不适用同源策略,那么,当不知情的用户浏览到某个恶意网站时,该恶意网站上运行的脚本代码将能够访问这名用户,同时访问其他网站的数据和功能。
实际上把同源策略这一概念应用于各种Web功能和技术会导致各种复杂情况和风险。这些特点可能导致各种跨域攻击,如诱使用户执行才做和捕获数据。此外由于浏览器扩展技术以各种方式实施同源限制,这一问题变得更加复杂(13章详细探讨)
3.3编码方案
Web应用程序对其数据采用几种不同的编码方案。
早期阶段HTTP协议和HTML语言都是基于文本的,于是人们设局出不同的编码方案,确保这些机制能安全处理不常见的字符和二进制数据。
攻击Web应用程序通常要使用相关设计方案对数据进行编码,确保应用程序按照想要的方式对其进行处理。甚至也可以控制应用程序所使用的的编码方法。
3.31URL编码
URL只允许使用US-ASCII字符集中的可打印字符(0x20- 0x7e范围内)。而且由于在URL方案或HTTP协议内具有特殊含义,这个范围内的一些字符也不能同在URL中
URL编码方案主要用于对扩展ASCII字符集中的任何有问题的字符进行编码,使其可以同HTTP安全传输。任何URL编码的字符都以%为前缀,其后是这个字符的两位十六进制ASCII代码。
%3d 代表=
%25代表%
%20代表空格
%0a代表新行
%00代表空字节
赢一个要注意的编码字节是加号(+),他代表URL编码的空格(出%20代表空格外)