我正在为一个Web应用程序编写程序,该程序具有针对CTF竞争的故意实现的漏洞,并且我将ASP.NET Core和Entity Framework Core与SQLite数据库一起使用。我想使SQL注入成为可能,为此,我需要以某种方式用并集语句查询多个表上的数据库。
不幸的是,我的所有尝试都导致错误消息。后端控制器通过ajax请求接受参数,并且客户端应滥用UserId
变量并修改ajax请求中的参数以获取有关另一个表的更多信息。
我尝试了几种FromSql
方法,但都没有解决。有人知道我该怎么解决吗?
这是后端控制器代码
public JsonResult ListImagePaths(string UserId)
{
string query = $"SELECT * FROM UserImage WHERE UID == {UserId}";
var results = mContext.UserImage.FromSql(query);
return Json(results);
}
这样,我只对UserImage
表进行查询。我没有找到查询两个表的方法。我尝试创建一个由两个表中的属性组成的DbSet
,但这也不起作用。
这是客户端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
路径= 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
EmailConfirmed = 1
PasswordHash = uRGWeGWq5ZorrzgNvSuz8Q ==
SecuritySamp = RBCZDCBA3IEMPET2ZCL4MVCXW3IA3H4C
ConcurrencyStamp = 0b8873cc-ecfe-4280-a6bf-0f354242f4a4
PhoneNumber = NULL
PhoneNumberConfirmed = 0
TwoFactorEnabled = 0
LockoutEnd = 0
LockoutEnabled = 0
AccessFailedCount = 0
AvatarImage =图片/avatar.jpg
盐= 4r1rtuji0cc
IsAdmin = 0
答案 0 :(得分:1)
我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的DbSet,但这也行不通。
不知道到底是什么“没用”,但这是要走的路。但是,与其创建包含公用属性的类的DbSet
,而不是告诉EF对待一个实体,而是创建DbQuery
或简单地将该类注册为query type
例如:
public class MyQueryType
{
public Guid Id { get; set; }
publc string Text { get; set; }
}
在您的DbContext
类中,或者:
public DbQuery<MyQueryType> MyQueryType { get; set; }
或(在OnModelCreating
内部覆盖):
modelBuilder.Query<MyQueryType>();
两者都将允许您将MyQueryType
用作FromSql
的目标:
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);
只需使用上面显示的别名确保SQL查询返回预期的列名和类型。
答案 1 :(得分:0)
尝试此查询:
string query = $"SELECT * FROM UserImage WHERE UID == convert(UNIQUEIDENTIFIER, convert(varchar(max),{UserId}))";
我想强调的是,使用*并不是很好,*最好使用列。