Bu1'Blog

如果能控制粗鄙的狂喜,就不会有深入骨髓的悲伤。

0%

第七周:web 安全之页面解析的流程学习

任务标题: web 安全之页面解析的流程学习

1、理解域名解析的整个过程

2、理解 web 页面请求的整个流程,绘制流程图(nginx 处理的 11 个过程)

3、学习 http 协议中的字段及含义

4、学习 http 请求方法以及返回状态码的类型和含义

扩展学习:思考这个过程中都会涉及哪些安全问题,常规的网站架构(waf、cdn 等设备部署在什么地方)

学习报告

域名的解析过程

当本地客户端想要访问一个网站的域名时,操作系统会先检测本地的hosts文件中是否有网址映射关系如果有则会调用本地的映射关系,完成域名解析。从这里我们可以看出,通过窜改本地的hosts文件以达到恶意解析的目的。

如果本地hosts文件中没有映射关系则会向本地DNS服务器查询,如果本地DNS服务器中没有则会向根域名查询,不存在映射则会向下一级域服务器查询,以此迭代,一直到找到映射关系。

image-20191121203655873

web页面的请求流程

  • WEB的页面请求流程大致分为六个阶段:

    1. DNS解析域名,获取到ip地址或者是DNS缓存地址。
    2. 浏览器通过三次握手与获取到的地址建立TCP连接。
    3. 确认建立连接后浏览器发送HTTP请求
    4. 服务器接收浏览器请求并对请求进行处理
    5. 服务器发送HTTP相应报文,即服务器对请求的处理结果
    6. 断开TCP连接,四次挥手
  • 对于nginx来说,处理浏览器的请求分为11个阶段:

    1. NGX_HTTP_POST_READ_PHASE:

      接收到完整的HTTP头部后处理的阶段,它位于uri重写之前,实际上很少有模块会注册在该阶段,默认的情况下,该阶段被跳过。

    2. NGX_HTTP_SERVER_REWRITE_PHASE

      URI与location匹配前,修改URI的阶段,用于重定向,也就是该阶段执行处于server块内,location块外的重写指令,在读取请求头的过程中nginx会根据host及端口找到对应的虚拟主机配置。

    3. NGX_HTTP_FIND_CONFIG_PHASE(HTTP无法介入):

      根据URI寻找匹配的location块配置项阶段,该阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令。

    4. NGX_HTTP_REWRITE_PHASE

      上一阶段找到location块后再修改URI,location级别的uri重写阶段,该阶段执行location基本的重写指令,也可能会被执行多次。

    5. NGX_HTTP_POST_REWRITE_PHASE(HTTP无法介入):

      防止重写URL后导致的死循环,location级别重写的后一阶段,用来检查上阶段是否有uri重写,并根据结果跳转到合适的阶段。

    6. NGX_HTTP_PREACCESS_PHASE:

      下一阶段之前的准备,访问权限控制的前一阶段,该阶段在权限控制阶段之前,一般也用于访问控制,比如限制访问频率,链接数等。

    7. NGX_HTTP_ACCESS_PHASE:

      让HTTP模块判断是否允许这个请求进入Nginx服务器,访问权限控制阶段,比如基于ip黑白名单的权限控制,基于用户名密码的权限控制等。

    8. NGX_HTTP_POST_ACCESS_PHASE(HTTP无法介入):

      访问权限控制的后一阶段,该阶段根据权限控制阶段的执行结果进行相应处理,向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝。

    9. NGX_HTTP_TRY_FILES_PHASE(HTTP无法介入):

      为访问静态文件资源而设置,try_files指令的处理阶段,如果没有配置try_files指令,则该阶段被跳过。

    10. NGX_HTTP_CONTENT_PHASE:

      处理HTTP请求内容的阶段,大部分HTTP模块介入这个阶段,内容生成阶段,该阶段产生响应,并发送到客户端。

    11. NGX_HTTP_LOG_PHASE:

      处理完请求后的日志记录阶段,该阶段记录访问日志。

HTTP协议中的字段含义

HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

  • 看一个HTTP请求:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Accept:text/html
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Cache-Control: max-age=0
    Connection: keep-alive
    Cookie: acw_tc=2760829d15736185430724196ea64a5b7ba0b92e3f15a6feca261dc53e0b42;
    Host: blog.csdn.net
    Referer: https://www.google.com/search?
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14
  • 解释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Accept:客户机支持的数据类型
    Accept-Encoding:客户机支持的数据压缩格式
    Accept-Language:客户机的语言环境
    Cache-Control: max-age= 缓存多少秒后过期,过期之后浏览器才会再次发送请求。
    Connection:处理完这次请求后是否断开连接还是继续保持连接
    Cookie:客户机通过这个头可以向服务器发送数据
    Host:客户机通过这个头告诉服务器,想访问的主机名
    Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(可以防盗链)
    Sec-Fetch-Mode: navigate 表示请求的模式
    Sec-Fetch-Site: none 判断是否跨域访问
    Sec-Fetch-User: ?1 这个标头的值是布尔值,为True时表示有互动(如按下键盘)
    Upgrade-Insecure-Requests: 1 表示浏览器自动将http转为https请求
    User-Agent:客户机通过这个头告诉服务器,客户机的软件环境

    Accept-Charset:用于告诉服务器,客户机采用的编码格式
    If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
    X-Forwarded-For:客户端的ip
    Date:当前时间值

HTTP的请求方法及状态码

  • HTTP请求方法一览表(9种)

    方法 说明
    GET GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。它期望的应该是而且应该是安全的和幂等的。这里的安全指的是,请求不会影响到资源的状态。
    POST POST请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或修改现有资源。
    HEAD HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
    PUT PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。(HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。)
    DELETE DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。
    CONNECT CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
    OPTIONS OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用’*’来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。
    TRACE TRACE请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。
    PATCH PATCH方法出现的较晚,它在2010年的RFC 5789标准中被定义。PATCH请求与PUT请求类似,同样用于资源的更新。二者有以下两点不同:1.PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。2.当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新。

    目前一般讨论的是GET方法与POST方法。GET一般是明文传输,POST非明文传输。

  • HTTP状态码

    状态码 解释
    100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
    200~299 表示成功接收请求并已完成整个处理过程,常用200。
    300~399 为完成请求,进一步细化请求。例如:请求的资源已经移动一个新地址,常用302(意味着你请求我,我让你去找别人);307和304(我不给你这个资源,自己拿缓存)
    400~499 客户端的请求有错误。例如404:意味着你请求的资源在web服务器中没有;403:服务器拒绝访问,权限不够
    500~599 服务器端出现错误,常用500。

拓展学习

  • 可能存在的安全问题:

    1. DNS投毒:前面我们提过了窜改本地的hosts文件可以达到恶意解析的目的,这是针对的单一用户。而当DNS被投毒时,是无差别的攻击,当用户输入网址后解析得到的地址是被窜改的恶意ip地址,所以用户最后访问的是“假”页面。

      DNS缓存欺骗以一种利用DNS通信结构的方式明确地工作。当DNS服务器尝试在域上执行查找时,它会将请求转发到根权威DNS,并迭代地沿着DNS服务器链向下查询,直到它到达域上的权威DNS服务器。由于本地DNS服务器不知道哪个服务器负责哪个域,并且不知道到每个权威服务器的完整路由,因此只要回复与查询匹配并且格式正确,它就会从任何地方接受对其查询的回复。攻击者可以通过在回复本地DNS服务器时击败实际的权威DNS服务器来利用此设计,如果这样做,本地DNS服务器将使用攻击者的DNS记录而不是实际的权威答案。由于DNS 的性质,本地DNS服务器无法确定哪个回复是真实的,哪个是假的。

    2. SYN攻击:在前面说到WEB页面请求时,浏览器会先与服务器建立TCP连接,而在连接的过程中会有三次握手。第一次握手时,浏览器发送SYN报文到服务器;第二次握手,服务器接收后发送SYN+ACK报文;第三次握手,浏览器接收报文后发送ACK报文到服务器。如果我们破坏这三次握手是不是就能引起攻击呢?实际上在第二次握手时,SYN+ACK报文的重传是有次数限定的,这段时间里浏览器与服务器处在半连接状态,浏览器的请求存在于半连接队列。 当建立起大量的无效半连接状态时,挤压正常用户的半连接请求,大量消耗系统资源就形成了SYN攻击 。

      SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn=j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

    3. 修改HTTP请求头:在前面已经说过HTTP请求头各个字段的意思,目前在进行渗透测试的过程中一般也会拦截HTTP请求进行修改测试,我就目前我常用到的几点做一次记录

      X-Forwarded-For这个字段可以绕过服务器对客户端的ip限制,比如当服务器只接受来自内网的请求,可以将字段的值改为127.0.0.1 从而绕过服务端的审查。

      Referer这个字段也有同样的功能,但是这里代表是从那个网页链接过来的,就如上面所列举的这个例子当我们的Referer的值为https://www.google.com/search?时其实访问百度百科是失效的,当我们把值改为其他的就可以正常访问。

      Cookie这个字段是在渗透中特别重要的一个点,也是特别容易被利用到的一个点,只要拿到了有权限的cookie便能在任何浏览器伪造。就如XSS盗取Cookies来实现登录后台

      User-Agent字段也挺常见,通过这个可以判断客户机的软件状态,在爬虫里面就常常来利用这个来伪造客户端

  • 常规的网站架构

    ​ 通常情况下,WAF放在企业对外提供网站服务的DMZ区域或者放在数据中心服务区域,也可以与防火墙或IPS等网关设备串联在一起(这种情况较少)。总之,决定WAF部署位置的是WEB服务器的位置。因为WEB服务器是WAF所保护的对象,部署时要使WAF尽量靠近WEB服务器。

参考链接

https://juejin.im/post/5b0a32a36fb9a07ab979f0b4

https://blog.csdn.net/pupilxiaoming/article/details/81171866

https://blog.csdn.net/liuyang1943/article/details/5607862

https://blog.csdn.net/qxs965266509/article/details/8082810

https://juejin.im/entry/5b004085f265da0b886daf7c

https://zhuanlan.zhihu.com/p/57309897

https://baike.baidu.com/item/SYN%E6%94%BB%E5%87%BB/14762413? fr=aladdin

https://zhuanlan.zhihu.com/p/65546228

https://blog.csdn.net/enweitech/article/details/51905922