4 Mayıs 2020 Pazartesi

SQL Injection

Data Breach Nedir?
Data Breach/Data Leak olması için veri tabanı olmak zorunda değil. Elimizde bir şöyle bir yapı olsun
No, a database is not always involved.

Let's come up with a random service that happens to be moderately popular. A fairly standard set of components includes:

- a user-facing client (webpage or app)
- an API for programmatic access
- a backend to serve clients (API and user-facing)
- a database for the backend to store data
- backups of the database
- data exports to third-parties for analytics or even reselling
Every single component can be the source of a data leak.
SQL Injection Nedir?
SQL Injection karşımıza çıkan bir saldırı yöntemi. Aşağıda konu hakkında aldığım notlarım var. Bu saldırılardan kurtulmanın en kısa yolu şöyle :)
The solution. The only solution. Is to eliminate SQL from the system entirely. If there is no SQL engine, then there can be no SQLi attacks.
Penetration Testing
SQLi saldırısı bence Penetration Testing kapsamında sayılabilir. 
 
Ekip Olarak Alınabilecek Karşı Tedbirler
Ekip olarak alınabilecek bazı tedbirler şöyle
Step 1) Parameterize your SQL.
Step 2) Ensure you are using the SQL DB Connection library to set values for your parameters, not just setting them inline. This is the actual defense against SQL injection.
Step 3) Don't do query building in SQL. That way lies madness.
Step 4) add a config switch to propagate the error all the way back to the user. Turn it on during testing.
Step 5) Tell your penetration testers to find a way to generate a SQL error with an odd number of single quotes or shut up.
Yazılım Anlamında Alınabilecek Karşı Tedbirler
Karşı tedbir için bazı öneriler şöyle.
1. Prepared Statement kullanmak
2. Stored procedure kullanmak
3. Hata mesajlarını daha az bilgi sızdırır hale getirmek (Sanitization)

Açıklaması şöyle.
The problem of SQL injection is essentially the mixing of logic and data, where what should be data is treated as logic. Prepared statements and parameterized queries actually solve this issue at the source by completely separating logic from data, so injection becomes nearly impossible.

Regular Expression İle Kontrol
SQL cümlesini regular expression ile kontrol etmek çok iyi bir fikir değil.

String Escape Metodları İle Kontrol
Bu da çok iyi bir fikir değil.

1. URL Injection Yöntemi
URL'ye eklenen SQL'den sonra "-- -" karakterleri gelir. Son çizgi karakterinin açıklaması şöyle
The last dash basically protects the trailing space. If you exploit SQL injection in a browser (e.g. via the URL), some browsers remove trailing space characters. Some prominent SQL flavors explicitly require the Space after Dash-Dash to treat the sequence as the start of a comment, so attackers often add a character after the Space to protect it against such browser optimization.

You could use any character to accomplish this. -- x would do exactly the same.
Örnek
Şöyle yaparız
http://example.com/badendpoint?q=<script>$('input').value="';DELETE FROM USERS;--";
$('form').submit()</script>
2. Single Quote Injection Yöntemi
Veriye tek tırnak eklenir. Verinin içinde tek tırnak olduğu için SQL cümlesi istenileni yapmaz. Tek tırnak içeren bazı örnekler şöyle.
Person names can contain single quotes (such as O'Reilly)
Text fields can contain single quotes (such as I'm pretty sure)
Number fields can contain single quotes (EUR 1'000'000)
Örnek
Bu örnekte Second Order SQL injection var. Açıklaması şöyle
Second order SQL injection is a two step process. First, the attacker adds something to your application but doesn’t immediately execute it. They might be waiting for more data or waiting for a trigger activity.

This is where second order SQL injection differs from normal SQL injections.

The attacker injects code into the table row, which is deemed as a trusted source. That table row is then called, causing the attack to move from its dormant state to active execution.

Testing for second order SQL is harder because of it’s often covert nature.

Kullanıcı ismi olarak ‘ or ‘hacker’=’hacker girilir. Normalde veri tabanından kullanıcı ismini sorgulamak için şu SQL kullanılır
SELECT * FROM creditcards WHERE username = '<usernamehere>';
Ancak bu özel kullanıcı ismi sorgu şu hale gelir
SELECT * FROM creditcards WHERE username = '' or 'hacker'='hacker';
Böylece login olunabilir.

3. Cümleyi Etkisiz Kılma Yöntemi
Bu yöntemde Boolean Logic kullanılarak cümle ya çalıştırılmıyor ya da çalıştırılması mecbur kılınıyor. 

SQLI Based on 1== Is Always False
Örnek'te AND 1 = 0 kullanılarak Select cümlesi etkisiz kılınıyor ve arkadan gelen Truncate komutu çalıştırılıyor.
SELECT * FROM users WHERE username = 'admin' AND 1=0; TRUNCATE TABLE users; --'
SQLI Based on 1=1 Is Always True
Bir diğer örnekte OR 1 = 1 ile Select cümlesi çalıştırılmaya mecbur bırakılıyor.
SELECT * FROM users WHERE username = 'admin' OR 1=1 --'
SQLI Based on “=” Is Always True
Örnek
Şöyle yaparız
SELECT * FROM Users WHERE Name ="" OR ""="" AND Pass ="" or ""=""
Açıklaması şöyle
Attackers use an OR statement to get combinations of related data. When prompted for a Username and Password, they key in ” or ” “=” on both fields. 

This command returns every row in the Users table since OR “=” is always true for Usernames and Passwords.
4. Union Based Injection Yöntemi
Açıklaması şöyle
In this case, the malicious payload uses SQLs UNION operator to combine the results of several SELECT statements to one output, which is returned along with the HTTP response
Bu yöntemde iki tablo birleştirilip sonuç döndürülüyor. Böylece saldırgan hakkı olmayan bir tabloya da erişebiliyor. İlk tablo ile ikinci tablonun sütun sayılarının aynı olması gerektiği için ikinci tabloya bir miktar 1,1, koymak gerekir.
SELECT * FROM messages WHERE unread = 1 LIMIT 
    1 UNION SELECT mail,password,1,1,1 FROM users
Örnek
Birinci tabloda kaç sütun olduğunu bilmiyorsak önce ilk tablodaki sütun sayısını bulmak için orderby kullanılır. Şöyle yaparız. Daha sonra union işlemi denenir.
SELECT * FROM messages WHERE unread = 1 ORDER BY 10




Hiç yorum yok:

Yorum Gönder