Письмом Министерства строительства и жилищно-коммунального хозяйства РФ от 01.07.2019 N 23537-СН/04 «Об индивидуальном приборе учета» (далее — Письмо Минстроя РФ от 01.07.2019 N 23537-СН/04) разъяснен порядок определения платы за коммунальные ресурсы при выходе из строя приборов, входящих в состав индивидуального прибора учета (далее — ИПУ).
ИПУ является не только один измерительный прибор, но и совокупность средств измерения и дополнительного оборудования, установленных в жилом или нежилом помещении в многоквартирном доме (п.2 Правил предоставления коммунальных услуг собственникам и пользователям помещений в многоквартирных домах и жилых домов, утвержденных постановлением Правительства Российской Федерации от 06.05.2011 N 354 (далее — Правила).
Следовательно, в состав ИПУ могут входить:
— несколько измерительных устройств, которые учитывают объем коммунального ресурса в каждой комнате жилого или нежилого помещения;
— дополнительное оборудование, обеспечивающее работу нескольких измерителей в единой цепи.
Как взл@мать только по IP адресу! | Кибербезопасность | Dimon Dev
ИПУ считается вышедшим из строя, если сломался или закончился срок эксплуатации хотя бы у одного из измерителей.
В случае выхода из строя измерителей или дополнительного оборудования ИПУ расчет за коммунальную услугу должен производиться исходя из (пп.»а» п.59 Правил):
— среднемесячного объема потребления коммунального ресурса за первые 3 месяца;
— норматива потребления коммунальной услуги в последующем.
Акт о вводе в эксплуатацию ИПУ, состоящего из нескольких измерителей, составляется на прибор в целом, а не на каждый измеритель в отдельности.
Таким образом, в случае наличия в жилом или нежилом помещении многоквартирного дома ИПУ, состоящего из нескольких измерителей и дополнительного оборудования, вам необходимо проверить работоспособность и соблюдение межповерочного интервала каждого измерителя.
В случае неисправности одного или нескольких вычислителей в составе ИПУ плату за коммунальный ресурс необходимо начислять по среднемесячным показаниям.
Письмо Минстроя РФ от 01.07.2019 N 23537-СН/04 официально не опубликовано.
Напоминаем, что письма министерств и ведомств не являются нормативными актами. Содержащаяся в них информация не подлежит обязательному исполнению.
При разрешении спорных ситуаций рекомендуем вам руководствоваться нормами закона.
Источник: cntd.ru
[Квест] Как хакнуть форму? Sql инъекции.
Эта статья является статьёй-квестом. Мы желаем вам успехов в его прохождении. Итоги вашего прохождения будут опубликованы позже (следите за новостями в соц. сетях), а также всем прошедшим в дальнейшем будет выслан инвайт для регистрации на сайте.
Ставьте лайки, делитесь с друзьями и коллегами, репостите в соц.сетях.
Как вычислить человека по ip
Все программисты читали или по крайней мере слышали о методах взлома безопасности веб-сайта. Или даже столкнулись с этой проблемой. С другой стороны, бесконечна фантазия тех, кто хочет сломать сайт, поэтому все узкие места должны быть хорошо защищены. Вот почему я хотел бы начать серию коротких статей, где будут представлены основные методы и приемы взлома веб-сайтов.
В первой статье я хотел бы описать и разъяснить некоторые общие методы взлома одного из самых уязвимых частей сайта — форм. Я буду подробно останавливаться на том, как использовать эти методы и как предотвратить атаки, а также расскажу о тестировании безопасности.
SQL инъекции
SQl-инъекция — это такая техника, когда злоумышленник вводит команды SQL в input поле на веб-странице. Этим imput`ом может быть что угодно — текстовое поле в форме, параметры _GET и _POST, cookies и т. д. Этот метод был весьма эффективным до появления фреймворков в мире PHP. Но этот способ взлома может быть по-прежнему опасен, если вы не используете ORM или какие-либо еще расширения для data object. Почему? Из-за способа передачи параметров в SQL запрос.
«Слепые» инъекции
Давайте начнем с классического примера SQL-statement`а, возвращающего пользователя по его логину и хешу от пароля (страница входа)
Пример 1
mysql_query(‘SELECT id, login FROM users WHERE login = ? and password = hash(?)’);
Я подставил вопросительные знаки в выражение из-за различных вариаций этого решения. Первый вариант, на мой взгляд, самый уязвимый:
Пример 1а
mysql_query(‘SELECT id, login FROM users WHERE login = «‘ . $login . ‘» and password = hash(«‘ . $password . ‘»)’);
В этом случае в коде нет проверки на ввод неправильных данных. Значения передаются прямо из формы ввода в SQL запрос. В самом лучшем случае пользователь введет здесь свои логин и пароль. Что случится в худшем случае?
Давайте попробуем хакнуть эту форму. Это можно сделать, передав «подготовленные» данные. Попытаемся войти как первый пользователь из базы данных, а в большинстве случаев — это админский аккаунт. Для этого, передадим специальную строку вместо ввода логина:
» OR 1=1; —
Первая кавычка может быть и одинарной, поэтому одной попыткой взлома можно не обойтись. В конце стоят точка с запятой и два дефиса, чтобы всё, что идёт после превратилось в комментарий. В результате будет выполнен следующий SQL запрос:
SELECT id, login FROM users WHERE login = “;” OR 1=1 LIMIT 0,1; – and password = hash(“;Some password”)
Он вернет первого пользователя из базы данных и, возможно, залогинится под ним в приложении. Хорошим ходом будет добавить LIMIT, чтобы входить под каждым отдельным пользователем. Это единственное, что нужно, чтобы пройти по каждому значению.
Более серьезные способы
В предыдущем примере всё не так уж страшно. Возможности в админской панели управления всегда имеют ограничения и потребуется реально много работы, чтобы поломать сайт. А вот атака через SQL инъекции может привести к куда большим повреждениям системы. Задумайтесь, сколько приложений создаются с главной таблицей ‘users’ , и что будет, если злоумышленник введет такой код в незащищённую форму:
My favorite login’; DROP TABLE users; —
Таблица ‘users’ будет удалена. Это одна из причин почаще делать бэкапы баз данных.
_GET параметры
Все параметры, заполненные через форму, передаются на сервер одним из двух методов — GET или POST. Наиболее распространенный параметр, передаваемый через GET — id. Это одно из самых уязвимых мест для атак, при этом неважно, какого вида урл вы используете — ` http://example.com/users/?id=1 `, или ` http://example.com/users/1 `, или ` http://. /. /post/35 `.
Что произойдет, если мы подставим в урл следующий код?
http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE —
Вероятно, такой запрос вернет нам логин пользователя и. хеш от его пароля. Первая часть запроса `AND 1=0` превращает то, что перед ним в false, соответственно никаких записей не будет получено. А вторая часть запроса вернет данные в виде prepared data.
А так как первым параметром идет id, следующим будет логин пользователя и хеш его пароля и еще сколько-то параметров. Существует множество программ, с помощью брутфорса декодирующих такой пароль, как в примере. А так как пользователь может использовать один и тот же пароль для разных сервисов, можно получить доступ и к ним.
И вот что любопытно: от такого способа атаки совершенно невозможно защититься методами вроде `mysql_real_escape_string`, `addslashes` и.т. д. В принципе, нет способа избежать такой атаки, поэтому, если параметры будут передаваться так:
‘SELECT id, login, email, param1 FROM users WHERE . addslashes($_GET[‘id’]);’
проблемы не исчезнут.
Экранирование символов в строке
Когда я был новичком в программировании, мне было тяжело работать с кодировками. Я не понимал, в чем между ними различие, зачем использовать UTF-8, когда нужно UTF-16, почему база данных постоянно устанавливает кодировку в latin1. Когда я наконец начал всё это понимать, то обнаружил, что проблем станет меньше, если хранить всё в одном стандарте кодирования. Разбираясь со всем этим, я заметил также и проблемы безопасности, возникающие при преобразовании из одной кодировки в другую.
Проблем, описанных в большинстве предыдущих примеров, можно избежать, используя одинарные кавычки в запросах. Если вы используете addslashes() , атаки через SQL-инъекции, построенные на использовании одинарных кавычек, экранируемых обратным слэшем, потерпят неудачу. Но такая атака может пройти, если просто подставить символ с кодом 0xbf27 , addslashes() преобразует его в символ с кодом 0xbf5c27 – а это вполне валидный символ одинарной кавычки. Другими словами, `뼧` пройдет через addslashes() , а потом маппинг MySQL конвертирует его в два символа 0xbf (¿) и 0x27 (‘).
«SELECT * FROM users WHERE login = ‘»; . addslashes($_GET[‘login’]) . «;'»;
Этот пример можно хакнуть, передав 뼧 or 1=1; — в поле логина в форме. Движок SQL сгенерит конечный запрос так:
SELECT * FROM users WHERE login = ‘¿’ OR 1=1; —
И вернет первого пользователя из БД.
Защита
Как же защитить приложение? Есть куча способов, применение которых не сделает приложение совсем неуязвимым, но хотя бы повысит его защищенность.
Использование mysql_real_escape_string
Функция addslashes() ненадежна, так как не предусматривает многие случаи взлома. У mysql_real_escape_string нет таких проблем
Использование MySQLi
Это расширение для MySQL умеет работать со связанными параметрами:
$stmt = $db->prepare(‘update uets set parameter = ? where $name, $id); $stmt->execute();
Использование PDO
Длинный способ подстановки параметров:
$dbh = new PDO(‘mysql:dbname=testdb;host=127.0.0.1’, $user, $password); $stmt = $dbh->prepare(‘INSERT INTO REGISTRY (name, value) VALUES (:name, :value)’); $stmt->bindParam(‘:name’, $name); $stmt->bindParam(‘:value’, $value); // insert one row $name = ‘one’; $value = 1; $stmt->execute();
$dbh = new PDO(‘mysql:dbname=testdb;host=127.0.0.1’, $user, $password); $stmt = $dbh->prepare(‘UPDATE people SET name = :new_name WHERE array(‘new_name’ => $name, ‘id’ => $id) );
Использование ORM
Используйте ORM и PDO и связывайте (используйте bind) параметры. Избегайте SQL в коде, если вы видите в коде SQL, значит, с ним что-то не так.
ORM позаботится о безопасности в самых узких местах в коде и о валидации параметров.
Выводы
Цель этой серии не предоставить полное руководство по взлому сайтов, а обеспечить безопасность приложения и предотвращение атак из любого источника. Я постарался написать эту статью не только для программистов — они должны быть в курсе любых угроз в коде и знать пути, как предотвратить их, но также и для инженеров по качеству — потому, что их работа заключается в том, чтобы отследить и сообщить такие моменты.
php security sql injection
2017-11-02 irul Поделиться:
Последние посты
- 2023-02-03Новая мажорная версия Flysystem
- 2020-12-31Конечные автоматы для Eloquent
- 2020-12-30Создаём REST API с помощью Laravel Orion
- 2020-12-29При разработке локально используйте queue:listen вместо queue:work
- 2020-12-28Laravel Desktop Notifier
Источник: phpprofi.ru
Обход авторизации с помощью SQL-инъекции
SQL-инъекции — один из распространённых способов взлома сайтов (веб-приложений) и программ, работающих с базами данных. Метод основан на внедрении в запрос произвольного SQL-кода. В статье покажу, как работает обход авторизации с помощью SQL-инъекции и поделюсь шпаргалкой.
Обход авторизации с помощью SQL-инъекции
Авторизация на сайте работает следующим образом:
- Сайт (веб-приложение) запрашивает имя пользователя и пароль.
- Сайт делает запрос к базе данных: «У нас есть пользователь с именем «User »и паролем« user»?».
- Если в базе данных указано, что данные для входа верны, тогда сайт позволит войти пользователю User.
Пример простого PHP кода с авторизацией:
$ username = $ _POST [ ‘username’ ] ; // Имя пользователя
$ password = $ _POST [ ‘password’ ] ; // Пароль
$ query = «select username, password from users where username=’.$username.’ and password=’.$password.’ limit 0,1» ; // команда для запроса
$ result = mysql_query ( $ query ) ; // запрос
$ rows = mysql_fetch_array ( $ result ) ; // получение данных
if ( $ rows ) // Проверка на верность данных
echo «Login successful» ;
// Create Session or Set Cookies
echo «login data invalid» ;
Уязвимости в коде
При попытке авторизации код получает данные введенные пользователем и помещает их прямо в SQL команду. Он не проверяет, какой тип данных представлен. Вот используемый SQL-запрос.
SELECT username , password FROM users WHERE username = ‘$username’ AND password = ‘$password’ LIMIT 0 , 1 ;
Для поиска уязвимости в коде проведем фаззинг.
Фаззинг — это передача сайту случайных данных. Длинные целые числа / строки и т.п. Мы знаем, для того чтобы сломать SQL зарос, нужно ввести апостроф или двойные кавычки. «.
Попробуем ввести имя пользователя user и пароь pass ‘ » . Для кода данный запрос будет выглядеть следующим образом:
SELECT username , password FROM users WHERE username = ‘user’ AND password = ‘pass’ ‘ LIMIT 0 , 1 ;
Что соответственно приводит к SQL ошибке:
You have an error in your SQL syntax ; check the manual that corresponds to your MariaDB server version for the right syntax to use near
‘test’ » at line 1
Скрипт принимает наши данные и помещает их в кавычки. Если я введу в качестве пароля test , то sql запрос будет содержать password = ‘test’ :
SELECT username , password FROM users WHERE username = ‘user’ AND password = ‘test’ LIMIT 0 , 1 ;
Это уже не вызовет ошибку.
Но после данной строки есть еще и другой код. (‘LIMIT 0,1)
Таким образом, соответствие правилам SQL синтаксиса это неверно. Это заставило сервер выдать ошибку. Подумайте, что будет, если я добавлю эту строку в качестве ввода.
test ‘ or 1 = 1 —
Запрос будет иметь вид:
SELECT username , password FROM users WHERE username = ‘user’ AND password = ‘test’ or 1 = 1 —‘ LIMIT 0 , 1 ;
В SQL — — или — + в качестве символа для комментария. поэтому, если мы хотим что-то прокомментировать или заблокировать какую-то часть кода, мы можем использовать это. В этом запросе все последующее — игнорируется.
SELECT username , password FROM users WHERE username = ‘user’ AND password = ‘test’ or 1 = 1
Но что будет если к SQL-запросу добавить такую строку:
Что интересно в операторе OR, так это то, что он проверяет два логических оператора и, если один из них или оба верны, он вернет true.
поэтому, если пароль похож на строковый тест или 1 = 1, он вернет true. Поскольку 1 всегда равен 1 (как не странно), этот запрос игнорирует неправильный пароль. Так мы смогли обойти проверку пароля.
Но, а что, если мы не знаем ни пароля, ни имени пользователя?