Как выполнить необработанный SQL-запрос объединения для нескольких таблиц с помощью Entity Framework Core - PullRequest
0 голосов
/ 06 апреля 2019

Я программирую веб-приложение с преднамеренно реализованными уязвимостями для конкуренции 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
Path = CloudImages / picture.jpg
Id = e802a368-229f-4ed5-ba84-42ce4da5ed0a

Вот пример таблицы AspNetUsers

Id = 81858e0d-e75f-45c5-8054-ef956e843a04
UserName = SomeGuy43
NormalizedUserName= SOMEGUY43
E-mail = myemail@somehere.com
NormalizedEmail = 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
АватарImage = pictures / avatar.jpg
Соль = 4r1rtuji0cc
IsAdmin = 0

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Я не нашел способа запросить две таблицы.Я пытался создать DbSet, который состоит из атрибутов в обеих таблицах, но это тоже не сработало.

Не уверен, что именно "не сработало", но это путь.Но вместо создания DbSet класса, содержащего общие атрибуты, таким образом, указание EF для обработки является сущностью , создайте DbQuery или просто зарегистрируйте этот класс как тип запроса .

Например:

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 возвращает ожидаемые имена и типы столбцов, используя псевдонимы, как показано выше.

0 голосов
/ 06 апреля 2019

Попробуйте этот запрос:

string query = $"SELECT * FROM UserImage WHERE UID == convert(UNIQUEIDENTIFIER, convert(varchar(max),{UserId}))";

Хочу подчеркнуть, что использование * нецелесообразно *, лучше использовать столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...