Go语言主要用作服务器端开发语言,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。Go语言是强类型语言,它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。
由于Go语言代码审计资料较少,这里就把最近学习的对Vulnerability-goapp项目的审计过程分享一下。整个审计过程结合代码安全扫描工具和人工审计,期间也发现代码安全审计工具的漏报误报问题,以下将会细述。
审计对象经过在github上查找,发现https://github.com/Snow-HardWolf/Vulnerability-goapp这个项目适合入门,涵盖了常见的go web安全漏洞。Gitclone之后在goland IDE里打开看到如下项目结构:
Asserts目录是静态资源文件,跳过。
Pkg目录是使用go实现的业务逻辑代码,重点关注。
Runenv是数据库配置文件和生成数据库的脚本,简单看下就好。
Trap目录是一个CSRF漏洞的演示,重点关注。
Views目录是前端视图页面,简单看下就好。
代码安全扫描首先我们使用代码安全扫描工具扫描,发现4类高危,2类中危漏洞,我们分别进行验证。
命令注入-数据流分析在pkg/admin/admin.go的52行发现命令注入,直观可以看出取出cookie的内容拼接命令语句执行。
我们看一下污点跟踪过程:
我们通过污点跟踪分析过程可以确认这是一个高危漏洞。
接下来在实际环境中演示一下,通过nc接收数据确认可执行shell命令。
不安全的传输—语义分析
在main.go的156行,使用了http协议进行通信,存在明文传输数据的问题
秘钥硬编码-代码结构分析
在asserts/js/bootstrap.bundle.js文件的360行发现秘钥硬编码,不过人工确认这里不是秘钥,是工具的误报
用户隐私泄露-数据流分析
在pkg/admin/admin.go的86行检测到用户隐私泄露,这里看到直接把用户输入的密码打印到控制台了,是一种不安全的处理方式。
cookie未启用httponly-代码结构分析
在pkg/admin/admin.go的110行检测到cookie未启用httponly,低危漏洞。
不安全的随机数-代码结构分析
在asserts/js/bootstrap.bundle.js文件的135行发现使用了伪随机数,不过这个漏洞可以忽略,危害太小了。