Haftanın Hackleri: Cross Domaindeki CSV'leri Çalmak, libinjection Bypass

Invicti Security Team - 02 Haziran 2017 -

Bu hafta Haftanın Hacklerinde Cross Domain’deki CSV’leri Çalmak ve libinjection Bypass konularını işledik. Bunun yanı sıra bu haftadan itibaren ilgimizi çeken araçları da sizlerle paylaşıyor olacağız.

Haftanın Hackleri: Cross Domaindeki CSV'leri Çalmak, libinjection Bypass

Bildiğiniz gibi Haftanın Hackleri serisinde web güvenliği ile alakalı güncel gelişmeleri, teknik kısımlarını ele alarak, özet halinde paylaşmaya çalışıyoruz. Bunun yanı sıra bu haftadan itibaren blog yazıları birlikte ile ilgimizi çeken araçları da sizlerle paylaşıyor olacağız.

Cross Domain’deki CSV’leri Çalmak

Meselenin özü JavaScript hata mesajlarını bir yönlendirmeyle (redirect) birlikte kullanmakla alakalı. Genelde modern browser’lar, JavaScript hata mesajlarını “Script error” gibi genel mesajlarla değiştirirler. JavaScript hata mesajlarının Cross domain’lere sızdırılması engellenebiliyorken, aynı domain’de JavaScript hata mesajlarının okunması mümkün. Aynı domain’de hata mesajlarının okunmasının, Developers Tools açık olduğu sürece, IE11’de de geçerli olduğu görülmüş.

Şartları sağladığı sürece sadece CSV dosyalarının değil her türde veri içeriği ele geçirilebiliyor. Ayrıca dahil edilen sayfanın kendi charset’i tanımlı olmadığı sürece farklı charset’ler kullanarak da veri çalmak mümkün.

Herhangi bir verinin sızdırılabilmesi için gerekli olan şartlarsa şunlar:

  • Verinin ele geçirilebilmesi için sayfa yüklenirken Developers Tools’un halihazırda açık olması gerekir.
  • Eklenen değerler geçerli JavaScript değişkenleri şeklinde olmalıdır.
  • Dahil edilen veriler, bütünüyle geçerli JavaScript kodlarından oluşmalıdır.

Bu problem Microsoft’a bildirilmiş fakat Microsoft, verinin çalınabilesi için Developers Tools’un açık olması gerektiğinden bunun şu an için fixlenmesi gereken bir problem olmadığını söylemiş. Buna rağmen bu bug’ın sonraki güncellemelerde giderilmesi amacıyla çalışılacağı ifade edilmiş.

PoC ve alınacak önlemler gibi bug ile alakalı diğer ayrıntılara şu bağlantıdan ulaşabilirsiniz: http://research.rootme.in/stealing-csvs-crossdomain/

Birçok WAF ve NGWAF’ta kullanılan libinjection kütüphanesi nasıl bypass edilir?

libinjection, birçok WAF-NGWAF geliştiricisi tarafından, performans açısından daha verimli olmasından dolayı, regular expression yerine tercih edilen açık kaynak kodlu bir kütüphanedir. Bunun yanısıra RegEx’ten daha güvensiz olduğu durumlar da bulunmaktadır.

libinjection tokenizer için bilinmeyen token

libijection geliştiricileri, mevcutta bulunan tüm SQL fonksiyonlarını listelemeye çalışmış fakat özel fonksiyonlar (stored procedure, trigger, dinamik fonksiyonlar v.b.) sebebiyle bu pek mümkün olamamıştır.

Tokenizer için mevcutta bulunan tüm SQL fonksiyonlarını listelemeye çalışmanın diğer kötü yanı da bazı fonksiyonların farklı veri tabanlarında değişik şekillerde kullanılmasıdır. Bu durum, listeleme işlemini içinden çıkılmaz bir hale dönüştürmektedir.

Örnek:

?id=‘-sqlite_version() UNION SELECT password FROM users- -

libinjection parser için bilinmeyen içerik

Eğer bir saldırgan, SQL injection zafiyetini kullanarak veri tabanını servis veremez hale getirmek isterse aşağıdaki gibi ağır bir sorgu kullanır:

?id=sleep(9999)

Bu girişim WAF tarafından tespit edilerek engellenecektir. Fakat libinjection parser’ı için parantezler tanımsız olduğundan aşağıdaki saldırı tespit edilemeyecektir:

?id=)-sleep(9999

Aynı durum MySQL’de dosya yazma için kullanılan aşağıdaki sorgu için de geçerlidir:

?id=1337 INTO OUTFILE ‘xxx’--

Bu şekilde kullanıldığında tespit edilebilmesine karşın aşağıdaki şekilde tespit edilememektedir:

?id=1337) INTO OUTFILE ‘xxx’--

Bu yöntem kullanılarak da bir tablo tamamen silinebilir:

?id=123);DROP TABLE users--

Ya da bir tablodan veri okunabilir:

?id=) OR (SELECT password FROM users ...

Parantezin yanısıra yorum satırı içerisindeki SQL cümleciklerinin de libinjection parser’ı için tanımlı olmadığı ve bu sebepten tespit edilemediği görülmüştür. Örneğin aşağıdaki gibi bir kullanımla da libinjection atlatılabilmektedir:

*/UNION SELECT password FROM users--

Yukarıda görüldüğü gibi SQLi gibi zafiyetler tam olarak anlaşılmadan web uygulamalarının korunması kolay olmamaktadır. Modern ve popüler çoğu güvenlik kütüphanesinin atlatılabildiği görülmüştür.

Detaylı bilgi için Ivan Novikov’ın yazısına göz atabilirsiniz: https://medium.com/@d0znpp/how-to-bypass-libinjection-in-many-waf-ngwaf-1e2513453c0f

ADEO Security IWS17 CTF

13-14 Mayıs tarihleri arasında ADEO staj programına öğrenci almak için CTF düzenledi. CTF soruları ve çözümleri İsmail Kundakçı tarafından bir blog yazısı halinde paylaşıldı. ADEOSecurity IWS17 CTF çözümleri için blog yazısına göz atabilirsiniz.

GIXY

Gixy, Yandex tarafından geliştirilmiş, Nginx konfigürasyonunu güvenlik açısından analiz eden bir araçtır. Gixy’nin ana hedefi yanlış güvenlik yapılandırmasından dolayı oluşan sorunları engellemek ve bunları otomatik olarak tespit edebilmektir.

https://github.com/yandex/gixy

Github Dorks

Github günümüzde çok popüler ve birçok açık kaynak kodlu projeye ev sahipliği yapıyor. Public repolarda bazen yanlışlıkla hassas bilgilerin de paylaşıldığına şahit olabiliyoruz (sunucu ile ilgili bağlantı bilgileri, authentication tokens vb.). Github Dorks projesi de bu tarz hassas bilgilerin paylaşılıp paylaşılmadığını tespit etmek amacıyla github dorklarını liste halinde sunan ve kendi reponuzu tarama imkanı sunan bir araçtır.

https://github.com/techgaun/github-dorks