💻HTML Injection

HTML Injection mövzusu, hücum növləri, nümunələr, qarşısının alınması

HTML Injection nədir?

HTML injection, zərərli bir HTML kodunun bir veb sayt daxil edildiyi hücum növüdür. Bu, kiçik veb sayt təhriflərindən tutmuş ciddi data pozuntularına qədər müxtəlif problemlərə yol aça bilər. Digər veb təhlükəsizlik boşluqlarından fərqli olaraq, HTML injection, əksər veb saytların əsasını təşkil edən işarələmə dilini hədəfləyir. Bu hücum növü, bir veb səhifənin strukturunu və məzmunu dəyişməyə fokuslandığı üçün server və ya databazanın zəif nöqtələrindən faydalanan güvənlik boşluqlarından fərqlənir.

Qısaca bir kodun normal mətn olaraq yox, HTML kodu olaraq oxuna bilməsi halı, HTML injection-dır. HTML Injection, adətən istifadəçidən datanın daxil edilməsini tələb edən xanalarda ortaya çıxır.

HTML Injection-a aparan səbəblər

Səhlənkarlıq, bu hücum növünün geniş yayılmasına səbəb olan amillərdən biridir. Input Validation (xanaya daxil edilən datanın yoxlanılmaması) siyahıda ən üstdə yer alır və təcavüzkara heç bir maneə olmadan zərərli kodu daxil etməyə imkan verir. Yanlış konfiqurasiya edilmiş veb serverlər də istismar edilə bilər və təcrübəli hakerlər üçün boşluqlara yol aça bilər. Son olaraq, fərqində olmadan və tələskənlikdən irəli gələn güvənli olmayan kodlaşdırma da bu hücumlara zəmin yaradır.

Bu səbəblər texniki kateqoriyaya aidmiş kimi görünsə də, çox vaxt insan xətasından qaynaqlanır. İstər təhlükəsizlik tədbirlərinə qeyri-ciddi yanaşan bir developer, istərsə də ayarları yanlış konfiqurasiya edən server administratoru olsun, insan ünsürü hər zaman mövcuddur.

HTML Injection Hücum Növləri

Stored HTML Injection

Daimi/qalıcı (Persistent) olaraq bilinən bu hücum növü, zərərli kodun hədəf serverdə və ya databazada daimi olaraq saxlandığı bir hücumdur. İstifadəçilər müəyyən səhifələrə hər müraciət etdikdə bu kod onlara təqdim olunur. Zərərli kod bir dəfə yerləşdirildikdən sonra, təcavüzkarın başqa addım atmasına ehtiyac qalmır və bu zərərli kod çoxsayda istifadəçiyə təsir göstərə bilir.

Məsələn, təcavüzkar, forumda zərərli bir script-i ehtiva edən bir post paylaşır, forum istifadəçiləri bu script-ə klikləməklə zərərli kodun işə düşməsinə şərait yaradır, beləliklə potensial data oğurluğu və digər zərərli hallar baş verir. Belə bir hücumun baş verməsi üçün müəyyən metodlar mövcuddur.

Mətn daxiletmə və ya Form xanaları

Məsələn, bir saytda istifadəçidən ad və mesaj alındığını fərz edək. Ad sahəsinə normal adı daxil edərkən, mesaj sahəsinə belə bir kod yazıla bilər:

<script>alert('Salam! Mən zərərli bir script-əm.');</script>

İstifadəçi bu datanı göndərdikdən sonra, bu kod HTML kodu olaraq emal edilsə, ekranda bir xəbərdarlıq pəncərəsi açılacaq. Bu hal, input xanalarının düzgün filtrlənməməsinə və güvənlik kontrollarının edilməməsinə görə baş verir.

Belə bir zərərli kod, rəylərin yazıldığı xanaya da yazıla bilər. Beləliklə, istifadəçilər rəy sahəsinə baxdıqda, databazadan alınan bu zərərli kod səhifədə görünür və brauzer tərəfindən işə düşür.

Qarşısını alma

  • Input Validation - düzgün bir input validation mexanizmi istifadə olunmalıdır. Yalnız mətn girişlərinə icazə verən və HTML kodlarını əngəlləyən bir filtr istifadə oluna bilər. Məsələn, istifadəçi tərəfindən daxil edilən datadan '<' və '>' simvollarının silinməsi və dəyişdirilməsi kimi. Nümunə:

    import cgi
    user_input = "<script>alert('Bu, zərərli bir script-dir!');</script>"
    safe_input = cgi.escape(user_input, quote=True)
    print(safe_input)

  • Output Encoding - İstifadəçinin daxil etdiyi data, veb səhifədə göstərilərkən güvənli şəkildə encode edilməlidir. Məsələn, HTML etiketlərini açmaq/bağlamaq üçün istifadə olunan simvollar ('<' və '>'), olduğu kimi yazılmalı və HTML kodu olaraq şərh edilməməlidir. Python-da jinja2 şablon mühərrikini istifadə edərək output encode prosesi: {{ user_input | e }}

  • HTML Tag Removal - Data daxil edilən xanalarda HTML etiketləri silinə və zərərsizləşdirilə bilər. Məsələn, Python-da BeautifulSoup istifadə edərək HTML etiketlərini aradan qaldırma:

    from bs4 import BeautifulSoup
    user_input = "<script>alert('Bu, zərərli bir script-dir!');</script>"
    clean_input = BeautifulSoup(user_input, "html.parser").text
    print(clean_input)

  • Content Security Policy (CSP) - CSP istifadə edərək, sadəcə müəyyən mənbələrdən gələn script-lərin işləməsinə icazə vermək olar. Bu, zərərli script-lərin işə düşməsini əngəlləyə bilər. Məsələn, HTML başlıqlarına CSP əlavə etmək üçün nümunə:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self';">

Bir forum və ya rəy sistemində Stored HTML Injection-ın necə işə düşəcəyi və necə qarşısının alınacağı ilə bağlı nümunə:

<!DOCTYPE html>
<html>
<head>
    <title>Rəylər</title>
</head>
<body>
    <h1>Rəy bildir</h1>
    <form action="/submit_comment" method="POST"> //F
        <textarea name="comment"></textarea>
        <button type="submit">Göndər</button>
    </form>
    <h1>Rəylər</h1>
    <div id="comments">
        {% for comment in comments %}
            <p>{{ comment }}</p>
        {% endfor %}
    </div>
</body>
</html>

Kodların açıqlaması:

  • <form> - Form elementlərini əhatə edən etiketdir

  • action="/submit_comment - Formun göndəriləcəyi URL-ni müəyyən edir. Form göndərildikdə, server bu URL-ni emal edərək datanı alır.

  • method="POST"- Formun hansı HTTP metodu ilə göndəriləcəyini müəyyən edir. POST metodu, datanın serverə göndərilməsi üçün istifadə olunur və adətən data göndərərkən güvənli hesab olunur.

  • textarea - Çoxsaylı mətnlərin daxil edilməsi üçün istifadə olunur. İstifadəçilər bu xanaya rəylərini yaza bilər.

  • name="comment" - Bu, xananın adını bildirir. Form göndərildikdə, bu xananın dəyəri comment adı ilə serverə göndərilir.

  • button - Kliklənəcək və ya basılacaq bir düymədir.

  • type="submit" - Formu göndərmək üçün istifadə olunur. İstifadəçi bu düyməyə kliklədikdə, formdakı datalar action URL-sinə göndərilir.

  • <h1>Rəylər</h1> - Bu kod blokunda, istifadəçiyə mövcud olan bütün rəylərin göstərildiyi sahədir.

  • <div id="comments"> - </div>, HTML-də bir konteyner yaratmaq üçündür. id="comments" ilə bu konteynerin identifikasiyası (kimliyi) müəyyən edilir.

  • {% for comment in comments %} - {% endfor %} daxilindəki sahə isə Python Flask içində Jinja2 şablon mühərriki tərəfindən şərh edilir. Bu şablon ifadəsi, comments siyahısındakı hər bir rəyi <p>{{ comment }}</p> daxilində göstərir.

Xülasə:

  • İstifadəçi, "Rəy bildir" formunda rəyini yazır və "Göndər" düyməsinə basır.

  • Form, POST metodu ilə /submit_comment URL-sinə göndərilir.

  • Server, gələn rəyi emal edir və databazada saxlayır.

  • Mövcud rəylər, "Rəylər" başlığının altında <div id="comments"> daxilində göstərilir.

Python Flask serveri

Təhlükəsizlik tədbirini almaq üçün yazılacaq kodlar:

from flask import Flask, request, render_template_string
from bs4 import BeautifulSoup

app = Flask(__name__)

# Sadə bir databaza olaraq rəyləri saxlamaq üçün siyahı istifadə edirik.
comments = []

@app.route('/')
def index():
    # Rəyləri render edərkən güvənli hala gətirin
    return render_template_string("""
        <!DOCTYPE html>
        <html>
        <head>
            <title>Rəylər</title>
        </head>
        <body>
            <h1>Rəy bildir</h1>
            <form action="/submit_comment" method="POST">
                <textarea name="comment"></textarea>
                <button type="submit">Göndər</button>
            </form>
            <h1>Rəylər</h1>
            <div id="comments">
                {% for comment in comments %}
                    <p>{{ comment }}</p>
                {% endfor %}
            </div>
        </body>
        </html>
    """, comments=comments)

@app.route('/submit_comment', methods=['POST'])
def submit_comment():
    comment = request.form['comment']
    # Zərərli kodları silmək üçün BeautifulSoup istifadə edərək təmizləmə
    clean_comment = BeautifulSoup(comment, "html.parser").text
    comments.append(clean_comment)
    return "Rəy əlavə edildi!"

if __name__ == '__main__':
    app.run(debug=True)

Kodun açıqlaması:

  1. BeautifulSoup ilə təmizləmə: submit_comment funksiyasında istifadəçidən alınan comment dəyəri BeautifulSoup istifadə edilərək təmizlənir. Bu, HTML etiketlərini və zərərli kodları aradan qaldıraraq sadəcə düz mətni saxlayır. clean_comment = BeautifulSoup(comment, "html.parser").text

  2. Render Template String: index funksiyasında rəylər güvənli şəkildə göstərilir. İstifadəçi tərəfindən verilmiş data, təmizləndikdən sonra HTML daxilində göstərilir.

Reflected HTML Injection

Stored injection-dan fərqli olaraq, əks olunan hücumlar serverdə daimi olaraq saxlanılmır. Bunun əvəzinə, URL vasitəsilə zərərli kodu icra etmək üçün istifadəçiləri aldadırlar. Bu, adətən istifadəçiləri tələyə salmaq üçün təhlükəsizliyi pozulmuş bir keçidə (link) klikləmələrini təşviq edən e-poçt və mesajlar vasitəsilə həyata keçirilir. Belə keçidlər, sonu zərərli nəticəyə aparan pisniyyətli yükü ehtiva edir. 2 əsas növü vardır:

  1. Searching field - İstifadəçi axtarış xanasına zərərli kodu ehtiva edən bir script daxil edir. Veb saytı bunu emal etmədən səhifəyə əlavə edir. Zərərli kod, veb səhifədə işə salınır. Məsələn: Hər hansısa məhsul satışı edən səhifənin axtarış xanası mövcuddur. Bu xanaya <script>alert ('XSS Hücumu!')</script> yazsaq, bu kod veb səhifəyə əlavə olunacaq və brauzer tərəfindən işə düşəcək.

  2. URL parametrləri - İstifadəçi URL-yə zərərli kodu ehtiva edən bir parametr daxil edir. Veb sayt, bu parametrləri emal etmədən səhifəyə əlavə edir. Zərərli kod, veb saytda işə düşür. Məsələn, bir veb səhifədə istifadəçilərin URL parametrləri vasitəsilə axtarış edə bildiyini fərz edək. URL-yə belə bir parametr əlavə edilə bilər: http://example.com/search?query=<h1>alert('Salam! Mən zərərli bir script-əm.');</h1> Beləliklə, veb səhifə, URL parametrini birbaşa HTML olaraq emal etdikdə, ekranda bir xəbərdarlıq pəncərəsi açılacaq.

Qarşısını alma

  • URL parametrlərini encode etmək - Məsələn, JavaScript kodlarını və ya HTML etiketlərini encode edən bir funksiya istifadə edilə bilər.

  • Server-side validation - İstifadəçi tərəfindən daxil edilən datalar, server tərəfində də doğrulanmalıdır. Bunun üçün server tərəfində əlavə kontrollar həyata keçirilməlidir.

Reflected HTML Injection ilə Reflected XSS arasındakı fərqlər

Hər iki hücum növü, veb tətbiqlərin təhlükəsizlik boşluqlarından faydalanır. Ancaq aralarındakı fərqlər, yazılan koda və göstərdiyi təsirə görə üzə çıxır.

Reflected HTML Injection - Əsas hədəfi zərərli HTML kodlarının işə salınmasıdır. Məqsəd, veb səhifənin strukturunu dəyişdirmək, saxta məzmun əlavə etmək və istifadəçini aldatmaqdır.

Reflected XSS (Cross-Site Scripting) - Əsas hədəfi zərərli JavaScript kodlarının işə salınmasıdır. Məqsəd, istifadəçi məlumatlarının oğurlanması, session-ların ələ keçirilməsi və zərərli əməliyyatları icra etməkdir.

DOM-based HTML Injection

Bu hücum, səhifənin strukturunu təmsil edən bir veb səhifəsinin "Document Object Model"ini (DOM) hədəf alır. Təcəvüzkarlar DOM-u dəyişdirməklə, client tərəfində icra olunan zərərli script-ləri əlavə edə bilər. DOM-u anlamaq, həm veb developerlər, həm təhlükəsizlik mütəxəssisləri üçün çox vacibdir. Bu, HTML ilə JavaScript arasındakı körpüdür və istənilən zəif nöqtə (vulnerability) əhəmiyyətli təhlükəsizlik pozuntularına yol aça bilər. Bu hücumların necə işlədiyi bilmək, onun qarşısını almağın ilk addımıdır. DOM based Injection mövzusunu anlamaq üçün əvvəlcə DOM-un nə olduğunu anlamaq lazımdır.

DOM - Document Object Model

DOM, bir səhifənin strukturunu və məzmununu təmsil edən bir modeldir. Veb səhifələri ərsəyə gətirmək üçün istifadə olunan HTML və XML sənədlərini brauzerlər üçün oxuna bilən və manipulyasiya edilə bilən hala gətirir. DOM, veb səhifənin məzmununu və strukturunu bir ağac strukturu halında göstərir və hər bir element, düyün (node) adlandırılır. Daha asan dildə desək, DOM, veb səhifənin proqramlaşdırıla bilən bir versiyasıdır. DOM sayəsində JavaScript kimi proqramlaşdırma dilləri, bir veb səhifənin məzmununu və strukturunu dinamik olarq dəyişdirə bilər. Məsələn, bizdə belə bir HTML kodu var:

<!DOCTYPE html>
<html>
<head>
    <title>Nümunə Səhifə</title>
</head>
<body>
    <h1>Salam Dünya!</h1>
    <p>Bu, adi bir paraqrafdır.</p>
</body>
</html>

Bu HTML kodu, brauzer tərəfindən DOM-a belə çevrilir:

  • document - Ana düyün

    • html - HTML elementi

      • head - Başlıq hissəsi

        • title - Sərlövhə

      • body - Gövdə hissəsi

        • h1 - Başlıq elementi

        • p - Paraqraf elementi

JavaScript ilə bu koddakı başlıq elementinin dəyərini dəyişdirmək üçün belə bir kod yaza bilərik:

document.querySelector('h1').innerText = 'Yeni Başlıq';

Beləliklə, yuxarıdakı kodda görünən h1 elementinin məzmunu "Yeni Başlıq" olaraq dəyişdirilir.

DOM Based Injection necə yaranır?

  1. İstifadəçi tərəfindən xanaya data daxil edilməsi və ya URL parametrləri - İstifadəçi, URL-yə və ya bir forumdakı xanaya zərərli bir kod əlavə edir.

  2. JavaScript kodun emalı - Veb səhifədə çalışan JavaScript kodu, bu datanı alır və birbaşa səhifənin HTML məzmununa (DOM-a) əlavə edir.

  3. Zərərli kodun işə düşməsi - Brauzer, bu zərərli kodu işə salır və istənilən fəaliyyət həyata keçir.

Nümunə ssenari:

Deyək ki, belə bir zərərli URL parametrimiz var:

http://example.com/?message=<script>alert('Zararlı Kod');</script>

Və səhifəmizin mənbə kodu belədir:

<!DOCTYPE html>
<html>
<head>
    <title>DOM-based Injection Örneği</title>
</head>
<body>
    <h1>Mesajınız:</h1>
    <div id="message"></div>
    <script>
        // URL'den message parametresini al
        const urlParams = new URLSearchParams(window.location.search);
        const message = urlParams.get('message');

        // Message parametresini doğrudan DOM'a ekle
        if (message) {
            document.getElementById('message').innerHTML = message;
        }
    </script>
</body>
</html>

Zərərli kod işə düşür. Brauzer bu səhifəni yüklədikdə, URL parametrindən alınan message dəyəri birbaşa DOM-a əlavə edilir:

<div id="message"><script>alert('Zararlı Kod');</script></div>

Xülasə:

  • DOM-based Injection: İstifadəçinin data daxil etməsi və ya URL parametrinin JavaScript kodu tərəfindən birbaşa DOM-a əlavə edilməsi ilə yaranan təhlükəsizlik boşluğudur.

  • Zərərli kodun mənbəyi: URL parametrləri və ya digər istifadəçi girişləri ola bilər.

  • Zərərli kodun təsiri: Brauzerdə işə düşən zərərli JavaScript kodu, istifadəçiyə istənilməyən fəaliyyətlər etdirə bilər.

Digər hücum nümunələri

URL parameter manipulation

  1. Zəif nöqtənin qurulması: Bir veb səhifə, düzgün təmizləmə (sanitization) olmadan bir URL parametrini birbaşa HTML-ə daxil etmək üçün JavaScript istifadə edir. Məsələn, userInput parametri birbaşa DOM-a daxil edilib.

  2. İstifadəçi ilə qarşılıqlı əlaqə: http://example.com/page.html?userInput=<script>alert('Injected!');</script>

  3. Nəticə: Script etiketi, HTML-in bir hissəsi kimi icra edilir, Injected! mesajı olan bir xəbərdarlıq qutusu açılır. Bu, JavaScript kodunun DOM-a necə yeridilə biləcəyini nümayiş idi.

InnerHTML Vulnerability

  1. Zəif nöqtənin qurulması: Bir veb səhifədəki JavaScript funksiyası, istifadəçi tərəfindən təqdim edilən məzmunu DOM-a əlavə etmək üçün innerHTML istifadə edir.

  2. İstifadəçi ilə qarşılıqlı əlaqə: Bir form xanasına istifadəçi tərəfindən aşağıdakı kodlar daxil edilir: <img src=x onerror=alert('Injected!')>

  3. Nəticə: innerHTML istifadə edilərək daxil edilən kodlar render edildikdə, brauzer təsviri yükləmə çalışsa da, uğursuz olur və onerror JavaScript-i icra edərək Injected! xəbərdarlığını ekranda göstərir.

JavaScript-based Redirection

  1. Zəif nöqtənin qurulması: Bir veb səhifə, düzgün doğrulama (validation) olmadan, bir URL parametrinə əsaslanan yönləndirməni (redirection) ələ almaq üçün JavaScript istifadə edir.

  2. İstifadəçi ilə qarşılıqlı əlaqə: http://example.com/page.html?redirect=javascript:alert('Injected!')

  3. Nəticə: Yönləndirmə parametrindəki JavaScript icra edilərək, Injected! xəbərdarlığını ekranda göstərir. Bu, zərərli script-ləri icra etmək və ya istifadəçini pisniyyətli sayta yönləndirmək üçün istifadə edilə bilər.

Insecure JavaScript Evaluation

  1. Zəif nöqtənin qurulması: Bir veb səhifə, JavaScript eval() funksiyasını ehtiva edir. Bu funksiya, URL parametri kimi, istifadəçi tərəfindən nəzarət edilən girişdən (input) gələn kodları qiymətləndirir.

  2. İstifadəçi ilə qarşılıqlı əlaqə: İstifadəçi, URL-yə belə bir kod daxil edir. http://example.com/page.html?code=alert('Injected!')

  3. Nəticə: eval() funksiyası code parametrindəki kodu icra edir və Injected! xəbərdarlığını ekranda göstərir.

Cookies and Stored Data Inputs

Çərəzlər və saxlanılmış data xanaları. İstifadəçilər, adətən formlarda data daxil edirlər. Məsələn, istifadəçi imza xanasına belə bir data daxil edə bilər:

<a href="http://zərərli-veb-sayt.com">Klikləyin!</a>

Beləliklə, istifadəçi imza xanasına yazılmış HTML kodları səhifədə HTML kodu olaraq emal edilə və istifadəçilər zərərli bir sayta yönləndirə bilər.

Qarşısını alma

  • Output Encoding - İstifadəçi tərəfindən daxil edilən data, veb səhifədə görünərkən güvənli şəkildə encode edilməlidir. Məsələn, HTML etiketlərini encode edən bir funksiya istifadə edilə bilər.

Potensial Risklər və Təsirlər

Data oğurluğu və pozuntuları

HTML Injection-ın ən qorxunc nəticələrindən biri də məlumatların oğurlanmasıdır. Bu, giriş məlumatları, şəxsi məlumatlar və maliyyə məlumatları daxil olmaqla həssas istifadəçi məlumatlarına pisniyyətli haker tərəfindən icazəsiz müraciət edildikdə baş verir. Oğurlanmış datalar, dark vebdə satıla, kimlik oğurluğu üçün üzrə sui-istifadə edilə və digər zərərli yollarla istifadə edilə bilər. Data pozuntusunun dalğalanma təsiri uzunmüddətli ola bilər. Təşkilatlar, tənzimləyici təsirlərdən, marka nüfuzunun itməsindən və daha çoxundan zərər görə bilər.

Zərərli yazılımın paylanması

HTML Injection, zərərli yazılımın yayılması üçün bir kanal kimi xidmət edə bilər. Təcavüzkarlar, zərərli script-ləri veb səhifələrə yeritməklə istifadəçilərin xəbəri olmadan, onların istifadə etdiyi brauzerləri zərərli yazılımı endirib işə salmasına məcbur edə bilər. Buna, istifadəçilərin datalarını şifrələyən və geri qaytarılması üçün fidyə tələb edən ransomware (fidyə yazılımı) kimi zərərli formatda yazılmış reklam yazılımları da daxildir. Zərərli yazılımların paylanması, həm də daha geniş miqyaslı şəbəkə infeksiyalarına da yol aça bilər. Təşkilatlar üçün əhəmiyyətli kəsintilərə, data itkisinə və maliyyə zərərlərinə səbəb ola bilər.

Veb saytın təhrif olunması

Veb saytın təhrif olunması, HTML Injection-ın başqa bir potensial nəticəsidir. Hakerlər, qanuni məzmunu öz mesajları və şəkilləri ilə əvəz edərək bir veb saytın görünüşünü və məzmununu dəyişə bilər. Bu, siyasi motivli, etiraz məqsədli və ya rəqəmsal vandalizm əməli ola bilər. Bu cür əməllər, bir markanın nüfuzuna xələl gətirə bilər. Həmçinin, veb saytın orijinal vəziyyətinə qaytarılması prosesi, çox vaxt aparan və maliyyə tələb edən proses ola bilər, xüsusən də nüsxələr əlçatan deyilsə.

Qarşısını alma və təsirini azaltma strategiyaları

Giriş doğrulama və təmizləmə

HTML Injection-a qarşı müdafiənin ön cəbhəsində daxil edilən məlumatların yoxlanılması və təmizlənməsi dayanır. İstifadəçilər tərəfindən daxil edilən bütün dataların müəyyən edilmiş kriteriyalara görə doğrulanmasını ciddi şəkildə təmin etməklə, zərərli data girişlərinin qarşısını effektiv şəkildə almaq olar. Bura, gözlənilən dəyərlərə uyğun olduğuna əmin olmaq məqsədilə datanın növünü, uzunluğunu və modelini yoxlamaq daxildir. Sanitization (təmizləmə), potensial olaraq zərərli elementləri aradan qaldırmaq məqsədilə istifadəçi tərəfindən daxil edilən datanın təmizlənməsini və dəyişdirilməsini ehtiva edir. Zərərli kodları emal edilmədən aradan qaldıran (zərərsizləşdirən), güvənli kodlaşdırma üçün nəzərdə tutulan kitabxanalar və alətlər ilə buna nail olmaq olar.

Last updated