golang gorm框架的sql注入漏洞

keluda · 2020-06-27 18:32:50 · 7545 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-06-27 18:32:50 的文章,其中的信息可能已经有所发展或是发生改变。

最近的golang项目,orm框架选择的是gorm。今天开始做单元测试,顺便手动检查一下安全问题。结果发现gorm框架是直接拼接的sql语句。gorm框架在golang生态中的影响力非常大。在测试中发现这个问题也感觉比较意外。下面是执行测试的结果:

首先是where查询,在这里我使用的语句是api是Where("user_email=?", email),正常测试时,我输入的是随便一个字符串“dfks@qq.com”,生成的sql语句是:“SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL AND ((user_email='dfks@qq.com')) ORDER BY `users`.`id` ASC LIMIT 1”。如果不做安全方面的校验,这个生成的语句看上去没有任何问题。

下面我修改一下email的值为"dfks@qq.com' or '1'='1",然后调用这个api,生成的sql语句是:SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL AND ((user_email='dfks@qq.com' or '1'='1')) ORDER BY `users`.`id` ASC LIMIT 1.在这里,我在where后面调用的是first(gorm链式调用),所以最后生成的sql语句后面又limit1。可以看出,现在生成的语句是被sql注入了的。

后面我又测试了create api,直接传入的要创建的实体,结果依然生成了被注入的sql语句。时间问题,不再赘述。

软件开发接单,软件开发培训,QQ:2695827051


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:keluda

查看原文:golang gorm框架的sql注入漏洞

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7545 次点击  
加入收藏 微博
2 回复  |  直到 2020-06-28 09:29:29
PolarPanda611
PolarPanda611 · #1 · 5年之前

老哥 测试了一把,虽然日志打出来是 SELECT * FROM "test" WHERE (code = 'aaa' or '1'='1') ,但是这应该只是日志显示的问题,真正执行的where条件是 query => code args => "aaa' or '1'='1" 并没有返回数据的。 测试代码如下。 测试环境go1.14, gorm1.9.12 , postgres 12

package main

import (
    "fmt"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

type Test struct {
    Code string
}

func main() {
    db, _ := gorm.Open("postgres", "host=127.0.0.1 port=60901 user=test password=123456 dbname=test sslmode=disable")
    db.SingularTable(true)
    db.LogMode(true)
    db.AutoMigrate(&Test{})
    defer db.Close()
    user1 := Test{
        Code: "aaa",
    }
    db.FirstOrCreate(&user1)
    var test Test
    if err := db.Where("code = ?", "aaa' or '1'='1").Find(&test).Error; err != nil {
        fmt.Println(err)
    }

}

执行结果

(/Users/xxx/Documents/workspace/go/src/github.com/PolarPanda611/test/testgorm/main.go:25) 
[2020-06-27 23:01:00]  [0.34ms]  SELECT * FROM "test"  WHERE (code = 'aaa' or '1'='1')  
[0 rows affected or returned ] 
record not found
mlboy
mlboy · #2 · 5年之前

老哥看下这个:https://github.com/rushteam/gosql

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传