今天无意中发现了EF的一个注入漏洞:
public IQueryable<PostTag> ExistPostTags(int blogId, IEnumerable<string> tagNames)
{
return _PostTag.Where(p => p.BlogId == blogId && tagNames.Contains(p.Name));
}
其生成的sql语句如下:
SELECT
[Extent1].[TagID] AS [TagID],
[Extent1].[TagName] AS [TagName],
[Extent1].[BlogId] AS [BlogId],
[Extent1].[UseCount] AS [UseCount],
[Extent1].[CreateTime] AS [CreateTime]
FROM [dbo].[blog_Tag] AS [Extent1]
WHERE ([Extent1].[BlogId] = @p__linq__0) AND ([Extent1].[TagName] IN (N'store-generated', N'tag3'')) And ((''')) AND ([Extent1].[TagName] IS NOT NULL)
很明显地Contains方法生成的sql:IN(***),是直接拼接的,那么如此就存在了注入漏洞。
求大神,在线等。:)
你仔细看会发现.他会把单引号转义.并不是参数化查询才能解决注入
你觉得有注入漏洞,你注入一个看看啊。
并不需要大神,自己测试就够了。
不要激动,先注入了在发帖,并提交issues
当时我就震惊了,点进来发现是乌龙...
EF以前的版本,像你这个查询是会参数化,到了6.*版本就不是了,不知道是出于什么原因改成这样。不过LZ也不用担心,微软的人不傻的,他们肯定会处理好注入问题。
你注一下啊!
我看到标题也表示很震惊,然后马上进来看了一下。然后我就放心了
哈哈哈,大愚若智。
哇,无情打脸