bünyamin demir - 10 adımda yazılım güvenliği

18
10 Adımda Yazılım Güvenliği OWASP-Turkey Bünyamin Demir

Upload: cypsec-siber-guevenlik-konferansi

Post on 20-Jul-2015

154 views

Category:

Technology


11 download

TRANSCRIPT

Page 1: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

10 AdımdaYazılım Güvenliği

OWASP-Turkey

Bünyamin Demir

Page 2: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

Bünyamin Demir ( @bunyamindemir )– Lisans Kocaeli Üni. Matematik Bölümü– Yüksek Lisans Kocaeli Üni Fen-Bilimleri, Tez; Oracle Veritabanı

Güvenliği– Uygulama Geliştirici – OWASP Türkiye Bölüm Lideri– 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

Page 3: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

3

OWASP

Page 4: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

4

Why is OWASP Special?

Page 5: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

• OWASP Top 10

• OWASP Zed Attack Proxy (ZAP)

• OpenSAMM

• Cheat Sheets

• ESAPI

• ASVS

• Testing Guide

• Development Guide5

OWASP Projects

Page 6: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

6

Application Security Verification Standart

Page 7: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

1 - Girdi Denetimi

7

public boolean validateUsername(String username) {

String usernamePattern = "^[a-zA-Z0-9]{6,12}$";

if (username == null) {

return false;

}

Pattern p = Pattern.compile(usernamePattern);

Matcher m = p.matcher(username);

if (!m.matches()) {

return false;

}

return true;

}

if (!validateUsername(username)) {

//uygun olmayan kullanıcı adı

}

Page 8: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

ESAPI ile Girdi Denetimi

8

Validator.Username=^[a-zA-Z0-9]{6,12}$

String username = request.getParameter("username");

boolean booluser = ESAPI.validator().isValidInput("User name", username, "Username", 12, false);

if (!booluser) {

// uygun olmayan kullanıcı adı

}

Page 9: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

2-Sanitization

9

String safeMarkup = ESAPI.validator().getValidSafeHTML( "Rich Text", richTextInput, 2500, true );

<%

String address = "Sumbul mah.,<script>alert(1);</script> kartal sk., manolya sitesi, bahar apart., D/Blok, No:5";

String safeAddressText = ESAPI.validator().getValidSafeHTML("Address Text", address, 200, true);

%>

<div><%= safeAddressText %></div>

<div>Sumbul mah., kartal sk., manolya sitesi, bahar apart., D/Blok, No:5</div>

Page 10: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

3 – HttpOnly Cookie

10

Set-cookie: JSESSIONID=p9JtQGHSrTQTzfK8912y72VTv2y4Jyr5zTbV1h1Mc7Lmf4fMg1ly; Domain=www.site.com; Path=/; Secure; HttpOnly

Page 11: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

4 – Secure Cookie

11

Set-Cookie: JSESSIONID=p9JtQGHSrTQTzfK8912y7Mg1ly; Domain=www.site.com; Path=/; Secure; HttpOnly

Page 12: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

5 – Oturum Anahtarı

12

ESAPI.httpUtilities().changeSessionIdentifier();

Users user = new LoginDAO().login(username, password);

if (user.isAuthenticated()) {currentSession = request.getSession(true);currentSession.invalidate();

HttpSession newSession = request.getSession(true);} else {

request.setAttribute("loginerr", "username or password is invalid");request.getRequestDispatcher("login.jsp").forward(request, response);

}

Page 13: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

6 – Güvenli Chaptcha

13

Page 14: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

7 – getCanonicalPath()

14

getCanonicalPath()

http://www.site.com/getFile.jsp=file=/../../../../etc/passwd

getCanonicalPath(/www/data/site_com/files/../../../../etc/passwd)

/etc/passwd != /www/data/site_com/files/

Page 15: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

8 – HTTPS

15

Kimlik doğrulama işlevi barındıran uygulamaların güvenli kanallar ile iletişim sağlıyor olması gerekir.

Page 16: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

9 – Form Token

16

<form name="comment" action="product_comment.jsp?pid=53" method="POST">Comment: <input type="text" name="comment"/><input type="submit" value="Submit"/><input type="hidden" name="CSRFToken” value="30Dfd45645Ddssdf4567fdfdgAA..."></form>

Page 17: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

10 – Prepared Statement

17

...String className = request.getParameter("class");

String query = "SELECT * FROM students WHERE class = '" + className + "'";

ResultSet rs = stmt.execute(query);...

...String className = request.getParameter("class");

PreparedStatement psmt = conn.prepareStatement("SELECT * FROM students WHERE class=?");psmt.setString(1, className);

ResultSet rs = psmt.executeQuery();...

Page 18: Bünyamin Demir - 10 Adımda Yazılım Güvenliği

18