OWASP ZAP ile Otomatik Güvenlik Testi

OWASP ZAP ile Otomatik Güvenlik Testi

Merhaba Arkadaşlar, bu yazımda sizlere CI/CDP sistemlerinize güvenlik testleri için OWASP ZAP ile otomatik bir adım eklemenize yarayacak temel adımlardan bahsetmeye çalışacağım.

Owasp Zap Nedir ve Bu Testin Amacı Nedir?

OWASP (Open Source Web Application Security Project) Wikipedia’nin tanımıyla, web uygulama güvenliği alanında bedava erişilebilen yayınlar, metodolojiler, dokümanlar, araçlar ve teknolojiler üreten online bir topluluk. ZAP (Zed Attack Proxy) ise bu topluluğun geliştirdiği en önemli araçlardan bir tanesi. Bu aracın temel amacı web uygulamaları için güvenlik taraması yapmak.

Bu yazının ve yazıda anlatacağım test metodunun amacı size web güvenlik testinin nasıl yapılacağını veya inceliklerini öğretmek değil, aynı şekilde size ZAP in tüm teknik detaylarını vermek de değil. Burada yapmayı amaçladığım şey size bu işi otomatik olarak yapmanın ilk adımını göstermek ve detayları güzelleştirmeyi size bırakmak.

İzlenecek Yol ve Yapılacak İşlemler

Bu test için ben web otomasyonu kısmında Ruby üzerinde Cucumber ve Capybara kullandım ama hangi araç veya framework’ün kullanıldığının hiçbir önemi yok, herhangi bir web otomasyon yöntemiyle bu işlemi gerçekleştirebilirsiniz. Yazdığım kodları https://github.com/swtestacademy/zap-security/tree/swtestacademy adresinden inceleyebilirsiniz. Şimdi bu güvenlik testini gerçekleştireceğimiz zaman izleyeceğimiz yolu kabaca maddelendirelim ve bu maddeleri anlatalım.

Ön Koşullar: Bu işlemleri gerçekleştireceğimiz bilgisayar/build agent/container üzerinde java (tercihen 8) kurulu olmalı. ZAP cross-platform versiyonu indirilip ilgili makinede extract edilmiş olmalı.

1) ZAP konfigürasyonu: ZAP üzerinde hangi adresin hangi portunun dinleneceğini belirtmeniz gerekiyor. Ben projemde localhost:8095 adresini kullandım. Bu ayarı Tools -> Options -> Local Proxy ekranından yapabilirsiniz. Eğer çalıştığınız şirkette bir proxy üzerinden internete çıkıyorsanız, bu ayarı da Tools -> Options -> Connection ekranından yapabilirsiniz.

2) Otomasyon kodumuzda browser konfigürasyonu: Benim projemde daha önce de belirttiğim gibi web otomasyonu için Capybara ve driver olarak da Selenium Webdriver kullandım. Bu konfigürasyonda browser olarak da Firefox tercih ettim. Kodumuz çalıştığında browser’ın istediğimiz proxy üzerinden internete çıkması için aşağıdaki kodu env.rb dosyamıza yazmamız gerekiyor.

Capybara.register_driver :selenium do
  ["network.proxy.type"] = 1
  profile["network.proxy.http"] = "localhost"
  profile["network.proxy.http_port"] = 8095
  Capybara::Selenium::Driver.new(app, :profile => profile)
end

3) ZAP’ı kod içinden ayağa kaldırmak: Testlerimizi koşmadan önce ZAP i ayağa kaldırmamız gerekiyor. Bunun için Ruby de aşağıdaki kodu çalıştırdım.

IO.popen("./zap.sh -daemon")

Ruby‘de external bir program çalıştırmak için birkaç farklı yöntem var (kernel, exec, backtick gibi) ancak bunların hiçbiri programı çalıştırdıktan sonra otomatik olarak kontrolü ruby kodunun geri kalanına devretmiyor. Sadece IO.popen istediğiniz programı çalıştırıp, kodun geri kalanını işletmeye devam ediyor.

4) Web otomasyonlarımızı koşmak: Web uygulamalarını güvenlik testine tabi tutmak için aktif ve pasif yollar var. Aktif yöntemlerde siteye Ajax crawlerlar’la saldırılar düzenleyebilirsiniz. Biz projemizde kendimize ait olmayan bir site üzerinde test yaptığımızdan pasif bir yöntem kullanacağız. Bu yöntemde bir kullanıcının izleyeceği temel bazı yolları web otomasyonumuzla gidecek ve ZAP in sitedeki güvenlik açıklarını algılamasını sağlayacağız. Bu yolları ne kadar çeşitlendirir ve ne kadar arttırırsanız, ZAP in açık bulma ihtimalini o kadar arttırmış olursunuz. Bizim projemizde izlediğimiz yol:

  • akakce.com adresine git.
  • Bir ürün ara.
  • Belli bir fiyat aralığına göre sonuçları filtrele.
  • Filtrelenmiş sonuçlardan ilkinin detayına git.

Yukarıda anlattığım senaryonun kodu aşağıdaki şekilde:

visit ''
page.driver.browser.manage.window.maximize
find_by_id('q').set 'lg g4'
find('button.grd2').click
find_by_id('PrList').find('div.p', match: :first)
find_by_id('pf1').set '100'
find_by_id('pf2').set '1000'
find('button.grd1').click
find_by_id('PrList').find('li.firstRow', match: :first).find('div.p').click
find('tr.first', match: :first)
sleep 20

Kodun son satırındaki 20 saniyelik beklemenin sebebi, ZAP in bulduğu uyarıları işleyip API’a yansıtmasının zaman alabilmesi. Bu beklemeyi statik bir süreyle değil de API’ın sağladığı statü kontrolleri ile yapmak mümkün, detayları size bırakıyorum.

5) ZAP API ile uyarıları okumak ve raporlama: Testlerimiz bitti ve bulunan hatalar bizi bekliyor. Onlara ulaşmak için ZAP API kullanacağız. ZAP instance’iniz ayakta olduğu sürece browser’ınızdan ZAP’ın <dinledigi proxy>/UI adresine giderseniz ZAP API in size sağladığı tüm işlevleri görebilirsiniz. Biz kodumuzda uyarılara ulaşmak için aşağıdaki kodu kullandık.

RestClient.get "http://#{$zap_proxy}:#{$zap_proxy_port}/json/core/view/alerts"

Hataları aldıktan sonra artık onları derecelerine göre ayırabilir, istediğiniz şekilde formatlayabilir ve raporlayabilirsiniz. Bizim kodumuza baktığınızda eğer yüksek öncelikli bir hata bulunursa testlerin başarısız olacağını ve dolayısıyla build’imizin kırılacağını görebilirsiniz. Siz de kendi kriterlerinize uygun bir şekilde bir test planı oluşturabilir ve build pipeline’ınızı dizayn edebilirsiniz.

Sonuç

Burada anlatmaya çalıştığım yöntem aslında benim için bile tam bir başlangıç. Yapılabilecek birçok iyileştirme var. Güvenlik testlerinin dışarıdan manuel insan müdahalesine ihtiyaç duymadan yapılabileceğini anlatmayı amaçlayan bu yazım umarım faydalı olur. Burada anlatılan teknikleri uyguluyor olmanın başka hiçbir güvenlik veya sızma testine ihtiyacınız olmadığı anlamına gelmeyeceğini unutmayın. Güvenlik çok ciddi bir iş ve gerçekten işinin uzmanı kişiler tarafından ele alınıp, bir mühendislik bakış açısıyla incelenmesi gerekiyor. Buradaki amaç geliştirme ekibine ürünlerinin güvenliği hakkında daha ilk iterasyondan itibaren feedback vermek ve temel düzeyde bir güven sağlamak. Kapsamlı güvenlik testlerine gelmeden bulunabilecek güvenlik açıklarını erkenden bulup elimine etmek.

OWASP ZAP ile Güvenlik Testi Otomasyonu Etkinlik Videosu

ThoughtWorks ve Test Hive Hakkında

Thoughtworks 1993 yılından beri, 12 ülkede 34 ofisi ve 3600 den fazla danışmanıyla yazılım danışmanlığı yapan bir şirkettir. Yazılımda takip eden ve uygulayan olmakla yetinmeyip üreten, yeni yollar keşfeden ve oyunu değiştiren bireylerden oluşmuş bir şirket olarak piyasada kendisine önemli bir yer edinmiştir. Thoughtworks yaklaşık 2 yıldır Türkiye’de faaliyet göstermektedir. Ülkemizin yazılım alayışını değiştirmek gibi iddialı bir misyon edinmiş ve bu yönde birçok topluluğun kurulmasına on ayak olmuş olan Thoughtworks, yazılım testi alanında bu misyonu üstlenmiş Test Hive grubuna da sponsor olmaktadır. Test Hive, yazılım testinde ilerlemeye yardımcı olmak için düzenli olarak etkinlikler düzenlemekte, makaleler ve araştırmalar paylaşmakta, eğitimler düzenlemekte ve test mühendislerine bilgi paylaşımı için ortamlar sunmaktadır. www.testhive.org

Alper Mermer Hakkında

Hacettepe Üniversitesi Bilgisayar Mühendisliği mezunu olan Alper Mermer, 10 yıldan fazla bir süredir yazılım sektöründe çalışmakta olup, bu sürenin son 8 yılından fazlasını aktif test yaparak geçirmiştir. Finans, Telco ve online retail sektorlerinde tecrübesi bulunan Alper Mermer, Test Hive grubunun kurucusu ve organizatörüdür. Alper, şu anda Thoughtworks Türkiye ofisinde Quality Enforcer ünvanıyla görev yapmaktadır.

3 thoughts on “OWASP ZAP ile Otomatik Güvenlik Testi”

  1. Bu uygulamayı (OWASP) sunucuda aktif ettikten sonra wordpress üzerine kurulu web sitemde yazı ekleyemiyor ve yayınlayamıyorum. Bu problemi nasıl çözebilirim? Teşekkür ederim.

    Reply
  2. Merhaba hocam, owasp zap üzerinden authentication ayarları yaparak Manuel Explore’da projeyi çalıştırıp manuel test koşuma yaparak testleri zap üzerinde kayıt aldırtabiliyoruz. Yani bu şekilde yaptığımızda test senaryolarını zapa gösterip kayıtta tuturabiliyor ve bu senaryolar için saldırı başlatabiliyoruz. Direk bu şekilde senaryoları kaydettikten sonra bu kayıtlı senaryoları otomatikleştimemiz mümkün mü? sadece yeni url güncelleyerek her version sonrasında uygulamamın güvenlik testlerini jenkins den tetiklemek istiyorum. Geri dönüşünüz benim için çok kıymetli şimdiden teşekkürler

    Reply
    • MErhaba boyle bisey yapmadim ama jenkins groovy dosyasi icersisinde shell script yazarak belki kaydedilmis zap testleri tetiklenebilir, tetiklenme oncesi de URL gibi guncellemeleri yaparabilirsiniz diye dusunuyorum.

      Reply

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.