SQL Injection Attack

Spesifik SQL Injection Zafiyetlerinin SQLMap ile Exploit Edilmesi

Merhaba

SQL Injection saldırılarında kullanılan payloadlar, uygulamanın veri tabanına göndereceği sorgunun yapısına göre veya uygulamanın dönen veri ile yapacağı işlemlere göre değişiklik gösterir. Geçtiğimiz günlerde yaşadığım iki adet farklı sql injection zafiyetini exploit ederken yaptığım işlemleri anlatacağım.

Login Sayfası

Login sayfasında kullanıcıdan alınan username ve password hemen hemen aşağıdaki sorguya benzer yapılar ile çalışmaktadır.

Her username ve password ikilisinin uniq olması beklenir. Herhangi bir durum olursa uygulamanın hata vermemesi için LIMIT ile dönen sonuç sınırlandırılır.

Bu yapıda saldırgan olarak sorguyu manipüle edebileceğimiz 1 adet değişken mevcuttur. Şifre alanına yazılacak her payloadın md5 alınacağı için sorgu içerisinde [a-f][0-9] ‘dan ibaret bir string oluşacaktır. Bu nedenle sql injection saldırısı username üzerinden gerçekleşmek durumundadır.

Bir diğer önemli nokta ise hedef uygulama sorgu sonucunda dönen veriyi ekrana yazma gibi bir işlem yapmamaktadır. Eğer giriş başarılı ise 302 ile home.php sayfasına redirect olmakta, yanlış ise aynı sayfa tekrar gelmektedir. Bu durumda pek çok insan login bypass yöntemlerini düşünmektedir. Login bypass yöntemi bu örnekte işe yarayacaktır ama veri tabanında ki diğer tabloları keşif etmemize yararı olmayacaktır. Bu nedenle Login Bypass yerine Blind SQLi saldırısı yapmak daha doğru olacaktır.

Blind SQLi saldırıları gerçekleştirirken <,  > , = gibi karakterleri kullanırız. Bu karakter ise hedef uygulamada YASAKLI durumdadır. username değişkeni içerisinde bu karakterlerden herhangi biri varsa yazılım otamatik olarak ilgili karakteri kaldırmaktadır.

Oluşan syntax hatasından kaçmak adına BETWEEN komutu kullanılabilir.

 Ayrıca = karakterinin yasaklandığı durumlarda LIKE komutunu kullanabilirsiniz.

Bu dönüşümü otomatik olarak yapmak için sqlmap’in tamper scriptini kullanabiliriz.

Real IP Problemi

Özellikle Cloudflare arkasında ki uygulamalar kullanıcıların gerçek IP adreslerini almak için X-Forwarded-For kullanmaktadırlar. Cloudflare kullanıcılardan gelen talepleri alıp, ilgili sunucuya iletirken kullanıcının gerçek IP adresini X-Forwarded-For ile göndermektedir. Aksi halde uygulama tüm IP adreslerini cloudflare’ın IP adresi olarak görecektir.

Bu durumda eğer uygulamada herhangi bir saldırı tespit önlemi varsa, filtrelemeye takılan talepler X-Forwarded-For’dan alınan IP adresi bilgisine göre sisteme erişimi engellencektir. SQL Injection saldırısı yaparken her request’te X-Forwarded-For alanında ki değer değiştirilirse saldırı gerçekleştirdiğimiz IP adresimiz erişim engeline takılmayacaktır. Özetle her talebi farklı bir proxy’den iletiyormuşuz gibi düşünebilirsiniz.

Bu işlemi gerçekleştirebilmekadına sqlmap için tamper script’i geliştirdim.

https://github.com/sqlmapproject/sqlmap/pull/835

Bu scripti sqlmap klasörü altında ki tamper isimli klasörde randomfakeproxy.py ismi ile kaydettikten sonra aşağıdaki şekilde kullanabilirsiniz.

 

  • i found this message:
    ___ ___| |_____ ___ ___ {1.0-dev-2de12ef}
    |_ -| . | | | .’| . |
    |___|_ |_|_|_|_|__,| _|
    |_| |_| http://sqlmap.org

    [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user’s responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

    [*] starting at 15:24:32

    [15:24:32] [INFO] loading tamper script ‘randomfakeproxy’

    [15:24:32] [CRITICAL] unhandled exception occurred in sqlmap/1.0-dev-2de12ef. It is recommended to retry your run with the latest development version from official GitHub repository at ‘https://github.com/sqlmapproject/sqlmap’. If the exception persists, please open a new issue at ‘https://github.com/sqlmapproject/sqlmap/issues/new’ (or less preferably send by e-mail to ‘sqlmap-users@lists.sourceforge.net’) with the following text and any other information required to reproduce the bug. The developers will try to reproduce the bug, fix it accordingly and get back to you
    sqlmap version: 1.0-dev-2de12ef
    Python version: 2.7.3
    Operating system: posix
    Command line: ./sqlmap.py -u http://www.hg –tamper randomfakeproxy.py
    Technique: None
    Back-end DBMS: None (identified)
    Traceback (most recent call last):
    File “./sqlmap.py”, line 88, in main
    init()
    File “/root/sqlmap/lib/core/option.py”, line 2301, in init
    _setTamperingFunctions()
    File “/root/sqlmap/lib/core/option.py”, line 935, in _setTamperingFunctions
    module = __import__(filename[:-3])
    File “/root/sqlmap/tamper/randomfakeproxy.py”, line 20
    blockOne = randrange(0, 255, 1)
    ^
    IndentationError: expected an indented block

  • Murat

    Teşekkür ederim. Çok güzel paylaşım