数据包格式

目录

前言

近来常思,不应止步于此,可自觉进阶缓慢,一筹莫展,就打算自废武功复习一下,那就从状态码开始吧。

由于强迫症患者,所以后面就顺便把数据包格式啥的都一起写一下吧。

请求数据格式

四部分

  • 请求行
  • 请求头
  • 空行
  • 请求数据(正文)

请求行

每个请求数据包第一行即为请求行,格式如下

shell 复制代码
请求方式+空格+uri+空格+协议/协议版本
例子:GET / HTTP/1.1

请求方法

shell 复制代码
常用:
GET、POST、HEAD、
PUT、PATCH、OPTIONS、
DELETE、CONNECT、TRACE

其中最常用的:GET、POST
  • POST与GET

    通常GET用来请求资源拿资源,毕竟名字都叫GET了

    POST通常用来提交数据,也用来请求资源,POST的方式更为隐藏,提交的数据不会在浏览器地址栏显示出来也更为安全。

  • HEAD

    与GET一样,只不过服务器不会传回资源,用于获取报头。

  • PUT

    向指定资源位置上传最新内容,主要用于上传文件,更新整体数据。

  • PATCH

    更新局部资源

  • DELETE

    请求服务器删除请求中所标识的资源

  • CONNECT

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

  • OPTIONS

    可使服务器传回该资源所支持的所有HTTP请求方法。通常在响应头ALLOW中。

  • TRACE

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

请求头

Accept

表示浏览器支持的 MIME 类型

shell 复制代码
text/html,application/xhtml+xml,application/xml;q=0.9
斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);

q表示权重,比如上面application/xml;q=0.9:

表示这个类型浏览器渲染类型权重占0.9,其他没有写就默认为1。

Referer

用于防盗链、防CSRF

请求该网站的时候判断是否是白名单内转过来的,否则判断为空手套白狼,比如你从某xxx网站想直接跳转到百度某个后台,百度后台用referer做了限制,那么你肯定跳转失败。

User-Agent

显示的都是客户端自己的相关信息,比如你的客户端浏览器是什么型号,你的客户端使用的操作系统是什么等等

所以有的时候有些服务器会对UA与数据库进行交互,那么UA也会造成SQL注入

HOST

服务端的域名或IP

X_FORWARDED_FOR

简称XFF,通常是服务端用来获取用户真实IP的,但是可以修改请求包伪造真实IP。

Content-Type

三种格式可选

shell 复制代码
- application/x-www-form-urlencoded
  这个就是普通的参数文本格式
- multipart/form-data
  主要用于上传文件使用的格式(分块传输)
- application/json
  键值对
  {"id":1,"name":"whoisdhan"}

Content-Length

记录数据部分占多少字节

(可以找到一些中间件的溢出漏洞,比如2024年的tomcat溢出漏洞)

Transfer-Encoding

在Content-Length不确定的时候可以使用:

shell 复制代码
Transfer-Encoding:chunked

chunked分块传输,也就是说当你设置这个的时候你的Content-Length会失效。

同时chunked分块传输有时候可以有效的bypass过waf

没啥好说的,cookie、session、token等各种认证机制都是涉及安全以及连接状态等等

Connection

Keep-Alive表示短链接,也就是建立的连接需要维持一段

Close表示关闭连接,一次请求一次相应,这是http的方式。

Accept-Encoding

通常指定压缩方法,是否支持压缩,支持什么压缩方法

这能够加大传输效率,否则一张大图每次都要传输很久。

Accept-Language

语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等

Upgrade-Insecure-Requests

让浏览器自动升级请求从http到https。这个理解为一个网站有http也有https,但是为了不报错,自动让浏览器升级请求为https。

所以有时候有的我们请求http但是也会自动给你升级为https。

Cache-Control

Cache缓存相关,就是缓存控制相关。

  • 常见值(默认为private )有:

    shell 复制代码
    private、no-cache、max-age、must-revalidate等。

最贴切的解释就是当你访问网页想要后退的时候他就发挥作用了:

  • 1、打开新窗口
    值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值(单位为秒),那么在此值内的时间里就不会重新访问服务器,
    例如:
    Cache-control: max-age=5
    (表示当访问此网页后的5秒内再次访问不会去服务器)
  • 2、在地址栏回车
    值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。
    值为no-cache,那么每次都会访问。
    值为max-age,则在过期之前不会重复访问。
  • 3、按后退按扭
    值为private、must-revalidate、max-age,则不会重访问,
    值为no-cache,则每次都重复访问
  • 4、按刷新按扭
    无论为何值,都会重复访问

If-Modified-Since

modified就是修改的意思

把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比

  • 如果时间一致,那么返回304,从你上次get的缓存中取。
  • 不一致,返回200且丢弃旧文件缓存,服务器中给你返回新的。

If-None-Match

match匹配的意思

这里会和ETag一起使用

工作原理:

请求中携带:

shell 复制代码
If-None-Match:ETag值

服务端收到ETag后会校验是否改变,如果和服务器现在的ETag不一样的话就返回200以及新文件

否则就返回304,让浏览器拿本地缓存文件。

空行

用来让请求行和请求头与数据部分分开

响应数据格式

响应行

shell 复制代码
协议/版本+空格+状态码+空格+状态描述
例子:HTTP/1.1 200 OK

状态码

五大类

c 复制代码
1xx消息------请求已被服务器接收,继续处理
2xx成功------请求已成功被服务器接收、理解、并接受
3xx重定向------需要后续操作才能完成这一请求
4xx客户端请求错误------请求含有词法错误或者无法被执行
5xx服务器错误------这些状态码表示服务器在尝试处理请求时发生内部错误。这些错误是服务器本身的错误,而不是请求的错误

常见状态码

  • 1开头(信息类Informational)
shell 复制代码
100 (Continue/继续)接受的请求正在处理,信息类状态码
101 (Switching Protocols/转换协议)
  • 2开头(成功类)
shell 复制代码
200 (Success)服务器已成功处理了请求。
201 (Created/已创建),比如订阅收藏可以用
202 (Accepted/接受)已接受请求,但尚未处理
204 (No Content/无内容)请求处理成功,但没有任何资源可以返回给客户端。返回204状态码这里经常会被漏扫工具误报成漏洞。
  • 3开头(重定向Redirection)
shell 复制代码
301 (Moved Permanently)永久性重定向,表示资源已被分配了新的 URL
302 (Found/找到)临时性重定向,服务端临时维护用了重定向可能就需要302,或者一些后台会302重定向不让人进。
303 (See Other/参见其他信息)这个状态码和 301、302 相似。如果最初的请求是 POST,那么新文档(在定位头信息中给出)要用 GET 找回。这个状态码是新加入HTTP 1.1中的。基本用302的多。
304 (Not Modified/未修改)自从上次请求后,请求网页未修改过,就是上面If-Modified-Since会出现返回的状态码。
  • 4开头(客户端错误Client Error)
shell 复制代码
400 (Bad Request/错误请求)服务器不理解请求的语法
401 (Unauthorized/未授权)表示发送的请求需要有通过HTTP认证的认证信息,客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个在api批量跑的时候经常有。
403 (Forbidden/禁止)服务器拒绝请求,不允许访问。
404 (Not Found/未找到)服务器找不到请求网页
405 (Method Not Allowed/方法未允许),请求的方法不允许,换请求方法
406 (Not Acceptable/无法访问)表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。
  • 5开头(服务器错误Server Error)
shell 复制代码
500 (Internal Server Error/内部服务器错误)表示服务器遇到错误,可能是web应用存在bug或某些临时崩溃了
501 (Not Extended/尚未实施) 表示服务器不支持当前请求所需要的某个功能。
502 (Bad Gateway/错误的网关)表示服务器作为网关或代理,从上游服务器收到无效响应。
503 (Service Unavailable/服务无法获得)表示服务器处于停机维护或超负载,无法正常响应(看到这个别担心,没人给你打电话就别慌)
504 (Gateway Timeout/网关超时) Timeout
505 (HTTP Version Not Supported/HTTP 版本不受支持)服务器不支持你请求所用的协议
506 (Variant Also Negotiates/变体协商)表示服务器存在内部配置错误
507 (Insufficient Storage/存储错误)表示服务器无法存储完成请求所必须的内容。一般是数据库出问题时会看到这个状态码

响应头

Date

服务端发送资源时的服务器时间

shell 复制代码
Date: Thu, 09 Dec 2024 06:40:25 GMT
GMT是格林尼治所在地的标准时间。

Server

web服务器和相对应的版本,只是告诉客户端服务器信息

X-Powered-By

告知网站是用何种语言或框架编写的。

注:不是Apache或者Nginx输出的

渗透的时候留意这个可以识别指纹

Expires

shell 复制代码
Expires:Thu, 19 Nov 1981 08:52:00

告诉客户端在这个时间前,可以直接访问缓存副本

可能导致服务端与客户端时间不一致问题,

有Cache-Control:max-age=* 比较准确,因为是相对时间

Cache-Control

perl 复制代码
Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享
Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息。
Cache-Control:must-revalidate 对于客户机的每次请求,代理服务器必须向服务器验证缓存是否过时。
Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息。
Cache-Control:max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。
Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。

Pragma

表明本次请求不想获取缓存,要给我最新的响应内容,pragma:no-cache和cache-control:no-control一样

shell 复制代码
pragma:no-cache

Connection

shell 复制代码
Connection: close 表示本次响应完成之后断开连接

Content-Type

Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。

如果能看到浏览器解析乱码了,可以尝试抓响应包修改Content-Type字段

Content-Length

响应正文的数据大小(字节单位)

服务端设置cookie,浏览器根据该字段设置cookie,下次发包携带上。

Strict-Transport-Security(HSTC)

表示只能HTTPS访问当前资源, 禁止HTTP方式。

shell 复制代码
Strict-Transport-Security: max-age=172800;includeSubDomains

解释:

  • max-age=172800设置在浏览器收到这个请求后的 172800 秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
  • includeSubDomains是可选的,若含有该值,那么说明此规则也适用于该网站的所有子域名,即: 其他子域名在172800 秒的时间内的请求都使用 HTTPS 请求。

X-Frame-Options

iframe标签可以加载网站,如果我们网站加上了X-Frame-Options,那就无法被别人加载进坏人的站点里面了。

shell 复制代码
修改web服务器配置,添加X-frame-options响应头。赋值有如下三种:
(1)DENY:不能被嵌入到任何iframe或frame中。
(2)SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。
(3)ALLOW-FROM uri:只能被嵌入到指定域名的框架中。

X-Ua-Compatible

该响应头主要是为了兼容IE8浏览器渲染问题出现的

  • IE=Edge,chrome=1
    IE8要按照Edge浏览器的方式渲染页面,chrome=1是将允许站点在使用了谷歌浏览器内嵌框架(Chrome Frame)的客户端渲染,对于没有使用的,则没有任何影响。大多数国产浏览器都是有谷歌内嵌的,所以建议默认加上

空行

用来让响应行和响应头与响应数据部分分开

响应正文

这里也没啥好说的,服务端给你啥就是啥


正文结束,感谢各位道友看完鄙人的拙笔劣文