神秘的黑客总是能轻而易举地破解一些网站的前端验证,他们到底是如何做到的? 将验证放在后端。前端验证针对UX,而非安全性。这是因为不良行为者会欺骗前端验证。但是我们很难理解一个黑客是如何欺骗它的。 之前笔者从没想过,我只是想这意味着有人可以通过对Postman之类的东西发出请求来绕过验证。但是后来我了解到,使用相同的原产地政策是不可能的。那么这些不良行为者如何提出相同的原产地请求? 其实,有很多方法可以绕过客户端验证。HTTP只是字节流,在HTTP 1.x中它们甚至是人们可读的文本(至少对于标头而言)。这使得伪造或操纵请求变得轻而易举。这是执行方法的子集,按粗略类别分组: 在浏览器中绕过验证 浏览到您的站点并输入无效的值。使用浏览器开发工具删除验证事件或操纵其执行以任何方式通过验证。提交表格。使用浏览器开发者控制台,就像通过经过验证的表单一样,从站点发送请求,但是输入未经验证(只需直接调用发出请求的函数即可)。使用浏览器开发工具“编辑并重新发送”请求,然后在重新发送之前,将正文中的有效值更改为无效值。对于GET请求:只需在位置栏中键入任何带有无效参数的URL。对于使用非同一Cookie进行身份验证的POST请求:创建一个网页,以期望的值(包括任何CSRF保护令牌)但具有无效的值发布到您的服务器,然后将其加载到浏览器中并提交。使用非浏览器工具绕过验证 将浏览器设置为通过拦截代理运行(就像大多数安全行业中一样,通常使用Burp Suite,但是也可以使用Fiddler之类的其他产品)。捕获出站请求,篡改字段以使其无效,然后继续发送。再次使用拦截代理,但是这次使用修改后的无效值重播先前的请求(在Burp中,这正是Repeater工具的用途)。右键单击浏览器的开发工具的网络历史记录中的请求,选择“复制为cURL”,将生成的curl命令粘贴到命令行中,编辑已验证的字段以使其无效,然后按Enter发送。从头开始制作恶意请求 使用Burp Repeater,指定站点的协议,域和端口。添加必要的标头,包括授权所需的任何cookie或其他标头。添加具有无效值的所需参数。点击“发送”。使用curl,将请求与所需的标头以及所需的任何正文(包括无效值)一起发送到您的网站。使用ncat,在端口443上使用TLS打开到您站点的连接。键入HTTP顶行,标头和正文(毕竟,这只是文本,尽管在发送之前会经过加密)。如果需要,请发送文件结尾输入(通常,服务器只是立即响应)。使用TCP或HTTP客户端库(从在节点上运行的JS到成熟的已编译golang二进制文件)以任何语言编写一个小的脚本/程序,该脚本将创建一个具有所有必需标头和无效字段的请求,并将其发送到您的服务器。运行脚本/程序。SOP仅在使用浏览器发送请求并且请求源自托管在与请求目的地不同的来源(域,协议和端口的组合)上的网页时才适用。即使这样,SOP仍主要保护原始页面免受响应。它不能阻止攻击的发生。如果您是攻击者,试图通过客户端验证,那么您只需从被攻击的源发送请求即可,而SOP则完全无关。或者只是从非浏览器(例如代理,curl,自定义脚本)发送请求;甚至都没有SOP。 CORS是在SOP中戳破漏洞的一种方法(CORS不会增加任何安全性;它是部分放松SOP的安全性功能的一种方式),因此,除非与SOP相关,否则甚至都没有关系。但是,在许多情况下,您可以使用无效参数发出跨域请求(例如,在创建自己的攻击页面并将浏览器指向该页面,然后使用它向站点提交无效请求的情况下),因为对于大多数情况请求,SOP仅限制是否可以看到响应-即使服务器根本不允许CORS,也可以跨源发送请求-并且通常不需要查看响应。 身份验证后,将授权令牌(cookie,标头值等)从浏览器中拉出很容易(只需在开发工具中检查网络流量,或使用代理即可)。请记住,要使验证成为问题,攻击者必须能够通过浏览器使用网站,这大概意味着他们可以进行身份验证。或者只是使用curl或其他方式提交身份验证请求,将返回的令牌从响应中删除,然后将其用于恶意的无效请求中;完全不需要浏览器! 浏览器无法执行任何操作(就向服务器发送请求而言),而使用某些常见的开放源代码实用程序从Shell提示符下却无法执行该操作。 如果你能清楚的明白这些套路,那么破解前端验证对你来说并不是无法完成的事情。 |