襄阳门户网

搜索
襄阳门户网 襄阳门户 企业宣传 查看内容

了解:层层剖析一次 HTTP POST 请求事故

2022-7-13 15:21| 发布者: msmkmm2012| 查看: 11| 评论: 0

摘要: 作者 |互联服务器团队- W L加速器的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖!https://www.tiandiapp.com/本文主要讲述的是如何根据络架构和业务 ...
网站出售

作者 |互联服务器团队- W L加速器的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖!https://www.tiandiapp.com/

本文主要讲述的是如何根据络架构和业务特点,锁定正常请求被误判为跨域的原因并解决。

一、问题描述某一个业务后台在表单提交的时候,报跨域错误,具体如下图:



从图中可看出,报错原因为HTTP请求发送失败,由此,需先了解HTTP请求完整链路是什么。

HTTP请求一般经过3个关卡,分别为DNS、N、W服务器,具体流程如下图:

浏览器发送请求首先到达当地运营商DNS服务器,经过域解析获取请求 IP 地址浏览器获取 IP 地址后,发送HTTP请求到达N,由N反向代理到W服务端比较后,由服务端返回相应的资源

了解HTTP基本请求链路后,结合问题,进行初步调查,发现此表单是格式的提交。同时,此业务系统采用了前后端分离的架构方式(页面域和后台服务域不同
), 并且在N已经配置跨域解决方案。基于此,我们进行分析。

二、问题排查步骤首步:自测定位

既然是表单,我们采用控制变量法,尝试对每一个字段进行修改后提交测试。在多次试验后,锁定表单中的E
字段的变化会导致这个问题。

考虑到E字段在业务上是一段JS代码,我们尝试对这段JS代码进行删除修改,发现:当字段E中的这段代码足够小的时候,问题消失。

基于上述发现,我们首个猜想是:会不会是HTTP响应方的请求大小限制导致了这个问题。

第二步:排查 HTTP 请求限制

由于采用前后端分离,真的请求是由 XXXXXXXXX 这个内域代表的服务进行响应的。而内域的响应链如下:



那么理论上,如果是HTTP请求的限制,则可能发生在 LVS 层或者N层或者T。我们一步步排查:

首先排查LVS层。若LVS层故障,则会出现关异常的问题,返回码会为502。故此,通过抓包查看返回码,从下图可看出,返回码为418,故而排除LVS异常的可能



其次排查N 层。N层的HTTP配置如下:



我们看到,在N层,比较大支持的HTTP请求为50, 而我们这次事故的请求表单,大约在2M, 远小于限制, 所以:不是N
层HTTP请求的限制造成的。

然后排查 T 层,查看 T 配置:



我们发现, T 对于比较大请求的限制是-1, 语义上表示为限制,所以: 不是 T
层HTTP请求的限制造成的。

综上,我们可以认为:此次问题和HTTP请求的大小限制关。

那么问题来了,如果不是这两层导致的,那么还会有别的因素或者别的络层导致的吗?

第步:集思广益

我们把相关的运维方拉到了一个群里面进行讨论,讨论分两个阶段

【首阶段】

运维方同学发现 T
是使用容器进行部署的,而容器和层中间,存在一个容器自带的层——。我们查看的相关配置后,发现其对于HTTP请求的大小限制为3072。排除是的原因。

【第二阶段】

安全方同学表示,为了防止XSS攻击,会对于所有后台请求,都进行XSS攻击的校验,如果校验不通过,会报跨域错误。

也就是说,理论上完整的络层调用链如下图:



并且从WAF的工作机制和问题表象上来看,很有可能是WAF层的原因。

第四步:WAF 排查

带着上述的猜测,我们重新抓包,尝试获取整个HTTP请求的路径,看看是不是在WAF层被拦截了,抓包结果如下:





从抓包数据上来看,为代表前端请求发送成功,返回码为418,而中的地址经查询为WAF服务器地址。

综上而言,表单中的E字段的变化很可能导致在WAF层被拦截。而出现问题的E字段内容如下:

= { "W": 80, "": {"": "XXX","": "","":{"":"","":["",""">,"":{ "":{"":"XXX","":"" }, "":{"":"XXX","":"","":{ : { : (, ) { 至少填写一项(! || !O()) {( E('至少填写一项'))}() } }}我们进行一个字段一个字段排查后,锁定

字段会触发WAF的拦截机制:请求包过WAF模块时会对所有的攻击规则都会进行匹配,若属于高危风险规则,则触发拦截动作。

、 问题分析整个故障的原因,是业务请求的内容触发了WAF的XSS攻击检测。那么问题来了

为什么需要WAF什么是XSS攻击在说明XSS之前,先得说清楚浏览器的跨域保护机制

31 跨域保护机制现代浏览器都具备‘同源策略’,所谓同源策略,是指只有在地址的:

协议 HTTPS,HTTP域端口均一样的情况下,才允许访问相同的、S或是发送A请求等等。若在不同源的情况下访问,就称为跨域。而在日常开发中,存在合理的跨域需求,比如此次问题故障对应的系统,由于采用了前后端分离,导致页面的域和后台的域必然不相同。那么如何合理跨域便成了问题。

常见的跨域解决方案有:IFRAME, JSONP, CORS种。

IFRAME 是在页面内部生成一个IFRAME,并在IFRAME内部动态编写JS进行提交。用到此技术的有早期的EXT框架等等。JSONP
是将请求序列化成一个,然后发起一个JS请求,带上。此做法需要后台支持,并且只能使用GET请求。在当前的业内已经废除此方案。CORS 协议的应用比较广泛,并且此次出事故的系统是采用了CORS进行前后端分离。那么,什么是CORS协议呢?32 CORS协议CORS(C-O R
S)跨源资源分享是解决浏览器跨域限制的W3C标准(官方文档),其核心思路是:在HTTP的请求头中设置相应的字段,浏览器在发现HTTP请求的相关字段被设置后,则会正常发起请求,后台则通过对这些字段的校验,决定此请求是否是合理的跨域请求。

CORS协议需要服务器的支持(非服务器的业务进程), 比如 T 7及其以后的版本等等。

对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,现CORS通信的关键是服务器(服务器端可判断,让哪些域可以请求)。只要服务器现了CORS协议,就可以跨源通信。

虽然CORS解决了跨域问题,但引入了风险,如XSS攻击,因此在到达服务器之前需加一层W应用防火墙(WAF),它的作用是:过滤所有请求,当发现请求是跨域时,会对整个请求的报文进行规则匹配,如果发现规则不匹配,则直接报错返回(类似于此次案例中的418)。

整体流程如下:



不合理的跨域请求,我们一般认为是侵略性请求,这一类的请求,我们视为XSS攻击。那么广义而言的XSS攻击又是什么呢?

33 XSS 攻击机制XSS为跨站脚本攻击(C-S S)的缩写,可以将代码注入到用户浏览的页上,这种代码包括 HTML 和
JS。

例如有一个论坛,攻击者可以在上面发布以下内容:

="?=" + 之后该内容可能会被渲染成以下形式:

="?=" + 另一个用户浏览了含有这个内容的页面将会跳转到并携带了当前作用域的 C。如果这个论坛通过 C
管理用户登录状态,那么攻击者就可以通过这个 C 登录被攻击者的账号了。

XSS通过伪造虚假的输入表单取个人信息、显示伪造的文章或者图片等方式可窃取用户的
C,盗用C后就可冒充用户访问各种系统,危害极大。

下面给出2种XSS防御机制。

34 XSS 防御机制XSS防御机制主要包括以下两点:

341 设置 C 为 HTTPO设置了 HTTPO 的 C 可以防止 JS 脚本调用,就法通过获取用户 C
信息。

342 过滤特殊字符例如将转义为;,将 转义为;,从而避免 HTML 和 J 代码的运行。

富文本编辑器允许用户输入 HTML 代码,就不能简单地将等字符进行过滤了,极大地提高了 XSS 攻击的可能性。

富文本编辑器通常采用 XSS来防范 XSS 攻击,通过定义一些标签白单或者黑单,从而不允许有攻击性的 HTML 代码的输入。

以下例子中, 和等标签都被转义,而和等标签将会保留。

1 =""XSS D1 123 ="" ="" =""=""();1XSS D1 123转义后:

1XSS D1 123 ;;; ="" ="" ="";;;; ="";();;;四、问题解决在确定问题后,让安全团队修改WAF的拦截规则后,问题消失。

比较后,对此问题进行总结。

五、问题总结纵览整个排查过程,比较耗费资源的工作集中于问题定位:到底是哪个模块出现了问题。而定位模块的比较大难点在于:对于络全链路的不了解(之前并不知晓WAF层的存在)。

那么,针对类似的问题,我们后面应该如何去加速问题的解决呢?我认为有两点需要注意:

采用控制变量法, 精准定位到问题的边界——什么时候能出现,什么时候不能出现。熟悉每一个模块的存在,以及每一个模块的职责边界和风险可能。下面来逐个解释:

51 确定问题边界我们在一开始,确定是表单导致的问题后,我们就逐个字段进行修改验证,比较终确定其中某个字段导致的现象。在定位到具体的问题发生地后,由将之前锁定的字段进行拆解,逐步分析字段中每个属性,从而比较终确定XX属性的值触犯了WAF的规则机制。

52 定位模块错误在此案例中,跨域拒绝的故障主要是络层,那么我们就必须要摸清楚整个业务服务的络层次结构。然后对每一层的情况进行分析。

在N层,我们对配置文件进行分析在层,我们对其中的配置规则进行分析在T层,我们对的属性进行分析总结而言,我们必须熟悉每一个模块的职责,并且知晓如何判断每一个模块是否在整个链路中正常工作,只有基于此,我们才能将问题原因的范围逐步缩小,从而比较后获得答案。

路过

雷人

握手

鲜花

鸡蛋

文热点