Web安全测试:HTTP请求详解

一、前言

结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬!
全部文章请访问专栏:《全栈安全测试教程(0基础)》


通过本章节的学习,我们会掌握如下知识,为掌握Web安全测试做基础准备:

  1. HTTP1.0的请求方法
    了解HTTP1.0三种请求方法,GET, POST 和 HEAD
    掌握GET请求的标准格式
    掌握POST请求提交表单,上传文件的方法
    了解HEAD请求与GET请求的区别
  2. HTTP1.1新增的请求方法
    了解HTTP1.1新增的五种请求方法:OPTIONS,PUT,DELETE,TRACE,CONNECT方法的基本概念
    掌握HTTP1.1新增的五种请求的基本方法和产生的请求结果 。


二、HTTP请求

http请求由三部分组成,分别是:请求行、消息报头、请求正文。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

  1. Method Request-URI HTTP-Version (CR)(LF)
  2. 其中 Method表示请求方法(GET,POST,HEAD等)
  3. Request-URI是一个统一资源标识符
  4. HTTP-Version表示请求的HTTP协议版本
  5. (CR)(LF)表示回车和换行(除了作为结尾的(CR)(LF)外,不允许出现单独的(CR)或(LF)字符)。

例:GET /get.php?arg1=value1 HTTP/1.1

HTTP消息请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

  1. 常用的报头:
  2. 常用的请求报头Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Host(发送请求时,该报头域是必需的),User-Agent
  3. 每个类型请求头结束后,会跟上(CR)(LF)
  4. 消息报头和请求正文会隔一行

1)GET请求

GET请求格式:
<访问路径>[?=[&=…]]
例子:http://site1.com/get.php?arg1=value1
Server端可以根据参数名获取值:
PHP例子:

<?php echo $_GET['arg1']; ?>

结果就是输出arg1相应的值。

GET请求,是可以把数据放在URL中来传递,也可以不包含任何数据,HTTP请求只有请求头,没有请求数据。

请求头中可以不包含Content-Length,例子:
GET /get.php?arg1=value1 HTTP/1.1
Host: site1.com
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
GET请求可以只有请求的路径:
http://www.gooann.com
GET请求也可以带需要传递的数据,在访问路径之后带问号(?)+参数=值的方式发送。
http://site1.com/get.php?arg1=value1

2)POST请求

POST请求是包含数据,请求数据的格式,可以在HTTP头中定义。格式一般会有下面5种:

  1. 表单格式:application/x-www-form-urlencoded
  2. 混合格式:multipart/form-data
  3. JSON格式:application/json
  4. XML格式:text/xml
  5. 文本:text/plain

下面对这几种格式做一下介绍

2.1 表单格式

与get方式类似,是把所有提交数据放在数据区域。
POST方式也可以像GET方式在URL带参数,但一般不会这么去使用。
表单方式与GET方式类似,只是把数据放在头文件下面的请求正文区域。请求如下:
POST /post-form.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 192.168.0.105
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
Content-Length: 11
arg1=value1


2.2 混合格式

有文件上传时常用的方法。可以接受同时提交不同类型的数据
表单中,可以把类型更改为file就可以上传文件

类型后面一般会跟boundary来告知数据区域分隔符
每个数据都可以单独说明数据类型

混合模式一般是用来传输文件。后面会跟boundary=__xxxx__来进行每个参数的分割。
POST /upload_file.php HTTP/1.1
Content-Type: multipart/form-data; boundary=------WebKitFormBoundaryRTP6hG23yFYrExfg
Host: 192.168.0.105
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.2) GCDHTTPRequest
Content-Length: 101

------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“arg1”

value1
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“file”; filename=“python.txt”
Content-Type: text/plain

多线程
xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg
Content-Disposition: form-data; name=“file2”; filename=“mails.zip”
Content-Type: application/zip

xxxxx
------WebKitFormBoundaryRTP6hG23yFYrExfg–


2.3 文本格式

常见类型为json,xml,plain
这种类型的数据,需要服务端代码自行解析
PHP代码为例:
file_get_contents(“php://input”); - 可以获取数据区域文本
要是接受的是json,使用相关方法(函数)来解析
echo json_decode(file_get_contents(“php://input”),true)[‘arg1’];
可以根据type(类型)来解开数据。

文本模式,也可以按照文件来接收,
使用file_get_contents(“php://input”); 可以免去读取文件里的内容。
file_get_contents(“php://input”); 模式不能接收multipart/form-data模式。
下面代码就是PHP写的,当类型为json时,根据json解析

<?php if( $_SERVER['CONTENT_TYPE'] == 'application/json') { echo json_decode(file_get_contents("php://input"),true)['arg1']; } ?>

这时请求数据是:{“arg1”:“value1”}
返回值是:value1

3)HEAD请求

HEAD请求就是返回只有头部数据,数据部分不返回内容,返回的内容基本上与GET,POST的返回头一致:

在这里插入图片描述

4)OPTIONS请求

OPTIONS请求,默认情况下会返回允许的请求类型
http://www.microsoft.com/zh-cn/ 会返回:
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
一般需要跨域的时候需要设置OPTIONS(跨域后面来讲)
使用脚本让浏览器跨域进行请求的时候,会检测OPTIONS,对方服务器是否允许跨域。允许的情况下,才会真正去进行相应请求
当你用浏览器访问 site1.com, 某些脚本操作会提交到site2.com而且附带非浏览器默认的头信息,这个时候浏览器不会直接发出POST请求,先发出OPTIONS请求来判断是否允许发送POST。当对方回复允许了,才能发送POST请求。

5)PUT DELETE请求

PUT:在特定目录里上传指定文件,文件名在url中设置。
DELETE:删除特定目录里的文件,文件名在url中设置。
在NGINX中,可以添加如下配置来允许PUT,DELETE
location /upload/ {
dav_methods PUT DELETE;
root /usr/share/nginx/html;
}

PUT - 发送包
PUT /upload/Untitled HTTP/1.1
Content-Type: application/octet-stream
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest
Content-Length: 284

PUT – 返回包
HTTP/1.1 201 Created
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:40:03 GMT
Content-Length: 0
Location: http://192.168.1.64/upload/Untitled
Connection: close


DETELE – 发送包
DELETE /upload/Untitled HTTP/1.1
Host: 192.168.1.64
Connection: close
User-Agent: Paw/2.2.5 (Macintosh; OS X/10.12.6) GCDHTTPRequest

DELETE – 返回包
HTTP/1.1 204 No Content
Server: nginx/1.12.1
Date: Fri, 01 Sep 2017 13:51:07 GMT
Connection: close


6)TRACE、CONNECT请求

HTTP TRACE是让我们的web服务器端将客户端的所有请求信息返回给客户端的方法,该方法多见于debug的需求。
CONNECT是在特定应用走HTTP协议时会用到:

  1. proxy可能会用到
  2. 某些使用http协议,需要长链接的程序(SSL就使用connect)

猜你喜欢

转载自blog.csdn.net/ml202187/article/details/132426276
今日推荐