网站常见安全漏洞 | 青训营

155 阅读6分钟

网站常见安全漏洞

什么是漏洞

一个网站的基本构成

image-20230818150527909.png

一些经常可以听到的安全事件

image-20230818150630319.png

服务端漏洞

第三方组件漏洞

防护方式:针对java可以选择使用dependency-check-maven检查项目依赖的组件是否存在安全漏洞

SQL注入

SQL语句静态模板和动态数据部分没有严格区分,如故宫在数据项中加入了某些语句关键字,这些SQL语句就很可能在数据库写入或者读取时得到执行

goLang中的常见错误

image-20230818153448563.png

防护方式:

  1. 尽量使用DB的Raw方法(也就是一些拼接的方式)拼接构造SQL语句,而应该使用预编译、ORM框架
  2. 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
  3. 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义
命令执行

代码中遇到需要调用某个命令才能完成的功能的时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,也会导致命令注入风险,服务器权限将会被控制

image-20230818154247285.png

防护方式:

  1. 对动态的值尽可能设置白名单进行验证
  2. 如果某些位置无法白名单,需要尝试对数据类型进行校验
  3. 特殊字符黑名单的过滤,或者转义
越权漏洞

细分为:未授权、水平越权和垂直越权

未授权

image-20230818155025981.png

水平越权

image-20230818155042255.png

image-20230818174252318.png

黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderld获取其他用户的订单信息

防护方式:

涉及资源id尽量不要使用短id(遍历难度较小),同时最重要的是一定要最好资源属主校验

垂直越权

image-20230818155056449.png

image-20230820171704665.png

黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取结构,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。

防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。

SSRF

image-20230820172323009.png

例如加载图片的时候,将URL修改为:http://localhost/admin,直接访问访问内网页面

防护方式:对url的host进行白名单过滤,获取host解析的ip进行判定,是否是内网地址

文件上传漏洞

找到公开的上传点(如视频创作/文章创作/客户反馈等),上传恶意文件(恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群

防护方式

  1. 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。
  2. 站库分离:应用部署的位置和上传断点文件分离,一般可以使用TOS,OSS等进行文件存储
  3. 防止图床:对图片访问连接进行限制,包括实践限制,访问身份限制等

客户端漏洞

开发重定向

某些需要重定向到其他站点的功能,往往参数中携带需要重定向的URL,但是实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意连接,诱导用户重定向到恶意站点。

image-20230820182145519.png

修复方式:对重定向严格进行白名单控制并正确校验匹配白名单。

XSS

image-20230820182338719.png

image-20230820185559944.png

step1:构造恶意链接,将username设置为恶意payload

step2:攻击者通过网站反馈入口,想管理员/运营人员发送恶意链接

step3:攻击者的服务器成功收到管理员/运营人员的Session Cookie

step4:浏览器替换cookie为管理员的,获取管理员

防护方式:

  1. 输入过滤:对输入的特殊字符(像是尖括号、引号这些字符)进行拦截,进制前端提交特殊字符

  2. 输入过滤:

    a. 当输入到Dorm时候,对危险字符进行html encode,避免XSS。

    b. 使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text

  3. 富文本场景:比如文章发布场景,本身就是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单。<tag sttribute1='value1' attribute2='value2'/>

  4. CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。

CSRF

image-20230820191446637.png

image-20230820191852737.png

漏洞利用步骤:

step1:将更改Email的请求生成CSRF表单,并构造钓鱼链接。

step2:发送链接给其他用户。

step3:用户点击链接后成功执行email更改操作。

防护方式L防护的核心是判断请求的来源

  1. CSRF tekens:首次访问时候会给客户端传递一个token,客户端每次访问的时候都必须带上token才能访问
  2. SameSite cookies:Strik -> Lax(Default) -> None. 核心是进制某些场景发送第三方cookie
  3. Referer-baded vaildation:校验Referer 来源是否是合法站点
点击劫持(clickjacking)

image-20230820192935786.png

漏洞利用步骤:

step1:参考如下代码构造钓鱼页面链接

step2:发送链接给其他用户

step3:用户访问链接,点击[Win 300¥]时候,实际是点击[Delete Account]

image-20230820193329197.png

防护方式:防护的核心是不让非预期的网站iframe我的站点

  1. X-Frame-Options:DENY/SAMEORIGIN。
  2. CSP:frame-ancestors指令,用于设置允许farame的source列表。
CORS跨域配置错误

CORS:全称是”跨域资源共享“,用以解决网页应用跨域访问的需求。

image-20230820194225108.png

常见几种错误配置:

一需要跨域访问examole.com所有子域名为例

  1. 前缀/后缀/包含/正则匹配:可用example.comattck.com、attackexample.com、attackexample.com域名绕过。
  2. 反射:在Access-Control-Allow-Origin中反射请求的Origin值理论上可以用任意域名绕过。
  3. 信任null:攻击者还可以从任意域名下通过iframe sandbox构造Origin为null的跨域请求
  4. https信任http:http传输存在被劫持篡改可能,攻击者可能通过劫持通信流量注入恶意脚本方式窃取敏感信息。

防护方式:核心是正确设置跨域白名单

  1. 代码层:Middleware统一处理

image-20230820195120035.png

  1. 网关层:Nginx反代统一拦截处理

image-20230820195137547.png

WebSocket

image-20230820195204060.png

image-20230820195304800.png

CSWSH防护手段:

  1. Cookie鉴权:限制请求的Origin。
  2. ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到WebSocket的初始化流程中。

image-20230820195705535.png