网站常见安全漏洞
本文主要从网站基本组成及漏洞定义、服务端漏洞、客户端漏洞三个方面进行介绍。
1 网站基本组成及漏洞定义
网站分为前端和后端,前端负责一些页面的展示以及接口的调用;后端提供一些数据的接口,处理一些业务的逻辑完成一些数据的实际处理;中间涉及到中间的组件,例如nginx的网关做代理,涉及静态资源的存储CDN;前后端交互,例如HTTP/WebSocket。网站的漏洞可以从基本的几个部分来分析。
1.1 经常听到的安全事故
- 数据泄露。公共卫生系统数据泄露,黑客获取病人的个人信息,包括出生日期、家庭住址等。
- 服务瘫痪。航空公司官网技术性故障,系统崩溃中断。
- 成果失窃。一些核心的企业机密数据泄露。
- 系统劫持。控制权限为非法入侵者所用。
1.2 攻击者及意图
- 政治目的。出于政治目的实施黑客攻击。可能涉及窃取关键系统的机密数据、破坏关键系统正常运行。
- 经济目的。网站数据具有很高的经济价值,攻击者通过网站漏洞违法获取数据并进行售卖。
- 竞争目的。同类厂商之间可能由于竞争原因,对竞品网站进行一些攻击,以达到让对方站点无法运行的目的。
- 炫技、泄愤。用攻击对方网站方式彰显自己的技术实力,或者对某些仇恨的系统发起攻击。
网站攻击分为针对客户端(前端)的漏洞攻击和针对服务端(后端)漏洞的攻击。
漏洞的分类
- 服务端漏洞:SQL、RCE/命令注入、SSRF、文件上传等。
- 客户端漏洞:XSS、CSRF、点击劫持等。
2 服务端漏洞
2.1 第三方组件漏洞
网站中引用了第三方的组件,这些组件存在安全漏洞导致开发的网站也受到影响。
- 例如打印了一条日志,服务器就中病毒了。指向一个地址,打印这条日志的时候就会去下载远端的程序并执行。
- 解析下json,服务器就中病毒了。json反系列化,涉及到把json的字符串解析到结构化的数据,例如在python里可能就是一个地址。有时把字符串里的key或value对应到某个语言的数据结构里,触发了异常的流程,最终去下载了一段远程的恶意代码并在本地执行。
防护方法:
针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞,在Java项目里配置上这个插件,让它帮你对比工程文件里有没有相关危险组件并形成报告组件的危险等级和更新的无安全漏洞的版本。
2.2 SQL注入
SQL语句静态模板和动态模板部分没有严格区分,如果在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),改变了SQL语句的语意,这些SQL语句就很可能在数据库写入或读取数据时得到执行,例如用字符串直接拼接的方式是不安全的。
- 在java中,错误使用语言框架,或者语言框架本身存在安全问题。使用Mybatis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
- 在java中,查询某个id,用Mybatis使用[$]而非[#]这个符号构建SQL模板更安全。
- golang常见错误写法,业务场景里遇到根据用户定义的字段进行排序的功能,如法国直接将用户输入字段作为维度带到Order则会产生SQL注入,假设GORM语句为:
db.Order(param).Find(&product)
正常情况用户输入维度字段即可实现自定义排序
param: code
SQL语句:
SELECT * FROM'product'WHERE'products'.'delected_at'IS NULL ORDED BY code
攻击者可以输入SQL语句,改变原始SQL语义
param: if(1,sleep(10),'code')
SQL语句:
SELECT*FROM'products'WHERE'products'.'delected_at'IS NULL ORDER BY if(1,sleep(10),'code')
在order里面传入参数会存在一定危险,可以在if里面做很多事情,比如猜测一些字段名。
防护方法:
- 尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架。
- 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题。
- 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。
2.3 命令执行
代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。
防护方法:
- 对动态的值尽可能设置白名单进行验证。
- 如果某些位置无法白名单,需要尝试对数据类型进行校验。
- 特殊字符黑名单的过滤,或者转义。
2.4 越权漏洞
跨越所应有的权限执行不应该有的权限。可细分为:未授权、水平越权和垂直越权。
越权漏洞——水平越权
- 黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderld获取其他用户的订单信息
- 防护方式:涉及资源id尽量不要使用短id (遍历难度较小), 同时最重要的一定要做好资源属主校验。
越权漏洞——垂直越权
- 黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。
- 防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。
2.5 SSRF
SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
- 服务端流程:服务端请求stockApi,获取结果返回。
- 攻击者:将stockApi参数改为内网地址,访问内网资源。 例如将URL改为: http://localhost/admin ,直接访问内网页面。
- 防护方法:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。
2.6 文件上传漏洞
- 上传服务端的脚本时修改上传包
- 找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件 (恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。
防护方法:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
- 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。
- 防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。
3 客户端漏洞
3.1 开放重定向
- 开放重定向:某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。
- 危害:钓鱼攻击
- 修复方案:对重定向严格进行白名单控制并正确校验匹配白名单。
3.2 XSS
- 跨站脚本(XSS)攻击:本质是一种Script代码注入,攻击者往目标Web页面里插入恶意Script代码,当用户访问页面(有客户端时需要交互)时,嵌入其中Web里面的Script 代码会被执行,从而达到恶意攻击用户的目的。
- 场景:反射型,存储型,Dom型。
- 危害:通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。
例如:前端代码使用了Vue,会从请求path中读取username,同时使用v-html指令将username直接渲染到Dom中。前端里面任何有用户输入的地方,任何外部可控参数的地方,输入的地方都要注意漏洞。攻击步骤如下:
- 构造恶意链接,将username设置为恶意payload。
- 攻击者通过网站反馈入口,向管理员/运营人员发送恶意链接。
- 攻击者的服务器成功收到管理员/运营人员的Session Cookie。
- 浏览器替换cookie为管理员的,获取管理员权限。
防护方法:
-
输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符
-
输出过滤:
a. 当字符输出到Dom时候,对危险字符进行html encode,避免XSS。
b.使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。
v-html/v- text
- 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和 attribute,可以在代码层面做白名单或者黑名单。
<tag attribute1='value1' attribute2='value2' />
- CSP: 用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。
Content- Security- Policy: default- src 'self; img-src *; media -srC example. org example.net;
script- srC userscripts example.com
3.3 CSRF
- 跨站请求伪造(CSRF) :允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。
- 危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。例如将邮箱改成别人的:vulnerable-website.com/emailchange…
漏洞利用步骤:
- 将更改Email的请求生成CSRF表单,并构造钓鱼链接。
- 发送链接给其他用户。
- 用户点击链接后成功执行email更改操作。
<form method="POST" action="https://0a6a00a603db619a81aa2a880015004d.web-security-academy:net/my-account/change:email">
<input type="hidden" name=" email" value="anything%40web-security-academy.net">
</form>
<script>
document.forms[0],submit();
</script>
防护方式:
防护的核心是判断请求的来源。
- CSRF tokens: 首次访问时候给客户端传递个token, 客户端每次访问时候都必须带上此token才能访问。
- SameSite cookies: Strick -> Lax(Default) -> None.核心是禁止某些场景发送第三方cookie。
- Referer-based validation:校验Referer来源是否是合法站点。
3.4 点击劫持(clickjacking)
点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一一些非预期的操作。
- 漏洞场景:如考虑删除账号功能,如果目标站点CSRF防护做的很到位,无法直接构造CSRF钓鱼页面,这时候可以考虑在钓鱼页面iframe原始页面,并且覆盖层诱导性的文字。
漏洞利用步骤:
- 参考如下代码构造钓鱼页面链接。
- 发送链接给其他用户。
- 用户访问链接,点击实际要访问的地址的时候,实际是叠加的一层div诱导点击后去了目标站点。
防护方式:
防护的核心是不让非预期的网站iframe我的站点
- X-Frame-Options: DENY/SAMEORIGIN
- CSP: frame-ancestors指令,用于设置允许rame的source列表。
Content-Security-Policy:frame-ancestors <space separated list of sources>;
Content-Security-Policy:frame-ancestors'self'https://example.org https://example.com
https://store.example.com;
3.5 CORS跨域配置错误
CORS:全称是“跨域资源共享”(Cross -origin resource sharing),用以解决网页应用跨域访问的需求。
CORS错误配置: CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问AllowList,导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏。
常见几种错误配置: |以需要跨域访问 example.com所有子城名为例
- 前缀/后缀/包含/正则匹配:可用example.com.attack com、attackexample.com、attackexample.com 域名绕过。
- 反射:在Access- Control- Allow Origin中 反射请求的Origin值。理论上可以用任意域名绕过。
- 信任null:攻击者还可以从任意域下通过iframe sandbox构造Origin为nul的跨域请求
- https信任http: http传输存在被劫持篡改可能,攻击者可能通过劫持通信流量注入恶意脚本方式窃取敏感信息。
案例场景:网站个人信息页提供查看个人信息功能,相关接口允许跨域访问且存在配置问题。
利用思路:
- 构造钓鱼页面URL: exploit0afa001a03b84b8980e775a6015b0Ode.exploit-server.net/exploit
- 在钓鱼页面后台监控访问日志,发现受害者成功点击了钓鱼页面,并且将accountDetail信息回传。
防护方式:核心是正确设置跨域白名单
- 代码层: Middleware统一处理
- 网管层: Nginx反代统一拦截处理
3.6 WebSocket
区别于http,只是不同的交互协议,本质上http服务端的漏洞,在WebSocket上也可能存在。
- WSS和WS: WSS (WebSockets over SSL/TLS),提供加密信道。杜绝掉一些中间人攻击 。
- 数据校验: SQL/XSS/RCE 等漏洞仍然可能存在
- CSWSH: Cross-Site WebSocket Hijacking,即在使用cookie作为认证方式时候,如果WebSocket服务端没有校验好请求来源(Origin) ,将导致WebSocket会话劫持。
黑产设置钓鱼页面,用户一旦访问后,用户WebSocket会话就可能会被监听。
CSWSH防护手段:
- Cookie鉴权:限制请求的Origin。
- ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中。
4 总结
- 网站运营者:网络运营者应当采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、毁损、丢失。在发生或者可能发生个人信息泄露、毁损、丢失的情况时,应当立即采取补救措施,按照规定及时告知用户并向有关主管部门报告。
- 组织/个人:任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。