Couchbase是一个相对较新的NoSql数据库。与任何其他新技术一样,它也伴随着一些安全问题。我花了相当多的时间来理解使用go-couchbase客户端库注入的风险。According to their documentation,我知道有可能形成模式和javascript注入攻击。然而,我不能形成任何令人讨厌的攻击。在Couchbase端,普通字符串值似乎没有被解析(Eval)。下面是我的示例:
cbbucket, err = cbpool.GetBucketWithAuth(bi.Name, bi.Name, bi.Password)
if err != nil {
fmt.Printf("Failed to connect to bucket %s %v", bi.Name, err)
return
}
input := `{"v1":"Malicous"}`
err = cbbucket.Set("k1", 0, input)
if err != nil {
fmt.Printf("set failed error %v", err)
return
}我假设,输入是攻击者可以操纵数据的点。但是,Couchbase中存储的是输入的无害(转义)版本。下面是DB中存储的值:
"{\"v1\":\"Malicous\"}"通过查看encoding/json包,我了解到go可以使用interface{}动态解析通用JSON对象。因此,我修改了我的开发代码如下:
cbbucket, err = cbpool.GetBucketWithAuth(bi.Name, bi.Name, bi.Password)
if err != nil {
fmt.Printf("Failed to connect to bucket %s %v", bi.Name, err)
return
}
input := `{"v1":"Malicous"}`
b := []byte(input)
var f interface{}
err := json.Unmarshal(b, &f)
err = cbbucket.Set("k1", 0, &f)
if err != nil {
fmt.Printf("set failed error %v", err)
return
}这一次成功地完成了利用。下面是存储在Couchbase中的恶意JSON对象:
{
"v1": "Malicous"
}嗯,这种开发并不那么令人兴奋……因为它确实需要开发人员盲目地解组用户输入并将其存储在数据库中。我想知道是否有其他更容易的开发技术,从字符串连接中派生出来,它不需要如此巨大的疏忽。
发布于 2015-08-13 02:38:12
对于像您这样通过键进行访问,Couchbase不会解析或验证写入数据库的值。这是一个应用程序端函数。只要值的格式是Couchbase Server能够理解的,它就会被写为该对象的值。
https://stackoverflow.com/questions/31970422
复制相似问题