Owasp Top 10 — A1 Injection

Merhaba, bu yazımda Injection türündeki zafiyetlerle ilgili kısa örnekler paylaşacağım.

Adem Kanat
DataBulls
3 min readJun 30, 2023

--

3 farklı dilde kod yapısı olarak zafiyetli kod yapıları ve zafiyetin nasıl giderildiğine dair örnekler paylaşacağım.

Zafiyetin Açıklaması : Injection türündeki zafiyetler uygulamanın girdi noktalarından alınan değerlerin doğru kontrol edilmemesinden kaynaklanmaktadır. Burada işaret edilen bulgular LDAP Injection , SQL Injection , Command Injection gibi zafiyetler olabilir.

Zafiyetli PHP Kod Örneği (SQL Injection)

public static function raporSil(int $reportID)
{
$query = self::$database->exec(
‘DELETE FROM reports WHERE id=’. $reportID .’ AND user_uid=’. $user->uid);

Girdi Kontrolü Yapılmış PHP Kod Örneği

query = self::$database->prepare(

‘Delete from reports Where user_uid:uid AND id=:id’);

$query->bindValue(‘:uid’, $user->uid);

Return $query->execute();

JAVA (Command Injection)

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class CommandInjectionExample {

public static void main(String[] args) {

try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print(“IP : “);

String userInput = reader.readLine();

String command = “ping -c 4 “ + userInput;

Kodu metin olarak yazdığımda editör kabul etmediğinden görsel olarak ekledim.

BufferedReader processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line;

while ((line = processOutput.readLine()) != null) {

System.out.println(line); }

processOutput.close();

} catch (IOException e) {

e.printStackTrace(); } } }

userInput, doğrudan ping komutuna dahil edilmektedir. Bu durumda, kötü niyetli bir saldırgan, girdi noktasına farklı komutları enjekte ederek komut yürütme işlemini manipüle edebilir.

Girdi Kontrolü Yapılmış Java Kod Örneği

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class SecureCommandExecutionExample {

public static void main(String[] args) {

try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print(“IP : “);

String userInput = reader.readLine();

ProcessBuilder processBuilder = new ProcessBuilder(“ping”, “-c”, “4”, userInput);

Process process = processBuilder.start();

BufferedReader processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));

String line;

while ((line = processOutput.readLine()) != null) {

System.out.println(line); }

processOutput.close();

} catch (IOException e) {

e.printStackTrace(); } } }

.NET (LDAP Injection)

string userInput = “username”;
string ldapQuery = “(&(objectClass=user)(|(cn=” + userInput + “)(sn=” + userInput + “)))”;

DirectoryEntry entry = new DirectoryEntry(“LDAP://localhost:389”);
DirectorySearcher searcher = new DirectorySearcher(entry, ldapQuery);

SearchResultCollection results = searcher.FindAll();
foreach (SearchResult result in results)
{
……….
}

Kötü niyetli bir saldırgan, userInput değişkeni sayesinde sorguyu manipüle edebilir. (LDAP sorgusuna eklemeler yaparak, normalde yapamayacağı LDAP sorgularını yapabilir.)

Girdi Kontrolü Yapılmış .NET Kod Örneği

string userInput = “username”;
string ldapQuery = “(&(objectClass=user)(|(cn={0})(sn={0})))”;
ldapQuery = string.Format(ldapQuery, userInput);

DirectoryEntry entry = new DirectoryEntry(“LDAP://localhost:389”);
DirectorySearcher searcher = new DirectorySearcher(entry, ldapQuery);

SearchResultCollection results = searcher.FindAll();
foreach (SearchResult result in results)
{
……

}

string.Format yöntemi kullanılarak kullanıcıdan aldığı girdiyi parametrelere ekler. Bu, kullanıcı girişinin sorguya doğrudan dahil edilmemesini sağlar ve LDAP enjeksiyonunu engeller.

Zafiyet Detayı :

Günümüzde injection zafiyetlerinin oluşması biraz daha zordur. Kullanılan framework’ler genellikle sorgu oluşturma işlemlerinde parametreli sorguları veya ORM (Object-Relational Mapping) araçlarını kullanarak güvenliğe daha fazla önem verir. Bu sayede direkt olarak kullanıcı girişlerinin sorgulara dahil edilmesiyle oluşabilecek zafiyetler önlenir. Ancak, özel olarak oluşturulan sorgularda (ihtiyaç gereği geliştiricinin eklemeler yaptığı diyebiliriz.)veya güvenlik önlemlerinin uygulanmadığı durumlarda, injection zafiyetleri hala mevcut olabilir. Bu nedenle, geliştiricilerin güvenlik bilinciyle kodlama yapması, doğru giriş doğrulama ve filtreleme yöntemlerini kullanması önemlidir.

Çözüm Önerisi :

1. Girdi Alanlarının Parametrelere Atanması: Veritabanı sorgularında veya sistem komutlarında kullanıcı girişlerini doğrudan birleştirmek yerine parametreli sorguları kullanın. Bu, girişleri güvenli bir şekilde işlemek ve kötü niyetli kod enjeksiyonunu engellemek için önemlidir.

2. Girdi Doğrulama: Kullanıcı girdilerini doğrulayın ve gereksiz karakterleri veya potansiyel kod enjeksiyonunu engellemek için filtreleyin. Örneğin, yalnızca beklenen karakterleri kabul eden bir beyaz liste doğrulama yöntemi kullanabilirsiniz. (Yorum alanı gibi alanlarda bu tarz bir filtreleme yapılamayacaktır. Zafiyetin giderilmesi için sadece çözüm önerilerinden birini kullanmak bazen yeterli olabileceği gibi bazen de yeterli olamayacaktır. Zafiyetlerin giderilmesi için doğru çözümün uygulanması da çok önemlidir.)

Diğer Yazılar:

--

--