网站常见的漏洞

服务端常见漏洞
SQL 注入
sql 语句的静态模版和动态数据没有严格的区分,如果在数据项中加入某些sql关键字,这些关键字就很可能在写入或读取数据时得到执行。
- 应对SQL注入的方式
- 尽量不使用DB的Raw方法拼接sql,规范使用ORM或预编译
- 使用ORM时,多关注框架中的特性,可能存在不安全的写法,例如 GORM Order函数
- 在一些必须使用sql拼接的场景下,需对外部输入进行转义
RCE/命令注入
代码中遇到需要调用某个命令才能完成的功能时,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令输入风险。
- 应对命令注入的方式
- 对动态的值建立白名单进行验证
- 如果某些位置无法白名单,就加强对数据类型的校验
- 特殊字符黑名单过滤或者转义
越权漏洞
资源访问或操作的时候主体权限没有进行校验就会造成越权问题,细分为:未授权,水平越权和垂直越权
- 水平越权
- 发生场景
例如在订单查询功能提供Id就能查询订单详情,这里攻击者可通过遍历orderId获取其他用户的订单信息 - 防护方式
尽量使用长ID(遍历难度变大),同时最重要的做好资源属主的校验
- 发生场景
- 垂直越权
- 发生场景
攻击者通过开通另外的测试账户抓包未获得权限的接口,绕过前端直接尝试访问后端接口,获取数据。 - 防护方式
对路由级别进行分组,对不同的API分组引用Middle进行权限拦截,Middle获取当前用户角色已确定是否可以访问当前接口。
- 发生场景
SSRF
服务器请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(例如:内网地址)发出恶意请求,获取敏感信息或执行恶意操作。
- 发生场景
服务端请求socketAPI,获取结果返回。将socketAPi 参数改为内网地址访问内网资源。 - 防护方式
将url和host进行白名单过滤,获取对host解析的ip判定是否为内网地址。
文件上传
恶意上传文件或脚本,用于攻击或分享。
- 发生场景
上传一些服务端的脚本,(例如.php)文件上传后可直接读取文件或找公开的上传点上传恶意文件,获取文件url,然后直接分享url到外部恶意网站。 - 防护方案
- 限制文件类型: 如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
- 站库分离:应用部署的位置和上传的文件分离,如:oss等。
- 防止图床:对图片访问链接进行限制,包括时间,访问身份等。
WebSocket
本质上http服务端的漏洞在websocket上也会存在。
- 发生场景
- wss 和 ws wss提供加密信道
- 数据校验 SQL/XSS/RCE仍然存在
- CSWSH,在cookie作为认证方式的时候,如果websocket服务没有校验好请求来源,将会导致websocket会话劫持。
- 防护方案
- Cookie鉴权
- token或ticket鉴权
第三方组件漏洞
- 打印日志服务器就中病毒了
- 解析一个json服务器就中病毒了
- 查看现有组件漏洞工具
- go 官方工具
go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./.. // 可通过 -db 指定一个外部的Go漏洞 - 编辑器集成插件
- go 官方工具
客户端常见漏洞
开放重定向
某些需要重定向到其他站点的功能,参数中经常携带需要重定向的URL,但是实际程序中没有控制重定向的范围,导致攻击者可以构造恶意的链接,诱导用户到恶意网站。
- 发生场景
钓鱼攻击,恶意的链接,诱导用户到恶意网站。 - 防护方案
对重定向进行严格的白名单控制,并正确的校验匹配白名单。
XSS
跨站脚本攻击,攻击者往目标WEB页面插入恶意的代码,当用户访问时,嵌入代码会被执行,达到恶意攻击用户的目的
- 发生场景
攻击者在输入框输入一些客户端的代码,可分为反射型,存储型,Dom型,通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。 - 防护方案
- 输入过滤:对特殊的字符进行拦截,禁止提交一些特殊字符。
- 输出过滤:当字符输出的时候镜像html encode,避免xss ,使用框架时使用v-html/v-text这样的安全指令。
- 富文本场景:在发布文章等场景,本身需要提供富文本的功能,这时候需要严格限制tag和attribute,可以在代码地城做白名单和黑名单。
- CSP:用于缓解XSS,理念是对当前站点允许加载什么的资源,发送什么请求进行限制,配置 header 中的 Content-Security-Policy
CSRF
跨站请求伪造:允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作
- 发生场景
用户执行敏感操作,如关注其他用户或者更改账户的安全邮箱等。 - 防护方案
核心方案就是判断请求来源是否合法- CsrfToken 首次访问客户端时传递一个token,客户端每次访问都要携带上此token
- 禁止某些场景发送第三方cookie
- 校验Referer来源是否合法
点击劫持
在网页中将恶意代码等隐藏值看似无害的内容或按钮中,并引导用户点击,用户点击后往往会执行一些非预期操作。
- 发生场景
用户访问链接,点击a按钮时,实际点击的是b - 防护方案
- X-Frame-Options:DENY/SAMEORIGIN
- CSP: frame-ancestors
CORS跨域配置错误
cors本身不存在漏洞,但由于开发时的错误配置,导致非预期的网站可以进行跨域访问。
发生场景
以需要跨域访问 example.com 所有子域名为例:- 前缀/后缀/包含/正则匹配 可用 example.com.a.com等方式绕过
- 反射 在Access-control-Allow-Origin中反射请求的Origin值理论上可以任意域名绕过
- 攻击者还可以从任意域下通过iframe sandbox构造 origin为null的跨域请求
- http 传输存在被劫持篡改的可能,攻击者可能通过劫持通信流量注入恶意脚本方式窃取敏感信息
防护方案
- 代码层 用中间件统一处理
- 网关层 nginx反向代理统一拦截
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。