Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
У нас прошел интересный SQL injection, мы поняли что имя поля Comment в базе атакующему известно, и в это поле еще с формы хакер передал некий SQL-скрипт, который проапдейтил таблу NewHotel и добавил к каждой записи в поле Cоmment то что хотел.

Структура таблы такая
CREATE TABLE [dbo].[NewHotel](
	[i] [int] IDENTITY(1,1) NOT NULL,
	[UserID] [uniqueidentifier] NOT NULL,
	[Date] [datetime] NOT NULL,
	[Country] [nvarchar](50) NULL,
	[NewCountry] [nvarchar](250) NULL,
	[NewCity] [nvarchar](250) NULL,
	[NewKurort] [nvarchar](250) NULL,
	[NewOtel] [nvarchar](250) NULL,
	[Comment] [nvarchar](max) NULL,
 CONSTRAINT [PK_NewHotel] PRIMARY KEY CLUSTERED 
(
	[i] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

А структура процы такая
ALTER procedure [dbo].[AddNewHotel]
@UserName nvarchar(50),
@CountryID nvarchar(50) = NULL,
@NewCountry nvarchar(250) = NULL,
@NewCity nvarchar(250) = NULL,
@NewKurort nvarchar(250)= NULL,
@NewOtel nvarchar(250)= NULL,
@Comment nvarchar(max) = NULL
as
INSERT [NewHotel]([UserID],[Date],[Country],[NewCountry],[NewCity],[NewKurort],[NewOtel],[Comment])
select vw_aspnet_MembershipUsers.UserID, GetDate(),@CountryID,@NewCountry,@NewCity,@NewKurort, @NewOtel, @Comment
from vw_aspnet_MembershipUsers WITH(NOLOCK)
where vw_aspnet_MembershipUsers.UserName=@UserName 

Но мы так и не сумели придумать как он сумел закруглить команду, чтобы не выполнялась клауза WHERE (потому что он проапдейтил таблу по ПОЧТИ всем юзерам). И очевидно что ему неизвестно имя таблы. Какже это у него получилось? Ведь даже если он сумел завершить команду, то Update без имени таблы невозможен?
24 фев 15, 14:14    [17305184]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
может стоит руки разработчикам поотбивать ? И применить паяльник для поиска виновных ?
24 фев 15, 14:17    [17305203]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Glory
Member

Откуда:
Сообщений: 104760
bg1
Но мы так и не сумели придумать как он сумел закруглить команду, чтобы не выполнялась клауза WHERE (потому что он проапдейтил таблу по ПОЧТИ всем юзерам).

Команда INSERT не может проапдейтить существующий записи
24 фев 15, 14:18    [17305212]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Glory
bg1
Но мы так и не сумели придумать как он сумел закруглить команду, чтобы не выполнялась клауза WHERE (потому что он проапдейтил таблу по ПОЧТИ всем юзерам).

Команда INSERT не может проапдейтить существующий записи


Чтобы сделать инекцию, закрывают кавычку и далее пишут любую команду

"'; '; UPDATE SET COMMENT = ''asdasdsa''
from vw_aspnet_MembershipUsers WITH(NOLOCK)
"
Он должен был знать больше, чем поле COMMENT

Проблема вашего кода, что у вас не эскейпятся и не энкодятся кавычки
24 фев 15, 14:25    [17305265]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
Хакер проапдейтил самое тупое место, которое вообще можно было найти на наших восьми юнитах серверов. Ублюдок нашел на одном сайте одну таблицу для соообщений администрации о багах сайта (которую вообще может увидеть только собственно разработчик и администратор сайта). Это конечно, полный треш, но как он сумел это сделать?

К сообщению приложен файл. Размер - 83Kb
24 фев 15, 14:25    [17305267]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
bg1,
Может вам проштудировать матчасть как следует.

https://ru.wikipedia.org/wiki/?????????_SQL-????

Защита от инъекций -- это правильная параметризация.
24 фев 15, 14:28    [17305288]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
bg1, сочувствуем вам.

так а лог команд пришедших с сайта есть? там бы и посмотрели.

Да он просто поставил много кавычек в поле коммент и потом написал

update newhotel set ...

а название таблицы из имени процедуры - так и следует.

так что долбите ваш контролл с комментарием с формы или его обработку.

К сообщению приложен файл. Размер - 3Kb
24 фев 15, 14:29    [17305294]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
a_voronin
Чтобы сделать инекцию, закрывают кавычку и далее пишут любую команду

"'; '; UPDATE SET COMMENT = ''asdasdsa''
from vw_aspnet_MembershipUsers WITH(NOLOCK)
"

Через процедуру с пареметром и команду select ??
24 фев 15, 14:30    [17305299]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin,

Инекции возможны там, где запросы пишут вот так

statement := 'SELECT * FROM users WHERE name = "' + userName + '";';

Или даже так

statement := Format('SELECT * FROM users WHERE id = %0:d;', [id_int]);

А надо правильно параметризовать запросы
                   using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = conn;
                        cmd.CommandText =
                            @"
                        INSERT INTO [Logging].[RecordSetsLog]
                                   ([ReportSnapshotID]
                                   ,[DateTaken]
                                   ,[N_Rows]
                                   ,[N_Row_Headers]
                                   ,[N_Columns]
                                   ,[N_Column_Headers])
                             VALUES
                                   (@ReportSnapshotID
                                   ,GETDATE()
                                   ,@N_Rows
                                   ,@N_Row_Headers
                                   ,@N_Columns
                                   ,@N_Column_Headers);

                        SELECT SCOPE_IDENTITY();

                        ";

                        cmd.Parameters.AddWithValue("@ReportSnapshotID", reportSnapshot_ID);
                        cmd.Parameters.AddWithValue("@N_Rows", table.Rows.Count);
                        cmd.Parameters.AddWithValue("@N_Row_Headers", startColumn - 1);
                        cmd.Parameters.AddWithValue("@N_Columns", endColumn - startColumn + 1);
                        cmd.Parameters.AddWithValue("@N_Column_Headers", 0);

                        recordSetsLog_ID = cmd.ExecuteScalar();
                    }
24 фев 15, 14:32    [17305317]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Maxx,

посмотрите картинку постом выше, там еще подпись есть я её приводить не стал.
думаю что сами понимаете по каким соображениям.

что дело в ковычке - 146% - это я вам к4ак хакер проапдейтивший таблицу говорю. :D
24 фев 15, 14:33    [17305324]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Maxx
a_voronin
Чтобы сделать инекцию, закрывают кавычку и далее пишут любую команду

"'; '; UPDATE SET COMMENT = ''asdasdsa''
from vw_aspnet_MembershipUsers WITH(NOLOCK)
"

Через процедуру с пареметром и команду select ??


из поста ТС пока непонятно как они её вызывают.

Не исключено, что так

Command = 'EXEC procedure [dbo].[AddNewHotel] @Comment = ' + Comment + ''''
24 фев 15, 14:34    [17305332]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
автор
а лог команд пришедших с сайта есть
- лог ведется только с IIS - ну так там только GET-параметры, а не POST пишутся, ну даже этот лог астрономического размера (хотя я его регшулярно чищу) - сейчас он 21-гигабайт. Его и посмотреть нечем. И смысл его смотреть - ну разве что айпишники там можно увидеть.

К сообщению приложен файл. Размер - 42Kb
24 фев 15, 14:36    [17305344]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
автор
из поста ТС пока непонятно как они её вызывают
- вызывается вот так
    <asp:SqlDataSource ID="AddNewHotel" runat="server" ConnectionString="<%$ ConnectionStrings:SQLServer_ConnectionStrings %>"
        SelectCommand="AddNewHotel" SelectCommandType="StoredProcedure">
        <SelectParameters>
            <asp:Parameter Name="UserName" Type="String" />
            <asp:Parameter Name="CountryID" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewCountry" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewCity" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewKurort" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewOtel" Type="String" DefaultValue="0" />
            <asp:ControlParameter ControlID="txComment" DefaultValue="" Name="Comment" 
                PropertyName="Text" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>
24 фев 15, 14:39    [17305372]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
bg1
автор
а лог команд пришедших с сайта есть
- лог ведется только с IIS - ну так там только GET-параметры, а не POST пишутся, ну даже этот лог астрономического размера (хотя я его регшулярно чищу) - сейчас он 21-гигабайт. Его и посмотреть нечем. И смысл его смотреть - ну разве что айпишники там можно увидеть.


Эти логи хорошо грузятся в базу через Import
24 фев 15, 14:40    [17305385]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
bg1,

да к гадалке не ходите вы там увидите что-то вроде:

exec proc NEWHOTEL 'a', 'б', 'коммент' update Table1 set Comment = 'оло-ло'


Вам же говорят как поступить. разберитесь с инекцией.
24 фев 15, 14:41    [17305392]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Jaffar, ) ну если так просиды вызывать - то нахрена парметры то делать ? )
create table dbo.test1(x nvarchar(256))
GO
alter proc dbo.test2 (@x nvarchar(256))
as insert into dbo.test1 select @x
GO
declare @x nvarchar(2000)
set @x = 'exec dbo.test2 @x = ' +'''xx''; insert into dbo.test1 (x) select top 1 name from sys.all_objects;'
EXEC(@x)
select * from dbo.test1
GO
drop table dbo.test1
GO
drop proc dbo.test2
GO
24 фев 15, 14:44    [17305417]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
bg1,

вы не вызов показали - а передачу параметров с сайта.
а как это добро потом парситься и выполняется?!!


Решение простое: создать юзера, которому дать доступ только на выполнение этой процедуры - все остальное - запретить.
тогда все эти иньекции не пройдут.
24 фев 15, 14:44    [17305426]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Maxx,

да кто этих студентов знает, чего они там накодили.
суть то одна - иньекция - это тема со скобкой.

простое решение : опсисано в посте выше. юзер с сотв. грантами и все.
24 фев 15, 14:47    [17305452]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
автор
вы не вызов показали - а передачу параметров с сайта.
а как это добро потом парситься и выполняется?!!

Ну ежу понятно, что никак - просто проверка аутентификации и запись в базу. Это сообщение о БАГАХ сайта, которое может в конечном итоге увидеть только разработчик сайта и админ. Поэтому эта форма предельно простая.
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If User.Identity.IsAuthenticated Then
            AddNewHotel.SelectParameters("UserName").DefaultValue = User.Identity.Name
            AddNewHotel.Select(New DataSourceSelectArguments)
            MultiView1.ActiveViewIndex = 1
        Else
            'должно ловиться еще в лоаде
            Response.Redirect(Votpusk.[GoTo].WarningPage)
        End If
    End Sub
24 фев 15, 14:48    [17305463]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
bg1
автор
из поста ТС пока непонятно как они её вызывают
- вызывается вот так
    <asp:SqlDataSource ID="AddNewHotel" runat="server" ConnectionString="<%$ ConnectionStrings:SQLServer_ConnectionStrings %>"
        SelectCommand="AddNewHotel" SelectCommandType="StoredProcedure">
        <SelectParameters>
            <asp:Parameter Name="UserName" Type="String" />
            <asp:Parameter Name="CountryID" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewCountry" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewCity" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewKurort" Type="String" DefaultValue="0" />
            <asp:Parameter Name="NewOtel" Type="String" DefaultValue="0" />
            <asp:ControlParameter ControlID="txComment" DefaultValue="" Name="Comment" 
                PropertyName="Text" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>


Ну здесь ребята защита всё-таки есть. А он мог этот скрипт скачать с сервера. У вас по IIS защита от скачивания скриптов стоит?


Что у вас в CodeBehind на сервере
runat="server" 
?

Почитайте здесь
https://msdn.microsoft.com/en-us/library/ff647397.aspx
24 фев 15, 14:51    [17305487]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
автор
А он мог этот скрипт скачать с сервера. У вас по IIS защита от скачивания скриптов стоит?

Какой скрипт, откуда? Это же БЕЙСИК!!! Это же видно из приведенного выше кода.
Все что существует на сервере - выглядит вот так:

К сообщению приложен файл. Размер - 30Kb
24 фев 15, 14:58    [17305540]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
bg1
автор
А он мог этот скрипт скачать с сервера. У вас по IIS защита от скачивания скриптов стоит?

Какой скрипт, откуда? Это же БЕЙСИК!!! Это же видно из приведенного выше кода.
Все что существует на сервере - выглядит вот так:


aspx файл мог он скачать?
24 фев 15, 14:59    [17305550]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Попробуйте сами что-то такое

www.vulnerablesite.com/gallery.aspx?id=10 and 1=convert(int,(select top 1 admin_username from admin_table))

Read more: http://www.101hacker.com/2012/01/hacking-aspaspx-websites-sql-injecton.html#ixzz3SfB87iuM
24 фев 15, 15:02    [17305570]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
Jaffar
Member

Откуда:
Сообщений: 633
a_voronin,



Вы с автором не о том думаете.

Я же писал выше - создайте логин дайте ему строго ограниченные потребностями права, все остальное DENY.
24 фев 15, 15:03    [17305580]     Ответить | Цитировать Сообщить модератору
 Re: Sql Injection  [new]
bg1
Member

Откуда:
Сообщений: 42
это простое asp.net, не MVC - никакого aspx на сервере не существует в природе
именно для этого я и запостил вызов процы через sqldatasource (которую в голову никому не придет применять в MVC, ибо там все делается на dbml)
на сервере существует только то, что вы видите на скрине выше
24 фев 15, 15:05    [17305592]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить