思路:从URL获取参数,使用原生SQL语句访问数据库
参数是SQL delete语句(理想执行的语句SELECT * FROM users WHERE id = (DELETE FROM mytable WHERE 1=1);)
controllers
func (m *MyTestController) GetSQLInjectionTest() {
p := m.Ctx.Input.Params() //Params是解析多个参数,返回map
for k, v := range p {
m.Ctx.WriteString(k + "=" + v + "\n")
models.SQLInjectionTest(v)
}
}
models
//SQL Injection Test
func SQLInjectionTest(Tableid string) {
o := orm.NewOrm()
var maps []orm.Params
num, err := o.Raw("SELECT * FROM users WHERE id = ?", Tableid).Values(&maps)
if err == nil {
for _, term := range maps {
fmt.Println(term["id"], ":", term["name"])
}
} else {
fmt.Println("MysqlOriginallySelect error")
}
fmt.Println("num =", num)
fmt.Println("err =", err)
}
然后发现行不通,同事跟我说有两个原因,一个是框架把这语句过滤掉了,还有一个我现在用的是MYSQL8.0,版本比较新,自己试SQL语句的时候都报错,子查询是没问题的