Go语言代码安全审计分享

幸运草
幸运草
幸运草
896
文章
3
评论
2020年4月10日21:40:47Go语言代码安全审计分享已关闭评论 266

Go语言主要用作服务器端开发语言,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。Go语言是强类型语言,它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。

由于Go语言代码审计资料较少,这里就把最近学习的对Vulnerability-goapp项目的审计过程分享一下。整个审计过程结合代码安全扫描工具和人工审计,期间也发现代码安全审计工具的漏报误报问题,以下将会细述。

审计对象

经过在github上查找,发现https://github.com/Snow-HardWolf/Vulnerability-goapp这个项目适合入门,涵盖了常见的go web安全漏洞。Gitclone之后在goland IDE里打开看到如下项目结构:

Go语言代码安全审计分享

Asserts目录是静态资源文件,跳过。

Pkg目录是使用go实现的业务逻辑代码,重点关注。

Runenv是数据库配置文件和生成数据库的脚本,简单看下就好。

Trap目录是一个CSRF漏洞的演示,重点关注。

Views目录是前端视图页面,简单看下就好。

代码安全扫描

首先我们使用代码安全扫描工具扫描,发现4类高危,2类中危漏洞,我们分别进行验证。

命令注入-数据流分析

在pkg/admin/admin.go的52行发现命令注入,直观可以看出取出cookie的内容拼接命令语句执行。

Go语言代码安全审计分享

Go语言代码安全审计分享

我们看一下污点跟踪过程:

Go语言代码安全审计分享

我们通过污点跟踪分析过程可以确认这是一个高危漏洞。

接下来在实际环境中演示一下,通过nc接收数据确认可执行shell命令。

Go语言代码安全审计分享

不安全的传输—语义分析

在main.go的156行,使用了http协议进行通信,存在明文传输数据的问题

Go语言代码安全审计分享

秘钥硬编码-代码结构分析

在asserts/js/bootstrap.bundle.js文件的360行发现秘钥硬编码,不过人工确认这里不是秘钥,是工具的误报

Go语言代码安全审计分享

用户隐私泄露-数据流分析

在pkg/admin/admin.go的86行检测到用户隐私泄露,这里看到直接把用户输入的密码打印到控制台了,是一种不安全的处理方式。

Go语言代码安全审计分享

cookie未启用httponly-代码结构分析

在pkg/admin/admin.go的110行检测到cookie未启用httponly,低危漏洞。

Go语言代码安全审计分享

不安全的随机数-代码结构分析

在asserts/js/bootstrap.bundle.js文件的135行发现使用了伪随机数,不过这个漏洞可以忽略,危害太小了。

Go语言代码安全审计分享

人工代码审计

经过对代码扫描工具识别出的漏洞进行分析,我们发现存在一些误报,那么是否存在漏报呢,毕竟我们工具的扫描规则只有400多条,我们接下来通过人工分析代码发现可能存在的漏报

XSS-数据流分析

在pkg/post/post.go里我们发现Posts结构体,内有Uids、UserPosts、Created_at、UserImages结构体变量,猜测这里跟论坛发帖有关,我们人工进行一下污点数据跟踪分析:

通过ShowAddPostPage的post请求传入帖子内容写入数据库,然后通过ShowAddPostPage的get请求读出数据库内容写入前端页面,整个过程没有做特殊字符的净化处理,可以确定这里存在存储XSS中危漏洞。

Go语言代码安全审计分享

我们在实际环境演示一下漏洞:

输入xss payload保存后再次刷新页面触发xss弹框

Go语言代码安全审计分享

Go语言代码安全审计分享

反射xss低危漏洞分析过程类似,不再重复描述。

Sql注入-数据流分析

在pkg/search/search.go里我们发现searchPosts方法,sql查询是直接拼接sql语句:

Go语言代码安全审计分享

在拼接前并未对用户输入做净化处理,因此可确认这是一个sql注入的高危漏洞。

我们在实际环境中演示一下这个问题:

Go语言代码安全审计分享

Go语言代码安全审计分享

Csrf-代码结构分析

对于CSRF的分析我找了两处写数据库的接口进行尝试,一个接口是存在csrf,一个接口不存在csrf,首先看修改密码的接口:

在pkg/user/usermanager.go里我们发现ConfirmPasswdChange方法,不过这里进行了referer()的检查,在实战中referer校验虽然不像加token那样可以完全避免csrf,但伪造referer成本较高,所以这里不作为审计发现漏洞。

Go语言代码安全审计分享

而在另一个更新用户个人信息的方法里却忽视了对referer的校验,可以确认存在csrf漏洞。

Go语言代码安全审计分享

我们在实际环境中进行演示确实存在csrf漏洞。

Go语言代码安全审计分享

任意文件上传-数据流分析

在pkg/image/imageUploader.go里发现处理上传文件的方法,没有对文件名和文件内容进行校验

Go语言代码安全审计分享

可以上传任意文件,不过由于web路由的限制好像解析不了go语言代码,解析静态资源文件是可以的,这里尝试着目录穿越写文件到其他目录。

以下在实际环境中进行漏洞演示:

Go语言代码安全审计分享

利用条件挺苛刻,需要等着重启crontab服务,加载定时任务

Go语言代码安全审计分享

越权-数据流分析

以pkg/user/usermanager.go为例来看,这里的功能是展示用户个人信息,通过取出cookie里的uid在数据库进行查询得到用户基本信息,在查询前有对cookie的有效性进行校验,避免修改cookie实现水平越权。

Go语言代码安全审计分享

CheckSessionId里有一个ValidateCorrectCookie的方法校验cookie

Go语言代码安全审计分享

ValidateCorrectCookie通过将用户输入的cookie和后台数据库存储的信息进行比对,如发现uid被篡改就返回404页面。

Go语言代码安全审计分享

经过在实际环境验证,在读写操作数据库操作前使用cookie.CheckSessionID()对cookie做校验是不会存在越权问题,而这个安全校验一旦去掉,越权问题就出现了。

服务器敏感信息泄露-代码结构分析

数据库异常,go的异常都有捕获在服务端打印log,没有向前端web页面返回,web页面报错统一跳转自定义404页面,服务器敏感信息泄露问题不存在。

如下是main.go里统一的记录http异常日志的代码:

Go语言代码安全审计分享

不安全配置-配置文件分析

web路由配置正常,没有引用不安全的第三方库。

资源泄露、空指针分析-控制流分析

数据库、文件等资源文件使用完成后及时释放,未发现异常的控制流。

Go语言代码安全审计分享

总结

本次审计经过语义分析、数据流分析、代码结构分析、配置文件分析和控制流分析,共审计14类常见安全漏洞,发现存在10类漏洞,另外4类漏洞确认不存在,汇总信息如下:

Go语言代码安全审计分享

目前代码安全扫描工具存在对golang的规则数量比较少,存在漏报问题,另外还有一定的误报,仍有比较大的优化提升空间。

特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

转载请注明:{{title}}-变化吧
  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 赞助本站
  • 支付宝扫一扫
  • weinxin
幸运草
Go语言中的常量 函数代码

Go语言中的常量

1 概述 常量,一经定义不可更改的量。功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率。从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改。例如当前处理器的架构...
Go语言的接口 函数代码

Go语言的接口

Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明...
Go语言支持的正则语法 函数代码

Go语言支持的正则语法

1 字符 语法 说明 . 任意字符,在单行模式(s标志)下,也可以匹配换行 字符类 否定字符类 d Perl 字符类 D 否定 Perl 字符类 ASCII 字符类 否定 ASCII 字符类 pN U...
Go语言的包管理 函数代码

Go语言的包管理

1 概述 Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。 2 main包 Go 语言的入口 main() 函数所在的包(pa...