通过gosec白盒扫描Go代码中的SQL注入

背景

朋友说他们公司近期发现一些SQL注入问题,究其原因还是因为代码中使用了拼接查询,没有使用参数化查询,而且这种历史遗留问题较难梳理,可能很多都是3-5年前的代码,于是和我了解一种批量白盒审计SQL注入的方法。

方案

通过gosec扫描代码中的注入问题:
gosec 是一个静态分析工具,用于扫描 Go 代码以查找潜在的安全问题。它可以识别常见的代码漏洞、敏感信息泄露和其他安全问题,帮助开发人员提前发现并修复潜在的安全隐患。

检测效果

问题代码1(通过%s进行拼接查询) - 可检测
package mainimport ("database/sql""fmt""net/http""os"_ "github.com/go-sql-driver/mysql"
)var db *sql.DBfunc main() {db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/mydb")if err != nil {fmt.Println("Failed to connect to the database:", err)os.Exit(1)}defer db.Close()http.HandleFunc("/search", searchHandler)http.ListenAndServe(":8080", nil)
}func searchHandler(w http.ResponseWriter, r *http.Request) {query := r.URL.Query().Get("query")if query == "" {fmt.Fprint(w, "Please provide a search query.")return}// Potential SQL injection vulnerability using fmt.Sprintf with %ssqlQuery := fmt.Sprintf("SELECT name, age FROM users WHERE name = '%s'", query)rows, err := db.Query(sqlQuery)if err != nil {fmt.Fprint(w, "An error occurred.")return}defer rows.Close()for rows.Next() {var name stringvar age intif err := rows.Scan(&name, &age); err != nil {fmt.Fprint(w, "An error occurred.")return}fmt.Fprintf(w, "Name: %s, Age: %d\n", name, age)}
}

扫描结果:

osec ./...
[gosec] 2023/10/30 10:06:45 Including rules: default
[gosec] 2023/10/30 10:06:45 Excluding rules: default
[gosec] 2023/10/30 10:06:45 Import directory: /xxx/tools/test
[gosec] 2023/10/30 10:06:45 Checking package: main
[gosec] 2023/10/30 10:06:45 Checking file: /xxx/tools/test/main.go
Results:Golang errors in file: [/xxx/tools/test/main.go]:> [line 9 : column 4] - could not import github.com/go-sql-driver/mysql (invalid package name: "")[/xxx/tools/test/main.go:23] - G114 (CWE-676): Use of net/http serve function that has no support for setting timeouts (Confidence: HIGH, Severity: MEDIUM)22:         http.HandleFunc("/search", searchHandler)> 23:         http.ListenAndServe(":8080", nil)24: }[/xxx/tools/test/main.go:34] - G201 (CWE-89): SQL string formatting (Confidence: HIGH, Severity: MEDIUM)33:         // Potential SQL injection vulnerability using fmt.Sprintf with %s> 34:         sqlQuery := fmt.Sprintf("SELECT name, age FROM users WHERE name = '%s'", query)35:         rows, err := db.Query(sqlQuery)[/xxx/tools/test/main.go:23] - G104 (CWE-703): Errors unhandled. (Confidence: HIGH, Severity: LOW)22:         http.HandleFunc("/search", searchHandler)> 23:         http.ListenAndServe(":8080", nil)24: }Summary:Gosec  : devFiles  : 1Lines  : 51Nosec  : 0Issues : 3
包导入错误:[line 9 : column 4] - 无法导入 github.com/go-sql-driver/mysql,因为它的包名为空。这个问题是由于在代码中试图导入一个没有包名的包而引发的。你需要检查你的导入语句并确保包名正确。HTTP服务器超时设置问题:[/xxx/tools/test/main.go:23] - G114 (CWE-676): 使用net/http的serve函数,它不支持设置超时时间。这表示你的HTTP服务器在处理请求时没有设置超时,这可能导致潜在的性能和安全问题。SQL字符串格式化问题:[/xxx/tools/test/main.go:34] - G201 (CWE-89): SQL字符串格式化。你使用了fmt.Sprintf来构建SQL查询字符串,这会导致潜在的SQL注入漏洞。最好使用参数化查询或者正确转义输入来避免这种问题。未处理错误:[/xxx/tools/test/main.go:23] - G104 (CWE-703): 未处理错误。在HTTP服务器的启动代码中,错误没有被处理。你应该考虑捕获错误并采取适当的措施来处理它们,以提高代码的健壮性。
问题代码2(通过“ +”进行拼接查询) - 可检测
package mainimport ("database/sql""fmt""log""net/http""strings"_ "github.com/go-sql-driver/mysql"
)var db *sql.DBfunc main() {// 连接到数据库var err errordb, err = sql.Open("mysql", "username:password@tcp(localhost:3306)/mydatabase")if err != nil {log.Fatal(err)}defer db.Close()http.HandleFunc("/search", searchHandler)http.ListenAndServe(":8080", nil)
}func searchHandler(w http.ResponseWriter, r *http.Request) {query := r.URL.Query().Get("query")// 构建SQL查询字符串(易受SQL注入攻击)sqlQuery := "SELECT name, age FROM users WHERE name = '" + query + "'"rows, err := db.Query(sqlQuery)if err != nil {log.Println("Error executing query:", err)return}defer rows.Close()var name stringvar age intfor rows.Next() {err := rows.Scan(&name, &age)if err != nil {log.Println("Error scanning row:", err)continue}fmt.Fprintf(w, "Name: %s, Age: %d\n", name, age)}
}

扫描结果:

gosec ./...                                                                                                                                                                           1[gosec] 2023/10/30 10:26:49 Including rules: default
[gosec] 2023/10/30 10:26:49 Excluding rules: default
[gosec] 2023/10/30 10:26:49 Import directory: /xxx/tools/test
[gosec] 2023/10/30 10:26:50 Checking package: main
[gosec] 2023/10/30 10:26:50 Checking file: /xxx/tools/test/main.go
Results:Golang errors in file: [/xxx/tools/test/main.go]:> [line 9 : column 4] - could not import github.com/go-sql-driver/mysql (invalid package name: "")[/xxx/tools/test/main.go:24] - G114 (CWE-676): Use of net/http serve function that has no support for setting timeouts (Confidence: HIGH, Severity: MEDIUM)23:         http.HandleFunc("/search", searchHandler)> 24:         http.ListenAndServe(":8080", nil)25: }[/xxx/tools/test/main.go:31] - G202 (CWE-89): SQL string concatenation (Confidence: HIGH, Severity: MEDIUM)30:         // 构建SQL查询字符串(易受SQL注入攻击)> 31:         sqlQuery := "SELECT name, age FROM users WHERE name = '" + query + "'"32:[/xxx/tools/test/main.go:24] - G104 (CWE-703): Errors unhandled. (Confidence: HIGH, Severity: LOW)23:         http.HandleFunc("/search", searchHandler)> 24:         http.ListenAndServe(":8080", nil)25: }Summary:Gosec  : devFiles  : 1Lines  : 50Nosec  : 0Issues : 3
包导入错误:[line 9 : column 4] - 无法导入 github.com/go-sql-driver/mysql,因为它的包名为空。这个问题是由于在代码中试图导入一个没有包名的包而引发的。你需要检查你的导入语句并确保包名正确。HTTP服务器超时设置问题:[/xxx/tools/test/main.go:24] - G114 (CWE-676): 使用net/http的serve函数,它不支持设置超时时间。这表示你的HTTP服务器在处理请求时没有设置超时,这可能导致潜在的性能和安全问题。SQL字符串拼接问题:[/xxx/tools/test/main.go:31] - G202 (CWE-89): SQL字符串拼接。在构建SQL查询字符串时,你直接将用户输入 query 字符串与其他SQL代码拼接在一起,这容易受到SQL注入攻击。这是一个严重的安全问题,应该避免使用字符串拼接构建SQL查询。未处理错误:[/xxx/tools/test/main.go:24] - G104 (CWE-703): 未处理错误。在HTTP服务器的启动代码中,错误没有被处理。你应该考虑捕获错误并采取适当的措施来处理它们,以提高代码的健壮性。

结论

gosec目前通过静态扫描方式,基本满足现有SQL注入场景的检测需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DL Homework 5

目录 习题4-1 对于一个神经元​编辑,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢。 习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N1,输入层大小为​编辑,输出层大…

python项目部署代码汇总:目标检测类、人体姿态类

一、AI健身计数 1、图片视频检测 (cpu运行): 注:左上角为fps,左下角为次数统计。 1.哑铃弯举:12,14,16 详细环境安装教程:pyqt5AI健身CPU实时检测mediapipe 可视化界面…

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视…

ORB-SLAM3算法3之TUM-VI开源数据集运行ORB-SLAM3生成轨迹并用evaluate_ate_scale验证

文章目录 0 引言1 TUM-VI数据下载2 ORB-SLAM3的TUM-VI示例2.1 纯单目的示例2.2 纯单目的验证2.3 纯双目的示例2.4 纯双目的验证2.5 单目和IMU的示例2.6 单目和IMU的验证2.7 双目和IMU的示例2.8 双目和IMU的验证0 引言 ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的…

Linux高级命令(扩展)

一、find命令 1、find命令作用 在Linux操作系统中,find命令主要用于进行文件的搜索。 2、基本语法 # find 搜索路径 [选项 选项的值] ... 选项说明: -name :根据文件的名称搜索文件,支持*通配符 -type :f代表普通文…

IP地址管理系统phpipam部署

IP地址管理系统phpipam部署 一、IPAM管理系统简介二、IPAM安装部署教程2.1 环境准备 三、phpIPAM web配置3.1 初始化3.2 WEB配置使用 四、IPAM管理和使用4.1配置dns4.2 配置ip网段4.3 配置ip地址自动扫描 一、IPAM管理系统简介 phpipam是一个开源Web IP地址管理应用程序&#…

Easy-Laser激光测平仪维修易激光对中仪E920

Easy-Laser激光对中仪常见故障:触摸屏损坏(屏碎,不显示,黑屏,蓝屏,无背光等),对中仪电路板损坏,对中仪接收装置电路板,对中仪发射控制装置电路板等均可维修。…

java使用 Base64 实现用户信息的加密与解密,相当于token

目录 1 问题2 实现1 问题 springboot 项目需要实现对用户的加密和解密 用户登陆之后,对用户信息进行加密存到cookie ,之后访问页面的时候,携带这个cokkie 到其他的页面,然后进行解密,只要cookie 过期,那么页面就访问不了 2 实现 1 实体类 用户信息的实体类 import co…

迅镭激光董事长颜章健荣膺“2023年如皋市科技强企人物”!

10月28日,2023如皋科技人才洽谈会开幕式在如皋隆重举行。江苏省科学技术厅副厅长、党组成员蒋洪,江苏省商务厅副厅长、党组成员孙津,中共南通市委副书记、政法委书记沈雷,中共如皋市市委书记何益军,中共如皋市委副书记…

目标检测与图像识别分类的区别?

目标检测与图像识别分类的区别 目标检测和图像识别分类是计算机视觉领域中两个重要的任务,它们在处理图像数据时有一些区别。 目标检测是指在图像中定位和识别多个目标的过程。其主要目标是确定图像中每个目标的边界框位置以及对应的类别标签。目标检测任务通常涉…

avi怎么转mp4?

avi怎么转mp4?如今市面上涌现了各种多样的视频格式,其中AVI作为一种音频视频交错格式,虽然使用较少但相对常见。它的优点在于占用空间较小,但画面质量并不是很出色。然而,AVI格式也存在一个明显的缺点,即兼…

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题 前言1. 新建项目2.配置maven依赖3.编写代码4.打jar包5.上传服务器6.代码中引用 前言 老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF类,然后直接实现evaluate()方法即可。 由于公司hive版本比较高(3.x&#x…

软件工程:小组开发过程技术(VS VSS UNIX C++)

(注:这个东西是2007年写的,算是个缅怀,或是个吐槽。所有注都是本次发布新加的。) 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序,实现在小组规模的初级开发过程。这不…

【EI会议征稿】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议(ICAACE 2024) 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议(ICAACE 2024)定于2024年1月26-28日在中国上海…

Android Framework 常见解决方案(24)去除 Android正在启动/Android is Starting 弹窗,直接进入Launcher

1 原理说明 开机以后,设备会有一个“android正在启动”这样的弹框,这个界面是一个叫FallbackHome的Activity来展示的。FallbackHome机制是Android系统启动过程中的一种降级处理机制。当系统启动时,如果默认的Launcher应用无法正常加载或出现…

HD.047 | 水文数据——全球植被数据集[V: VCI]

写在前面 植被作为影响联系土壤、大气、水分等地气要素的重要因素,其准确估算不仅对研究植被动态变化、植被物候过程具有重要意义,而且对于流域生态水文等方面具有十分重要的应用价值。目前已有大量全球植被数据产品,本期选取植被条件指数Vegetation Condition Index(VCI)…

这三种方法轻松实现Excel文档名翻译

在电脑使用中,我们常常需要批量修改文件名并翻译。这时候,我们可以使用“固乔文件管家”软件来轻松实现这一需求。下面就介绍三种方法,帮助你轻松实现Excel文档名翻译。 方法一:使用“固乔文件管家”软件批量修改文件名 1.安装并打…

云原生安全日志审计

记得添加,把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

Paper reading: segment anything in high quality NIPS2023

最近发展起来的SAM模型,表示分割模型的一个大的跃进,尤其是在零样本的能力和灵活提升方面。尽管利用1.1bollion的mask,SAM在掩码预测方面已经存在很大的问题,尤其是目标有着复杂结构的时候。 我们提出一个HA-SAM。 设计学习一个…

C# 如何使用 System.Text.Json 启用不区分大小写的属性名称

本文将介绍如何使用 System.Text.Json 命名空间启用不区分大小写的属性名称匹配。 不区分大小写的属性匹配 默认情况下,反序列化会查找 JSON 与目标对象属性之间区分大小写的属性名称匹配。 若要更改该行为,请将 JsonSerializerOptions.PropertyNameCa…