http 协议详解

本文作者:Anthem & hl0rey 文章来源:RTIS 雏鹰进阶之路 小伙伴 Anthem 第一周的总结,hl0rey 对其进行了扩展,更多小伙伴的总结尽在 知识星球

HTTP 协议,即超文本传输协议 (Hypertext transfer protocol)。 是一种详细规定了浏览器和万维网 (WWW = World Wide Web) 服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议

HTTP协议的特点就不好再赘述了

中文RFC文档:[超文本传输协议--HTTP1.0]

http://man.chinaunix.net/develop/rfc/RFC1945.txt

HTTP 的请求方法

一个 HTTP 请求结构

HTTP1.0 的请求方法

GET 方法

请求指定的页面信息,并返回实体主体。

最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是 GET 方式。GET 方法要求服务器将 URL 定位的资源放在响应报文的数据部分,回送给客户端。使用 GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表 URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind, 这样通过 GET 方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。以用 google 搜索 domety 为例,Request 格式如下:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

可以看到,GET 方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址链接如下:

http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=

地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。

一个形象的比喻:

HTTP 报文和 HTTP 实体的关系就像订单信息和具体的订单货物一样。 HTTP 报文是一个提供 http 头信息和主体的请求或响应,类似一个订单拥有订单的各种信息。 而 HTTP 实体就像订单的具体货物一样,他本身就持有头部和主体的信息,他是传输中真正传输的数据,和订单中传输的是订单商品一样。

实体 entity 是请求或响应的有效承载信息。Http报头分为通用报头,请求报头,响应报头和实体报头。实体包头加上实体就是实体信息 GET 方法是获取服务器某一资源的方法。

POST 方法

向服务器发送数据。

对于上面提到的不适合使用 GET 方式的情况,可以考虑使用 POST 方式,因为使用 POST 方法可以允许客户端给服务器提供信息较多。POST 方法将请求参数封装在 HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据,这样 POST 方式对传送的数据大小没有限制,而且也不会显示在 URL 中。还以上面的搜索 domety 为例,如果使用 POST 方式的话,格式如下:

POST /search HTTP/1.1  
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
Accept-Language: zh-cn  
Accept-Encoding: gzip, deflate  
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
Host: <a href="http://www.google.cn">www.google.cn</a>  
Connection: Keep-Alive  
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r  

hl=zh-CN&source=hp&q=domety  

可以看到,POST 方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用 ”&” 符号隔开。POST 方式大多用于页面的表单中。因为 POST 也能完成 GET 的功能,因此多数人在设计表单的时候一律都使用 POST 方式,其实这是一个误区。GET 方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用 GET 还是使用 POST。

HEAD 方法

请求服务器返回响应头部,不返回实体。这就是和 GET 方法的区别。

HEAD 就像 GET,只不过服务端接受到 HEAD 请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用 HEAD 是非常高效的,因为在传输的过程中省去了页面内容。

GET 请求的标准格式

GET /develop/rfc/default.htm HTTP/1.1
Host: man.chinaunix.net
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

请求行

GET /develop/rfc/default.htm HTTP/1.1

请求头部

Host: man.chinaunix.net
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

用POST上传文件

PHP 文件上传代码, fileupload.html

<form action="fileupload.php" enctype="multipart/form-data" method="post" name="uploadfile">uploadfile:<input type="file" name="file" /><br>
<input type="submit" value="upload" /></form> 

fileupload.php

<?php
move_uploaded_file($_FILE['file']['tmp_name'],$upfile['name']);
?>

java 文件上传代码

uploadfile.html

<form name=get method=post>
服务端地址<input name=url size=110 type=text>  <br><br><textarea name=t rows=20 cols=120>
你提交的代码</textarea><br>
保存成的文件名:<input name=f size=30 value=shell.jsp>
<input type=button onclick="javascript:get.action=document.get.url.value;get.submit()" value=提交> </form>

uploadfile.jsp

<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>

HTTP1.1 新增的请求方法

HTTP1.1 新增了五种请求方法: OPTIONS, PUT, DELETE,TRACE 和 CONNECT 方法的基本概念

OPTIONS 方法

没有找到合适的测试, OPTIONS 它用于获取当前 URL 所支持的方法。若请求成功,则它会在 HTTP 头中包含一个名为 “Allow” 的头,值是所支持的方法,如 “GET, POST”。

1、获取服务器支持的 HTTP 请求方法;也是黑客经常使用的方法。

2、用来检查服务器的性能。例如:AJAX 进行跨域请求时的预检,需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,用以判断实际发送的请求是否安全。

OPTIONS / HTTP/1.1
Host: www.myh0st.cn
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

PUT 方法

向指定资源位置上传其最新内容。

DELETE 方法

请求服务器删除Request-URI所标识的资源。

TRACE 方法

回显服务器收到的请求,主要用于测试或诊断。

CONNECT 方法

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

HTTP 的状态码

HTTP 状态码的分类

HTTP 状态码规范

http://blog.csdn.net/diandianxiyu_geek/article/details/50373195

HTTP 状态码的作用

获取请求的返回结果和原因

常见的 HTTP 状态码

1** 信息,服务器收到请求,需要请求者继续执行操作

100 Continue 继续。客户端应继续其请求

101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

2** 成功,操作被成功接收并处理

200 OK 请求成功。一般用于GET与POST请求

201 Created 已创建。成功请求并创建了新的资源

202 Accepted 已接受。已经接受请求,但未处理完成

203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本

204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档

205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域

206 Partial Content 部分内容。服务器成功处理了部分GET请求

3** 重定向,需要进一步的操作以完成请求

300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择

301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替

302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI

303 See Other 查看其它地址。与301类似。使用GET和POST请求查看

304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

305 Use Proxy 使用代理。所请求的资源必须通过代理访问

306 Unused 已经被废弃的HTTP状态码

307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向

4** 客户端错误,请求包含语法错误或无法完成请求

400 Bad Request 客户端请求的语法错误,服务器无法理解

401 Unauthorized 请求要求用户的身份认证

402 Payment Required 保留,将来使用

403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求

404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面

405 Method Not Allowed 客户端请求中的方法被禁止

406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求

407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权

408 Request Time-out 服务器等待客户端发送的请求时间过长,超时

409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突

410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置

411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息

412 Precondition Failed 客户端请求信息的先决条件错误

413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息

414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理

415 Unsupported Media Type 服务器无法处理请求附带的媒体格式

416 Requested range not satisfiable 客户端请求的范围无效

417 Expectation Failed 服务器无法满足Expect的请求头信息

5** 服务器错误,服务器在处理请求的过程中发生了错误

500 Internal Server Error 服务器内部错误,无法完成请求

501 Not Implemented 服务器不支持请求的功能,无法完成请求

502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求

505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

python获取HTTP 请求状态码

python3

import requests
res=requests.get("https://www.baidu.com")
print(res.status_code)

HTTP 协议响应头信息

HTTP 响应头的含义

常见的 HTTP 响应头和请求头

https://www.cnblogs.com/honghong87/articles/6941436.html

HTTP 响应头的类型

http://www.runoob.com/http/http-header-fields.html

HTTP 协议中的 URL

HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息

URL 全称是 UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个 URL 为例,介绍下普通 URL 的各部分组成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的 URL 可以看出,一个完整的 URL 包括以下几部分:

1、协议部分:该 URL 的协议部分为 “http:”,这代表网页使用的是 HTTP 协议。在 Internet 中可以使用多种协议,如 HTTP,FTP 等等本例中使用的是 HTTP 协议。在 "HTTP" 后面的 “//” 为分隔符

2、域名部分:该 URL 的域名部分为 “www.aspxfans.com”。一个 URL 中,也可以使用 IP 地址作为域名使用

3、端口部分:跟在域名后面的是端口,域名和端口之间使用 “:” 作为分隔符。端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口

4、虚拟目录部分:从域名后的第一个 “/” 开始到最后一个 “/” 为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是 “/news/”

5、文件名部分:从域名后的最后一个 “/” 开始到 “?” 为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有 “?” 和 “#”,那么从域名后的最后一个 “/” 开始到结束,都是文件名部分。本例中的文件名是 “index.asp”。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名

6、锚部分:从 “#” 开始到最后,都是锚部分。本例中的锚部分是 “name”。锚部分也不是一个 URL 必须的部分

所以注入 SQL 语句的时候,需要将 # 进行 url 编码,否则会被当成锚点处理。

7、参数部分:从 “?” 开始到 “#” 为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为 “boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用 “&” 作为分隔符。

原文地址:

http://blog.csdn.net/ergouge/article/details/8185219

URL 和 URI 的区别

URI,是 (uniform resource identifier),统一资源标识符,用来唯一的标识一个资源。

Web 上可用的每种资源如 HTML 文档、图像、视频片段、程序等都是一个来 URI 来定位的

URI 一般由三部组成:

①访问资源的命名机制

②存放资源的主机名

③资源自身的名称,由路径表示,着重强调于资源。

URL 是 uniform resource locator,统一资源定位器,它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

URL 是 Internet 上用来描述信息资源的字符串,主要用在各种 WWW 客户程序和服务器程序上,特别是著名的 Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL一般由三部组成:

①协议(或称为服务方式)

②存有该资源的主机IP地址(有时也包括端口号)

③主机资源的具体地址。如目录和文件名等

URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如 mailto:java-net@java.sun.com。

URI 是以一种抽象的,高层次概念定义统一资源标识,而 URL 和 URN 则是具体的资源标识的方式。

URL 和 URN 都是一种 URI。

笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。

这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。

通常来说,一个 URI 实例可以代表绝对的,也可以是相对的,只要它符合 URI 的语法规则。而 URL 类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。

URI 类不包含任何访问资源的方法,它唯一的作用就是解析。

相反的是,URL 类可以打开一个到达资源的流。

HTTP2.0 新事物

HTTP2.0 那些事

http://www.mamicode.com/info-detail-1199706.html

HTTP XST 攻击与 trace 方法

1、绕过 http-only 对 XSS 攻击的限制

2、TRACE 请求会让服务器返回请求内容。

xst 主要是使用 http 的 trace 方法,该方法会返回浏览器发给服务器的所有请求信息,但该方法不能带 body,主要是利于 debug。现在前端后端都做了很多 xst 攻击的措施,很难在浏览器端发起 trace 请求了,所以只能用 fiddler 模拟一下,服务器是 wamp,支持 trace 方法。

该攻击主要是在网站存在 xss 漏洞但设置了 cookie 的 httponly 属性的时候结合 trace 方法进行攻击。如果某网站存在 xss 漏洞,那比如用户点击 a 标签会执行一段脚本,那么该脚本可以异步发起一个 trace 请求,因为是同域,所以会带上 cookie,然后服务器会把浏览器请求的信息全部返回来,其中包括 cookie,我们可以在回调函数里解析然后上传到我们的服务器上去。

使用 python requests 库花式发送 http 请求

如果使用 python 的比较底层的 HTTP 请求库还能 fuzzing

import requests
#只支持这五种
requests.get("https://www.baidu.com")
requests.post("https://www.baidu.com")
requests.put("https://www.baidu.com")
requests.delete("https://www.baidu.com")
requests.options("https://www.baidu.com")

Web DAV

(Web-based Distributed Authoring and Versioning)

一句话原理就是,服务器允许put方法,相当与有了写权限.Web Dav 的安全配置相关与漏洞利用

http://blog.csdn.net/u014270687/article/details/45798227

kali 中有 dave 和 davtest 两个工具利用 dav 漏洞,python 也可以,不必执着于某个工具,达到目的就好

CRLF 注入攻击

CRLF 就是 \r\n,也就是响应头的分割符

一句话原理就是,web 程序使用了用户输入作为相应头,且过滤不严,导致我们可以注入 CRLF 来分割 http 响应.

几个例子:

http://blog.csdn.net/gstormspire/article/details/8183598 http://blog.csdn.net/mgxcool/article/details/73028346 http://blog.csdn.net/rainZuoShao/article/details/9088575

本文分享自微信公众号 - 信安之路(xazlsec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯大讲堂的专栏

白底黑字or黑底白字,眼睛更喜欢哪一个?

12010
来自专栏web前端教室

你可以从面试中学到什么?

讲一下我对面试的一些。。。“偏见”,哈哈,熟悉我的同学们一定要批判的读接下来的内容哈。

11900
来自专栏非著名程序员

这是对付产品经理的一副毒药,程序员慎入

程序员和产品经理的日常就像是一对天生的冤家,为了需求的实现,几乎天天在争吵。这不,就在昨天各大技术和产品群里一个程序员暴打产品经理的视频火了,被广泛传播。

12120
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

20240
来自专栏非著名程序员

「我真的没有改需求」

11810
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏腾讯NEXT学位

今天我就说三句话

11420
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17830
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

44030
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

27740

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励