网站常见安全漏洞
本文主要记录掘金课程《网络常见安全漏洞》的重要内容,其中囊括了服务端和客户端分别6种常见漏洞,其中部分错误在我们的日常开发中极为常见,此课程笔记能有序引导我们注意日常开发的网络安全意识,既要洞悉入侵手法,更要做好安全防护。如有错漏,感谢指正!
一、什么是漏洞
1.网站的基本构成
- 前端: JavaScript / vue / react
- 网关: nginx
- 后端: Go /Java / Node
- 前后端交互: HTTP /WebSocket
2.常见事件
数据泄漏、服务瘫痪、成果失窃、系统劫持
3.攻击者目的
政治、经济、竞争、炫技、泄愤
4.漏洞分类
服务端漏洞
- SQL
- RCE /命令注入
- SSRF
- 文件上传
客户端漏洞
- Xss
- CSRF
- 点击劫持
二、服务端漏洞
1.第三方组件漏洞
场景:打印日志、解析json
防护方式: 针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
2.SQL 注入
场景:字符串拼接
防护方式:
-
尽量不要基于DB的Raw方法拼接构造SOL语句,而应该使用预编译、ORM框架
-
使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SOL注入问题。
-
在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。
3.命令执行
防护方式:
- 对动态的值尽可能设置白名单进行验证。
- 如果某些位置无法白名单,需要尝试对数据类型进行校验
- 特殊字符黑名单的过滤,或者转义。
4.越权漏洞
分类:未授权、水平越权和垂直越权
-
黑灰产场景: 订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderld获取其他用户的订单信息
防护方式: 涉及资源id尽量不要使用短id (遍历难度较小) ,同时最重要的一定要最好资源属主校验
-
黑灰产场景: 攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。
防护方式: 如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。
5.SSRF
概念:SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址) 发出恶意请求,获取敏感信息或执行恶意操作。
服务端流程: 服务端请求stockApi,获取结果返回
攻击者: 将stockApi参数改为内网地址,访问内网资源
防护方式: 对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。
6.文件上传漏洞
防护方案
-
限制文件类型: 如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格 武
-
站库分离: 应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。
-
防止图床: 对图片访问链接进行限制,包括时间限制,访问身份限制等
三、客户端漏洞
1.开放重定向
概念: 某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的 URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。
危害: 钓鱼攻击。
修复方案: 对重定向严格进行白名单控制并正确校验匹配白名单
2.Xss
概念:跨站脚本(XSS)攻击本质是一种 Script 代码注入,攻击者往目标 Web 页面里插入恶意 Script代码,当用户访问页面 (有客户端时需要交互)时,嵌入其中 Web 里面的 Script 代码会被执行从而达到恶意攻击用户的目的。
场景: 反射型,存储型,Dom型
危害: 通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。
Step1: 构造恶意链接,将username设置为恶意payload。
Step2: 攻击者通过网站反馈入口,向管理员/运营人员发送恶意链接。
Step3: 攻击者的服务器成功收到管理员/运营人员的Session Cookie。
Step4: 浏览器替换cookie为管理员的获取管理员权限。
防护方法:
-
输入过滤: 对输入的特殊字符进行拦截,禁止前端提交特殊字符
-
输出过滤: a.当字符输出到Dom时候,对危险字符进行html encode,避免XSS b. 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
-
富文本场景: 比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和3.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.CSRF
概念:跨站请求伪造 (CSRF) ,允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作
危害: 用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等
漏洞利用步骤:
Step1: 将更改Email的请求生成CSRF表单,并构造钓鱼链接。
Step2: 发送链接给其他用户
Step3: 用户点击链接后成功执行email更改操作。
防护方式: 防护的核心是判断请求的来源
- CSRF tokens: 首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问
- SameSite cookies: Strick -> Lax(Default) -> None. 核心是禁止某些场景发送第三方cookie。
- Referer-based validation: 校验 Referer 来源是否是合法站点。
4.点击劫持 (clickjacking)
概念:点击劫持 (clickjacking) 是一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击的手段,用户点击后往往会执行一些非预期的操作。
漏洞利用步骤:
Step1: 参考如下代码构造钓鱼页面链接 Step2: 发送链接给其他用户。 step3: 用户访问链接,点击 [Win 300$] 时候,实际是点击[Delete Account]
防护方式: 防护的核心是不让非预期的网站 iframe 我的站点
-
X-Frame-Options: DENY / SAMEORIGIN
-
CSP: frame-ancestors指令,用于设置允许frame的source列表。 Content-Security-Policy. frame-ancestors
-
Content-Security-Policy: frame-ancestors 'self' example.org example.comhttps://store.exam…;
5.CORS跨域配置错误
概念:CORS:全称是“跨域资源共享”(Cross-originresource sharing),用以解决网页应用跨域访问的需 求。
CORS 错误配置: CORS本身不存在漏洞,而是由于开发者在配置CORS过程中,错误配置跨域访问Allow List,导致非预期的站点可以进行跨域访问,最终可能导致信息泄漏。
常见几种错误配置:
以需要跨域访问 example.com 所有子域名为例
- 前级/后缀/包含/正则匹配: 可用 example.com.attack.com、attackexample.com、attackexample.com 域名绕过
- 反射:在Access-Control-Allow-Origin中反射请求的Origin值理论上可以用任意域名绕过。
- 信任null: 攻击者还可以从任意域下通过iframe sandbox构造Origin为null的跨域请求
- https信任http: http传输存在被劫持篡改可能,攻击者可能通过劫持通信流量注入恶意脚本方式窃取敏感信息
案例场景: 网站个人信息页提供查看个人信息功能,相关接口允许跨域访问且存在配置问题
防护方式: 核心是正确设置跨域白名单
-
代码层: Middleware统一处理
-
网关层: Nginx反代统一拦截处理
6.WebSocket
区别于http,只是不同的交互协议,本质上http 服务端的漏洞,在 WebSocket 上也可能存在。因此重点讨论 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的初始化流程中
四、总结
懂犯罪而防犯罪,知法而守法!网络安全,你我守护!