网站常见安全漏洞

177 阅读6分钟

网站常见安全漏洞

1 什么是漏洞

数据泄露、服务瘫痪、成果失窃、系统劫持

2 服务端漏洞

2.1 第三方组件漏洞

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

2.2 SQL注入

错误使用语言框架,或语言框架本身存在安全问题

例:1)使用mybatis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险

2)mybatis使用#构建SQL模板(相当于直接拼接)

解决:用$不用#

3)Golang常见错误写法

防护方式:1)尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架

“GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于 SQL 语言的掌握程度,使用提供的 API 进行底层数据库的访问。”

使用gorm连接mysql:

package main
​
import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "time"
)
​
func main() {
    // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    //db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    db, err := gorm.Open(mysql.New(mysql.Config{
        DSN:                       "root:123456@tcp(192.168.168.101:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
        DefaultStringSize:         256,                                                                                // string 类型字段的默认长度
        DisableDatetimePrecision:  true,                                                                               // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
        DontSupportRenameIndex:    true,                                                                               // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
        DontSupportRenameColumn:   true,                                                                               // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
        SkipInitializeWithVersion: false,                                                                              // 根据当前 MySQL 版本自动配置
    }), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // ----------------------------数据库连接池----------------------------
    sqlDB, err := db.DB()
    // SetMaxIdleConns 设置空闲连接池中连接的最大数量
    sqlDB.SetMaxIdleConns(10)
    // SetMaxOpenConns 设置打开数据库连接的最大数量。
    sqlDB.SetMaxOpenConns(100)
    // SetConnMaxLifetime 设置了连接可复用的最大时间。
    sqlDB.SetConnMaxLifetime(time.Hour)
    fmt.Println("success to link mysql")
    select {}
}
​

作者:yumuing 链接:juejin.cn/post/724221… 来源:稀土掘金

2)使用ORM框架时,注意框架特性,可能存在不安全写法导致SQL注入问题

3)在复杂场景使用拼接SQL,需要对外部输入进行转义

2.3 命令执行

如果命令拼接没有做好安全过滤,将导致命令注入风险,服务器权限将被控制

防护方式:1)对动态值尽可能设置白名单进行验证

2)无法设置白名单时,对数据类型进行校验

3)特殊字符黑名单过滤或转义

2.4 越权漏洞

资源访问或操作时,主体权限没有进行校验。分为未授权、水平越权、垂直越权

水平越权:

黑灰产场景:订单查询功能可以通过orderId查询订单详细,攻击者遍历orderId获取其他用户的订单信息

防护:资源id尽量不要使用短id(遍历难度小),同时要资源属主校验

垂直越权:

黑灰产场景:攻击者开通测试管理员账户抓包获取接口,或通过逆向前端代码方式获取接口,然后绕过前端直接访问后端

防护:简单场景可以将接口在路由级别进行分组,对不同API分组引入Middleware(中间件)进行权限拦截。

2.5 SSRF 服务端请求伪造攻击

利用后端服务器向内网发出恶意请求

防护:对url的host设置白名单,若解析出的IP不是内网地址,则拒绝访问

2.6 文件上传漏洞

文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序等。

一篇文章带你入门文件上传漏洞 - 掘金 (juejin.cn)

防护方式1)限制文件类型

2)站库分离:应用部署位置与上传文件分离

3)防止图床:对图片访问链接进行时间限制、访问身份限制等

3 客户端漏洞

3.1 开放重定向

重定向:某些网站需要重新定向到其他站点,所以在参数中携带url。

若程序逻辑没有控制好重定向范围,攻击者可以构造恶意连接,诱导用户到恶意站点。

修复:对重定向url设置白名单。

3.2 XSS 跨站脚本攻击

攻击者在web中插入恶意script

有用户输入的地方都可能遇到这种攻击,导致用户数据被读取

防护:1)输入过滤:禁止前端提交特殊字符

2)输出过滤

3)富文本场景

4)CSP:对当前站点能加载什么源的资源、发送什么请求进行限制

3.3 CSRF 跨站请求伪造

攻击者诱导用户访问恶意链接,执行用户非预期操作

例:

盗取域名的流程图

防护核心:判断请求来源

1)token:首次访问时,给客户端传递一个token,以后客户端每次访问都必须带此token才能访问

2)禁止某些场景发送第三方cookie

SameSite cookie 的说明 (web.dev)

与当前网站的域名相匹配的 cookie 被称为第一方 cookie;来自当前网站以外域名的 cookie 被称为第三方 cookie。

“在 HTTP 响应头中,设置 Cookie 时,带上 SameSite 选项,可以防止第三方站点使用Cookie。

SameSite 选项通常有 Strict、Lax 和 None 三个值。

  • Strict 最为严格。如果 SameSite 的值是 Strict,那么浏览器会完全禁止第三方 Cookie。简言之,如果你从百度的页面中访问掘金的资源,而 掘金的某些 Cookie 设置了 SameSite = Strict 的话,那么这些 Cookie 是不会被发送到 掘金的服务器上的。只有你从 掘金的站点去请求 掘金 的资源时,才会带上这些 Cookie。
  • Lax 相对宽松一点。在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交 Get 方式的表单这两种方式都会携带 Cookie。但如果在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie。
  • 而如果使用 None 的话,在任何情况下都会发送 Cookie 数据。

严格程度分别是全部不允许第三方>仅允许GET请求>全部允许

作者:精神科_江主任 链接:juejin.cn/post/685927… 来源:稀土掘金

3)检验Referer来源是否是合法站点

3.4 点击劫持

将恶意代码隐藏在诱导内容后

防护1)X-Frame-Options

“X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面是否可以在 , , 或者 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 Clickjacking 攻击。”

作者:jessic_lin 链接:juejin.cn/post/684490… 来源:稀土掘金

2)CSP,设置白名单

3.5 CORS跨域配置错误

CORS:跨域资源共享

防护核心:设置白名单

3.6 WebSocket