Selenium ile Zed Attack Proxy Güvenlik Testleri Yapma

SefaMelek
KoçSistem
Published in
8 min readNov 22, 2023

Merhaba bu yazımda sizlere Selenium kullanarak ZAP güvenlik testlerini nasıl yapacağımızdan bahsedeceğim.

İlk olarak sizlere bunun nasıl çalıştığını anlatmak isterim. ZAP bir proxy sunucusu oluşturur ve web sitenizin trafiğinin bu sunucu üzerinden geçmesini sağlar. Böylelikle web sitenizdeki güvenlik açıklarını yakalamanıza yardımcı olan otomatik tarayıcılardan oluşur. Bu çerçevede selenium kullanarak yaptığınız gezintilerdeki güvenlik açıklarını sizlere raporlayacaktır.

KURULUMLAR

OWASP-ZAP

OWASP-ZAP’ın resmi sitesine giderek işledim sisteminize uygun kurulum dosyasını indirip kuruyoruz.https://www.zaproxy.org/download/

Intelij IDEA

https://www.jetbrains.com/idea/download/ sayfasına gidip community edition versiyonunu indiriyoruz.

JAVA

Windows için:

Java Sürümünü Belirleme:

Hangi Java sürümünü kurmak istediğinize karar verin. Genellikle, Java’nın LTS (Long-Term Support) sürümleri tercih edilir. Örneğin, Java 11 veya Java 17.

Java JDK İndirme ve Kurulum:

  • Java Development Kit (JDK) sürümünü Oracle JDK veya OpenJDK web sitelerinden indirebilirsiniz. OpenJDK, genellikle özgür ve açık kaynak bir seçenek olarak tercih edilir.
  • İndirilen dosyayı çalıştırarak JDK’yı yükleyin. Yükleyici sizi yönlendirecektir.

Java PATH Ayarı:

  • Java’yı kullanılabilir hale getirmek için PATH değişkenini güncellemeniz gerekebilir. Bunun için şu adımları takip edebilirsiniz:
  • Bilgisayarım > Özellikler > Gelişmiş sistem ayarları > Ortam Değişkenleri
  • “Sistem Değişkenleri” bölümünde, “Path” seçip “Düzenle” düğmesine tıklayın.
  • Yeni bir yol ekleyerek Java’nın bin dizinini ekleyin, örneğin: C:\Program Files\Java\jdk-11.0.14\bin

Java’nın Kurulu Olduğunu Kontrol Etme:

  • Yüklemenin başarıyla tamamlandığını kontrol etmek için bir komut istemcisinde şu komutu kullanabilirsiniz:

Linux için:

Java Sürümünü Belirleme:

  • Öncelikle, hangi Java sürümünü kurmak istediğinize karar vermelisiniz. Genellikle, Java’nın LTS (Long-Term Support) sürümleri tercih edilir. Örneğin, Java 11 veya Java 17.

Java JDK İndirme ve Kurulumu:

  • Java Development Kit (JDK) sürümünü Oracle JDK veya OpenJDK web sitelerinden indirebilirsiniz. OpenJDK, genellikle özgür ve açık kaynak bir seçenek olarak tercih edilir.
  • İndirilen dosyayı sunucunuza kopyalayın ve ardından aşağıdaki gibi yükleyin:

Java PATH Ayarı:

  • Java’yı kullanılabilir hale getirmek için PATH değişkenini güncellemelisiniz. veya gibi dosyalarda aşağıdaki gibi bir satır ekleyebilirsiniz:
  • Ardından, güncellenmiş PATH’ı etkinleştirmek için şu komutu çalıştırın:
  • Java’nın doğru bir şekilde yüklendiğini ve PATH’ın güncellendiğini kontrol etmek için şu komutları kullanabilirsiniz:

MAVEN

Windows için:

  1. Maven İndirme ve Kurulum:
  • Apache Maven’i resmi web sitesinden indirebilirsiniz.
  • İndirilen dosyayı bir klasöre çıkartın. Örneğin, C:\Program Files\Apache\maven-3.8.5 gibi bir dizine kopyalayabilirsiniz.
  1. Maven PATH Ayarı:
  • Maven’ı kullanılabilir hale getirmek için PATH değişkenini güncellemeniz gerekebilir:
  • Bilgisayarım > Özellikler > Gelişmiş sistem ayarları > Ortam Değişkenleri
  • “Sistem Değişkenleri” bölümünde, “Path” seçip “Düzenle” düğmesine tıklayın.
  • Yeni bir yol ekleyerek Maven’ın bin dizinini ekleyin, örneğin: C:\Program Files\Apache\maven-3.8.5\bin
  1. Maven’ın Kurulu Olduğunu Kontrol Etme:
  • Yüklemenin başarıyla tamamlandığını kontrol etmek için bir komut istemcisinde şu komutu kullanabilirsiniz:

Linux için:

  1. Maven İndirme ve Kurulum:
  • Apache Maven’i resmi web sitesinden indirebilirsiniz.
  • İndirilen dosyayı sunucunuza kopyalayın ve ardından aşağıdaki gibi yükleyin:
  1. Maven PATH Ayarı:
  • Maven’ı kullanılabilir hale getirmek için PATH değişkenini güncellemelisiniz. ~/.bashrc veya ~/.bash_profile gibi dosyalarda aşağıdaki gibi bir satır ekleyebilirsiniz:
  • Ardından, güncellenmiş PATH’ı etkinleştirmek için şu komutu çalıştırın:
  • Maven’ın doğru bir şekilde yüklendiğini ve PATH’ın güncellendiğini kontrol etmek için şu komutları kullanabilirsiniz:

OWASP-ZAP Arayüzü Ayarları

İlk olarak OWASP-ZAP uygulamasını çalıştırıyoruz. Açılan arayüzde sol altta bulunan adresini ve ayarlar içindeki API bölümünde bulunan API Key bilgisini daha sonra selenium projesinde kullanmak üzere kenara kaydediyoruz.

Intelij IDEA’da Selenium-OWASP Projesi Oluşturma:

Maven Projesi Yaratma

  • IntelliJ IDEA’yı açın ve “File-New-Project” (Yeni Proje Oluştur) seçeneğini seçin.
  • “Maven Archetype” şablonunu seçin
  • Name Alanına Projenizin adını girin
  • Location kısmına projeyi kuracağınız dizini seçin
  • JDK kısmında yüklemiş olduğunuz java sürümünü seçin
  • Catalog internal seçilebilir
  • Archetype kısmında ise aşağıdaki görselde bulunan maven-archetype-quickstart seçeneğini seçin
  • Son olarak create butonuna tıklayarak projenizi oluşturabilirsiniz
  • Intelij gerekli kurulumları yaptıktan sonra dosya ağacınız aşağıdaki şekilde gözükecektir:

Dosya Ağacı

selenium-example

├── .idea
│ ├── ...

├── src
│ ├── main
│ │ └── java
│ │ └── org
│ │ └── example
│ │ └── App.java
│ └── test
│ └── java
│ └── org
│ └── example
│ └── AppTest.java

├── target
│ ├── ...

├── .gitignore
├── pom.xml
└── README.md
  • İlk olarak açılan projenin içinde bulunun pom.xml dosyasının içerisine gireceğiz ve proje için gerekli olan bağımlılıkların kurulumunu sağlayacağız. Bir Pom.xml dosyasının içinde aşağıdaki alanlar bulunur:
  • <project>: Maven proje tanımının başlangıcı.
  • <modelVersion>4.0.0</modelVersion>: Maven model versiyonunu belirtir. Bu, kullanılan Maven POM modelinin hangi sürüm olduğunu gösterir.
  • <groupId>org.example</groupId>: Projenin grup kimliği. Genellikle bu, projenin ait olduğu organizasyonun domain adını ters çevirerek belirlenir.
  • <artifactId>ZAP_Selenium</artifactId>: Projenin sanal bir depo içindeki adıdır. Bu, proje tarafından üretilen JAR dosyasının adını belirler.
  • <version>1.0-SNAPSHOT</version>: Proje sürüm numarasını belirtir. -SNAPSHOT sürümü, henüz resmi bir sürüm olmadığını ve geliştirme aşamasında olduğunu ifade eder.
  • <properties>: Proje özelliklerini belirtir. Bu örnekte, Java derleme sürümü ve Selenium sürümü gibi değerleri içerir.
  • <dependencies>: Proje bağımlılıklarını belirtir. Bu, projenin başka kütüphanelere veya dış kaynaklara bağlı olduğu anlamına gelir.
  • <dependency>: Her bağımlılığı tanımlayan etiket. Grup kimliği, sanal depo adı ve sürüm numarası içerir.
  • <build>: Projenin derlenmesi ve paketlenmesi ile ilgili yapılandırmayı içerir.
  • <plugins>: Maven eklentilerini içerir.
  • <plugin>: Maven eklentilerini tanımlar. Örneğin, derleme eklentisi (maven-compiler-plugin) bu bölümde konfigüre edilmiştir.
  • <groupId>org.apache.maven.plugins</groupId>: Eklentinin grubu.
  • <artifactId>maven-compiler-plugin</artifactId>: Kullanılan eklentinin adı.
  • <version>3.8.1</version>: Eklentinin sürüm numarası.
  • <configuration>: Eklentinin konfigürasyonunu belirtir. Bu örnekte, Java derleme sürümünü belirlemek için kullanılır.
  • Bizim projemiz için aşağıdaki bağımlıklar gerekli olacak
  • Selenium
  • TestNG
  • ZAP Client API
  • ZAP
  • Selenium ChromeDriver

POM.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ZAP_Selenium</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<selenium-version>4.13.0</selenium-version>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium-version}</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.zaproxy/zap-clientapi -->
<dependency>
<groupId>org.zaproxy</groupId>
<artifactId>zap-clientapi</artifactId>
<version>1.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
<!-- https://mvnrepository.com/artifact/org.zaproxy/zap -->
<dependency>
<groupId>org.zaproxy</groupId>
<artifactId>zap</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>${selenium-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<targets>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
  • Bunun ardından solda bulunan dosya ağacının içinde src/main kısmına sağ tıklayıp new directory seçeneğini seçiniz ve orada çıkan resources seçeneğini seçiniz
  • Ardından resources klasörünün içine ise new file diyerek config.properties dosyası oluşturunuz.
  • Yeni oluşturmuş olduğunuz config.properties dosyasının içerisine girerek daha önce ZAP arayüzünden aldığımız verileri gireceğiz

config.properties

ZAP_PROXY_ADDRESS=localhost
ZAP_PROXY_PORT=8080
ZAP_API_KEY=BURAYA API KEY YAZIN
  • Daha sonra src/java’nın içine utils isminde bir directory daha ekliyoruz onun içine de Utils.java dosyası oluşturuyoruz.
  • Oluşturduğumuz Utils.java dosyasının içine ise aşağıdaki kodu yapıştırıyoruz.

Utils

package utils;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.Duration;
import java.util.Properties;
public class Utils {
public static String getProperty(String fileName,String propertyName) {
String propertyValue = null;
try (InputStream input = new FileInputStream("./src/main/resources/"+fileName+".properties")) {
Properties prop = new Properties();
prop.load(input);
propertyValue = prop.getProperty(propertyName);
} catch (IOException ex) {
ex.printStackTrace();
}
return propertyValue;
}
}
  • Daha sonrasında src/test/java altına yeni bir java projesi oluşturuyoruz ben ismine ZAPTest diyorum. Dosyanın içeriği aşağıdaki şekilde:

ZAPTest.java

import org.openqa.selenium.By;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.zaproxy.clientapi.core.ApiResponse;
import org.zaproxy.clientapi.core.ClientApi;
import org.zaproxy.clientapi.core.ClientApiException;
import java.time.Duration;
import static utils.Utils.*;
public class ZAPTest {
static final String ZAP_PROXY_ADDRESS = getProperty("config","ZAP_PROXY_ADDRESS");
static final String ZAP_PROXY_PORT = getProperty("config","ZAP_PROXY_PORT");
static final String ZAP_API_KEY = getProperty("config", "ZAP_API_KEY");
private WebDriver driver;
private ClientApi api;
@BeforeMethod
public void setup(){
String proxyServerUrl = ZAP_PROXY_ADDRESS + ":" + ZAP_PROXY_PORT;
Proxy proxy = new Proxy();
proxy.setHttpProxy(proxyServerUrl);
proxy.setSslProxy(proxyServerUrl);
ChromeOptions options = new ChromeOptions();
options.setAcceptInsecureCerts(true);
options.setProxy(proxy);
//options.addArguments("--headless");
driver = new ChromeDriver(options);
api = new ClientApi(ZAP_PROXY_ADDRESS, Integer.parseInt(ZAP_PROXY_PORT), ZAP_API_KEY);
}
@Test
public void WebSecurityTest() throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
driver.get("https://www.example.com");
driver.findElement(By.id("button")).click
Thread.sleep(5000);
}
@AfterMethod
public void tearDown() throws Exception {
if (api != null) {
String title = "ZAP Selenium - Proje Adın";
String template = "traditional-html";
String description = "ZAP";
String reportfilename = "Proje Adın-report.html";
String targetFolder = System.getProperty("user.dir");
try {
ApiResponse res = api.reports.generate(title, template, null, description, null, null, null,null, null, reportfilename,null, targetFolder,null);
System.out.println("Oluşturulan Zap Raporu " + res.toString());
} catch (ClientApiException ex) {
throw new Exception(ex);
}
}
driver.quit();
}
}

Java Selenium projesini adım adım açıklayalım:

  • Selenium ve ZAP Kütüphaneleri:
import org.openqa.selenium.By; 
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.zaproxy.clientapi.core.ApiResponse;
import org.zaproxy.clientapi.core.ClientApi;
import org.zaproxy.clientapi.core.ClientApiException;

Bu kısımda, Selenium WebDriver ve ZAP Client API gibi kütüphanelerin import edildiği görülmektedir. Bu kütüphaneler, tarayıcıları kontrol etmek ve güvenlik testleri yapmak için kullanılır

  • ZAP Proxy Adresi ve Portu Tanımlama:
static final String ZAP_PROXY_ADDRESS = getProperty("config","ZAP_PROXY_ADDRESS"); 
static final String ZAP_PROXY_PORT = getProperty("config","ZAP_PROXY_PORT");
static final String ZAP_API_KEY = getProperty("config", "ZAP_API_KEY");
  • ZAP Proxy adresi, portu ve API anahtarı gibi konfigürasyon bilgileri tanımlanır. Bu bilgiler, ZAP Proxy ile etkileşimde bulunmak için kullanılır
  • WebDriver ve ZAP API İnstance’larını Oluşturma:
private WebDriver driver; private ClientApi api;
  • WebDriver ve ZAP API nesneleri tanımlanır.
  • Setup Metodu:
private WebDriver driver; private ClientApi api;
  • Her test metodunun çalışmadan önce çalışacak olan setup metodu. Bu metod, WebDriver ve ZAP API nesnelerini oluşturur.
  • WebDriver ve Proxy Ayarları:
String proxyServerUrl = ZAP_PROXY_ADDRESS + ":" + ZAP_PROXY_PORT; 
Proxy proxy = new Proxy(); proxy.setHttpProxy(proxyServerUrl);
proxy.setSslProxy(proxyServerUrl);
ChromeOptions options = new ChromeOptions();
options.setAcceptInsecureCerts(true);
options.setProxy(proxy); driver = new ChromeDriver(options);
  • WebDriver ve Proxy ayarları yapılır. Tarayıcı, ZAP Proxy üzerinden yönlendirilir.

@Test Metodu:

@Test public void WebSecurityTest() throws InterruptedException { // ... }
  • Gerçekleştirilmek istenen web güvenlik testini içeren test metodudur. Örneğin, “https://www.example.com" adresine gidilir ve belirli bir süre sonra bir elemente tıklanır.

@Teardown Metodu:

@AfterMethod public void tearDown() throws Exception { // ... }
  • Her test metodunun çalıştıktan sonra çalışacak olan teardown metodu. Bu metod, ZAP raporunu oluşturur ve WebDriver’ı kapatır.
  • ZAP Raporu Oluşturma ve WebDriver’ı Kapatma:
// ZAP raporu oluşturma 
String title = "ZAP Selenium - Proje Adın";
String template = "traditional-html";
String description = "ZAP";
String reportfilename = "Proje Adın-report.html";
String targetFolder = System.getProperty("user.dir");
try { ApiResponse res = api.reports.generate(title, template, null, description, null, null, null,null, null, reportfilename,null, targetFolder,null);
System.out.println("Oluşturulan Zap Raporu " + res.toString()); }
catch (ClientApiException ex) { throw new Exception(ex); } // WebDriver'ı kapat driver.quit();
  • ZAP Client API kullanılarak rapor oluşturulur ve bu raporun çıktısı konsola yazdırılır. Ardından WebDriver kapatılır.

Dosya Ağacının Son Hali Aşağıdaki Şekilde Olur:

Dosya Ağacı

selenium-example

├── .idea
│ ├── ...

├── src
│ ├── main
│ │ ├── java
│ │ | └── utils
│ │ | └── Utils.java
│ | └──Resources
│ │ └── config.properties
│ └── test
│ └── java
│ └── ZAPTest.java
├── target
│ ├── ...

├── .gitignore
├── pom.xml
├── RaporAdın.html
└── README.md
  • Projeyi bir kez başarı ile çalıştırdıktan sonra ise Rapora verdiğin isim doğrultusunda bir html dosyası oluşur o dosyanın içine girerek owasp-zap raporunu inceleyebilirsiniz

Selenium Projesini çalıştırmadan önce kesinlikle owasp-zap uygulaması açık olmalıdır! Aksi halde hata alırsınız

Referanslar:

--

--

SefaMelek
KoçSistem

QA at KoçSistem | Founder of YouTube @hafifmuhendis channel