文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-10-04   2.6k

Web安全学习之Web页面解析的流程学习

任务目标

  1. 理解域名解析的整个流程;
  2. 理解Web页面请求的整个流程,绘制流程图(ngnix处理的11个过程);
  3. 学习HTTP协议中的字段及含义;
  4. 学习HTTP请求方法以及返回状态码的类型和含义。

0x01 域名解析流程

这篇文章对于DNS讲的还比较透彻,在此基础做一点摘要。

域名层次结构

)

域名服务器

)
另外还有一个本地域名服务器:当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的。

域名解析记录

  • A (Address) 记录:又称IP指向,用户可以在此设置⼦域名并指向到⾃⼰的⽬标主机地址上,从
    而实现通过域名找到服务器。
  • CNAME记录:也被称为规范名字。这种记录允许您将多个名字映射到同⼀台计算机。
  • MX(Mail Exchanger)记录:邮件交换记录,它指向⼀个邮件服务器,⽤于电⼦邮件系统发邮
    件时根据 收信⼈的地址后缀来定位邮件服务器。
  • NS(Name Server)记录:解析服务器记录。⽤来表明由哪台服务器对该域名进⾏解析。这⾥的NS
    记录只对⼦域名⽣效。
  • TXT记录:⼀般指为某个主机名或域名设置的说明。

域名解析过程

以查询jocent.me为例,其中10.74.36.90为主机IP,10.74.1.11为本地DNS服务器:
①主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
②本地域名服务器采用迭代查询,向一个根域名服务器进行查询
③根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器dns.me的IP地址
④本地域名服务器向顶级域名服务器dns.me进行查询
⑤顶级域名服务器me告诉本地域名服务器,下一步查询权限服务器dns.jocent.me的IP地址
⑥本地域名服务器向权限服务器dns.jocent.me进行查询
⑦权限服务器dns.jocent.me告诉本地域名服务器所查询的主机的IP地址
⑧本地域名服务器最后把查询结果告诉 10.74.36.90

总的来说DNS解析过程如下图所示:

其中有两个概念递归查询和迭代查询:
递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。

迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

0x02 Web页面请求流程

对Nginx知之甚少,关于Nginx的请求处理阶段先占个坑,留个比较全面的学习文档占个坑。

0x03 HTTP协议的字段及含义

HTTP请求报文

请求报文结构:

其中,值得关注的是HTTP报文头由方法、URI 、HTTP版本、HTTP首部字段等部分构成。
例如,请求hackr.jp网站的请求报文头如下所示:

HTTP响应报文

响应报文结构:

例如,刚刚请求的hackr.jp的响应报文头如下所示:

HTTP首部字段类型

  • 通用首部字段(General Header Fields)
    请求报文和响应报文两方都会使用的首部。

    • Cache-Control字段

      通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。

      缓存请求指令一览:

      指令 Client Server
      no-cache 不接收缓存过的响应 不能对资源进行缓存
      no-store 不缓存请求或响应的任何内容 不缓存请求或响应的任何内容
      max-age = [秒] 接收缓存时间比max-age数值更小的资源 代表资源保存为缓存的最长时间
      max-stale = [秒] 接收已过期的响应
      min-fresh = [秒] 期望在指定时间内的响应仍有效
      no-transform 代理不可更改媒体类型
      only-if-cached 从缓存获取资源
      cache-extension 新指令标记

      **注意:**从字面意思上很容易把 no-cache 误解成为不缓存,但事实上 no-cache 代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为 do-notserve-from-cache-without-revalidation 更合适,no-store 才是真正地不进行缓存。

    • Connection字段

      具备两个作用:

      • 控制不再转发给代理的首部字段

        conneciton: upgrade表示Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。

      • 管理持久连接

        HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定
        Connection 首部字段的值为 Close。

    • Date字段

      首部字段 Date 表明创建 HTTP 报文的日期和时间。

    • Transfer-Encoding字段

      首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。

    • Upgrade字段

      首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的
      版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

    • Via字段

      使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。

  • 请求首部字段(Request Header Fields)
    从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

    首部字段名 说明
    Accept 用户理可处理的媒体类型
    Accept-Charset 优先的字符集
    Accept-Encoding 优先的内容编码
    Accept-Language 优先的语言
    Authorization Web认证信息
    Expect 期待服务器的特定行为
    From 用户的电子邮箱
    Host 请求资源所在的服务器
    If-Match 比较实体标志(ETag)
    If-None-Match 比较实体标志(ETag)
    If-Modified-Since 比较资源更新时间
    If-Range 资源未更新时发送实体Byte的范围请求
    If-Unmodified-Since 比较资源更新时间(与If-Modified-Since相反)
    Max-Forward 最大传输逐跳数
    Proxy-Authorization 代理服务器要求客⼾端的认证信息
    Referer 对请求中URI的原始获取方
    TE 传输编码的优先级
    User-Agent HTTP客户端程序信息
  • 响应首部字段(Response Header Fields)
    从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

    首部字段 说明
    Accept-Ranges 是否接受字段范围请求
    Age 推算资源创建经过时间
    ETag 资源匹配信息
    Location 令客户端重定向至指定URI
    Proxy-Authenticate 代理服务器对客户端的认证信息
    Retry-After 对再次发起请求的时机要求
    Server HTTP服务器的安装信息
    Vary 代理服务器缓存的管理信息
    WWW-Authenticate 服务器对客户端的认证信息
  • 实体首部字段(Entity Header Fields)
    针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

    首部字段名 说明
    Allow 可支持的HTTP方法
    Content-Encoding 实体主体适用的编码方式
    Content-Laguage 实体主英文名称体的自然语言
    Content-Length 实体主体的大小
    Content-Location 替代对应资源的URI
    Content-MD5 实体主体的摘要
    Content-Type 实体主体的媒体类型
    Content-Range 实体主体的位置范围
    Expires 实体主体过期的日期时间
    Last-Modied 资源最后修改的日期时间

0x04 HTTP请求方法及返回状态码的类型和含义

HTTP请求方法

HTTP请求方式分为GET 、POST 、PUT 、HEAD 、DELETE 、OPTIONS 、TRACE和CONNECT 八种。

GET:获取资源

GET 方法用来请求访问已被URI 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。例如:

POST:传输实体主体

POST 方法用来传输实体的主体。
虽然用GET 方法也可以传输实体的主体,但⼀般不用GET 方法进行传输,而是用POST 方法。虽说POST 的功能与GET 很相似,但POST 的主要目的并不是获取响应的主体内容。例如:

PUT:传输文件

PUT 方法用来传输文件。就像FTP协议的文件上传⼀样,要求请求报文的主题中包含文件内容,然后保存到请求URI的位置。但是,鉴于HTTP/1.1的PUT 方法自身不带验证机制,任何⼈都可以上传文件,存在安全性问题,因此⼀般的Web网站不使用该方法。例如:

HEAD:获取报文首部

HEAD 方法和GET方法⼀样,只是不返回报文主体部分。勇于确认URI 的有效性及资源更新的日期时间等。例如:

DELETE:删除文件

DELETE 方法用来删除文件,是与PUT 相反的方法。DELETE方法按请求URI 删除指定的资源。例如:

OPTIONS:询问支持方法

OPTIONS方法用来查询针对请求URI 指定的资源支持的方法。例如:

TRACE:追踪路径

TRACE方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器端就将该数字减 1 ,当数值刚好减到 0 时,就停止继续传输,最后接收到请求的服务器端则返回状态码 200 OK 的响应。
但是,TRACE 方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪) 攻击,通常就更不会用到了。

CONNECT:隧道协议连接代理

Copyright © ca01h 2019-2020 | 本站总访问量