C# 如何使用实体框架核心在多个表上执行原始UNIONSQL查询
我正在为一个CTF竞赛编写一个带有故意实施的漏洞的web应用程序,我正在使用ASP.NET核心和实体框架核心以及SQLite数据库。我想让SQL注入成为可能,为了实现这一点,我需要使用union语句在多个表上查询数据库 不幸的是,我所有的尝试都导致了错误消息。后端控制器通过ajax请求获取一个参数,客户端应该误用UserId变量并修改ajax请求中的参数,以获得关于另一个表的更多信息 我尝试了几种FromSql方法,但都没有成功。有人知道我怎么解决这个问题吗 这是后端控制器代码C# 如何使用实体框架核心在多个表上执行原始UNIONSQL查询,c#,ajax,sqlite,entity-framework-core,C#,Ajax,Sqlite,Entity Framework Core,我正在为一个CTF竞赛编写一个带有故意实施的漏洞的web应用程序,我正在使用ASP.NET核心和实体框架核心以及SQLite数据库。我想让SQL注入成为可能,为了实现这一点,我需要使用union语句在多个表上查询数据库 不幸的是,我所有的尝试都导致了错误消息。后端控制器通过ajax请求获取一个参数,客户端应该误用UserId变量并修改ajax请求中的参数,以获得关于另一个表的更多信息 我尝试了几种FromSql方法,但都没有成功。有人知道我怎么解决这个问题吗 这是后端控制器代码 public J
public JsonResult ListImagePaths(string UserId)
{
string query = $"SELECT * FROM UserImage WHERE UID == {UserId}";
var results = mContext.UserImage.FromSql(query);
return Json(results);
}
这样,我只对UserImage表执行查询。我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的数据库集,但这也不起作用
这是客户端ajax请求
$(document).ready(function () {
$.ajax({
type: 'GET',
url: 'ListImagePaths/"27b988e3-77ab-41e4-b945-6ac9315a70ec"',
success: function (result){
console.log(result)
}
})
})
下面是UserImage表的一个示例
Uid=27b988e3-77ab-41e4-b945-6ac9315a70ec
Path=CloudImages/picture.jpg
Id=e802a368-229f-4ed5-ba84-42ce4da5ed0a
下面是AspNetUsers表的示例
Id=81858e0d-e75f-45c5-8054-ef956e843a04
用户名=SomeGuy43
NormalizedUserName=SOMEGUY43
电子邮件=myemail@somehere.com
正常化电子邮件=MYEMAIL@SOMEWHERE.COM
电子邮件确认=1
PasswordHash=uRGWeGWq5ZorrzgNvSuz8Q==
SecuritySamp=RBCZDCBA3IEMPET2ZCL4MVCXW3IA3H4C
并发amp=0b8873cc-ecfe-4280-a6bf-0f354242f4a4
PhoneNumber=NULL
PhoneNumberConfiged=0
TwoFactorEnabled=0
LockoutEnd=0
LockoutEnabled=0
AccessFailedCount=0
AvatarImage=pictures/avatar.jpg
盐=4r10cC
IsAdmin=0尝试此查询:
string query = $"SELECT * FROM UserImage WHERE UID == convert(UNIQUEIDENTIFIER, convert(varchar(max),{UserId}))";
我想强调的是,使用*是不符合性能的,最好使用列
我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的数据库集,但这也不起作用
不确定到底是什么不起作用,但这是一条路要走。但是,与其创建包含公共属性的类的DbSet,从而告诉EF要处理的是一个实体,不如创建DbQuery,或者简单地将该类注册为
例如:
public class MyQueryType
{
public Guid Id { get; set; }
publc string Text { get; set; }
}
在DbContext类中,执行以下操作之一:
public DbQuery<MyQueryType> MyQueryType { get; set; }
两者都允许您将MyQueryType用作FromSql的目标:
只需确保SQL查询使用如上所示的别名返回预期的列名和类型。我相信您可以将.Include放在FromSql之前,以包含相关表?我正在尝试使用.Include。var results=mContext.UserImage.Include u=>u.UsersFromSqlquery;但我只能访问UserImage表的属性@如果应用程序应该允许SQL injection,请提供要合并的表的示例。e、 至少有两个代表表的实体类示例。我编辑了文章并添加了两个示例。但它们没有任何共同之处——它们更像是JOIN而不是UNION的候选对象。我希望看到您在中使用的类。我尝试创建一个包含两个表中的属性的数据库集,即两个实体类和具有公共属性的类。我应该为UNIQUEIDENTIFIER选择什么?FromSql方法不允许查询特定列。。。这就是我为什么使用*非常感谢!这终于奏效了。我松了一口气。
modelBuilder.Query<MyQueryType>();
string query = $"SELECT Id, Path AS Text FROM UserImage WHERE UID == {UserId}"
+ $" UNION ALL SELECT Id, UserName AS Text FROM AspNetUsers";
var results = mContext.Query<MyQueryType>().FromSql(query);