Full Transcript

SECURITATE WEB CURSUL 02 ARHITECTURA APLICAȚIILOR WEB ș.l. dr. ing. ADRIAN ALEXANDRESCU Facultatea de Automatică și Calculatoare Universitatea Tehnică “Gheorghe Asachi” din Iași 2023-2024 Cuprins I. Arhitecturi web II. Protocolul HTTP III. Servicii web RESTful IV. Cookie-uri și sesiuni V. At...

SECURITATE WEB CURSUL 02 ARHITECTURA APLICAȚIILOR WEB ș.l. dr. ing. ADRIAN ALEXANDRESCU Facultatea de Automatică și Calculatoare Universitatea Tehnică “Gheorghe Asachi” din Iași 2023-2024 Cuprins I. Arhitecturi web II. Protocolul HTTP III. Servicii web RESTful IV. Cookie-uri și sesiuni V. Atacuri asupra unei aplicații web Adrian Alexandrescu 2023-2024 2 Arhitecturi web 1. 2. I Arhitectura pe mai trei niveluri Arhitecturi diverse Adrian Alexandrescu 2023-2024 3 1. Arhitectura pe trei niveluri Adrian Alexandrescu 2023-2024 I 4 2. Arhitecturi diverse Adrian Alexandrescu 2023-2024 I 5 Protocolul HTTP 1. 2. 3. 4. 5. II Prezentare Cererea HTTP Răspunsul HTTP Metode HTTP Coduri de răspuns Adrian Alexandrescu 2023-2024 6 1. Protocolul HTTP - prezentare    II Hypertext Transfer Protocol RFC 9110 - HTTP Semantics, creat de Internet Engineering Task Force (IETF) The Hypertext Transfer Protocol (HTTP) is a family of stateless, application-level, request/response protocols that share a generic interface, extensible semantics, and self-descriptive messages to enable flexible interaction with network-based hypertext information systems. cerere GET /index.html HTTP/1.1 răspuns Adrian Alexandrescu 2023-2024 HTTP/1.1 200 OK [conținut index.html] 7 2. Cererea HTTP II https://ac.tuiasi.ro/despre/prezentare/ GET /despre/prezentare HTTP/1.1 Host: ac.tuiasi.ro User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept: text/html,,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Adrian Alexandrescu 2023-2024 8 3. Răspunsul HTTP II https://ac.tuiasi.ro/despre/prezentare/ HTTP/1.1 200 OK Date: Thu, 06 Oct 2022 10:35:58 GMT Server: Apache/2.2.15 (CentOS) Pragma: no-cache Last-Modified: Thu, 06 Oct 2022 10:35:58 GMT Connection: close Content-Type: text/html; charset=UTF-8 [corpul-mesajului] Adrian Alexandrescu 2023-2024 9 4. Metode HTTP II GET* cererea unei anumite resurse HEAD* similar cu GET doar că serverul nu transmite și corpul mesajului POST trimiterea unor date resursei identificate prin requestURI PUT trimiterea unor date care să fie stocate pe server DELETE ștergerea unei anumite resurse TRACE* serverul va răspunde cu cererea trimisă de client (ecou) OPTIONS* serverul va răspunde cu informații despre opțiunile de comunicare disponibile CONNECT folosită la tuneluri Adrian Alexandrescu PATCH2023-2024 aplică modificări parțiale asupra unei resurse 10 5. Coduri de răspuns II Clase de coduri de stare (Status-Code) Cererea a fost primită și urmează a fi 1xx Informațional procesată (răspuns provizoriu) 2xx Succes Cererea a fost procesată cu succes 3xx Redirectare Clientul trebuie să ia acțiuni suplimentare pentru a îndeplini cererea 4xx Eroare client Sintaxa cererii este eronată sau cererea nu poate fi îndeplinită de server 5xx Eroare server Serverul nu poate îndeplini o cerere aparent validă Adrian Alexandrescu 2023-2024 11 Servicii web RESTful 1. 2. 3. III Stilul arhitectural REST Servicii web RESTful Exemplu de servicii web Adrian Alexandrescu 2023-2024 12 1. Stilul arhitectural REST  REpresentational State Transfer (REST)  Stil arhitectural    III Specifică constrângeri (e.g., interfață uniformă) De obicei, aplicat serviciilor web Îmbunătățește performanța, scalabilitatea și adaptabilitatea Adrian Alexandrescu 2023-2024 13 2. Servicii web RESTful      III Serviciile web RESTful sunt bazate pe stilul arhitectural REST și expun un API Datele și funcționalitatea sunt considerate resurse care sunt accesate prin URI-uri Resursele sunt accesate printr-un set de operații bine definite (GET, POST, PUT, DELETE) Resursele sunt decuplate de reprezentarea lor – conținutul poate fi accesat în diverse formate (json, xml, html, text, pdf, imagini) Interacțiunea cu serviciile este stateless (fără stare)* Adrian Alexandrescu 2023-2024 14 3. Exemplu de servicii web III Crearea unei aplicații care face gestiunea cărților dintr-o bibliotecă folosind servicii web de tipul REST Fie următoarele cărți din bibliotecă în format JSON: [ {"id": 1, "title": "The Shining", "author": "Stephen King"}, {"id": 2, "title": "The Raven", "author": "Edgar Allan Poe"} ] Adrian Alexandrescu 2023-2024 15 3. Exemplu de servicii web III Crearea unei aplicații care face gestiunea cărților dintr-o bibliotecă folosind servicii web de tipul REST 2 situații: A. B. resursa cerută reprezintă o colecție /api/books resursa cerută reprezintă un element dintr-o colecție /api/books/1 https://bitbucket.org/avalexandrescu/bookmanager.git Adrian Alexandrescu 2023-2024 16 Cookie-uri și sesiuni 1. 2. 3. 4. IV Cookie Managementul cookie-urilor în diferite limbaje Sesiune Managementul sesiunilor în diferite limbaje Adrian Alexandrescu 2023-2024 17 1. Cookie      IV Informație trimisă de serverul web către client (browser) Este stocată de către client Este trimisă la server când utilizatorul accesează siteul respectiv Are un timp de expirare dat în secunde (e.g., time()+86400) Dacă timpul de expirare este omis sau este 0, cookieul va expira la sfârșitul sesiunii (închiderea browserului) Adrian Alexandrescu 2023-2024 18 1. Cookie IV Creare și utilizarea   Răspunsul primit de la serverul web conține headerul: Set-Cookie Cererile următoare către serverul web respectiv vor conține header-ul: Cookie Exemplu:   Server –> Client  Set-Cookie: SID=31d4d96e407aad43  Cookie: SID=31d4d96e407aad43 Client –> Server Adrian Alexandrescu 2023-2024 19 2. Managementul cookie-urilor în diferite limbaje IV JavaScript – client-side // setarea unui cookie document.cookie = "username=ana; expires=Thu, 14 Sep 2022 12:00:00 UTC; path=/;"; document.cookie = "username=maria; expires=Thu, 14 Sep 2022 12:00:00 UTC;"; // accesarea tuturor cookie-urilor sub forma unui singur șir de caractere let s = document.cookie; // ștergerea unui cookie document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; Adrian Alexandrescu 2023-2024 20 2. Managementul cookie-urilor în diferite limbaje IV PHP <?php $cookie_name = "user"; $cookie_value = "John Doe"; setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day ?> <html> <body> <?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie named '" . $cookie_name . "' is not set!"; } else { echo "Cookie '" . $cookie_name . "' is set!<br>"; echo "Value is: " . $_COOKIE[$cookie_name]; } ?> </body> </html> Adrian Alexandrescu 2023-2024 21 2. Managementul cookie-urilor în diferite limbaje IV NodeJS let express = require('express'); let cookieParser = require('cookie-parser'); let app = express() app.use(cookieParser()); let users = { name : "Maria", age : "18" } app.get('/setuser', (req, res)=>{ res.cookie("userData", users); res.send('user data added to cookie'); }); app.get('/getuser', (req, res)=>{ res.send(req.cookies); }); app.listen(3000, (err)=>{ console.log('listening on port 3000') }); Adrian Alexandrescu 2023-2024 22 2. Managementul cookie-urilor în diferite limbaje IV Python/Flask @app.route('/setcookie', methods = ['POST', 'GET']) def setcookie(): if request.method == 'POST': user = request.form['nm'] resp = make_response(render_template('readcookie.html')) resp.set_cookie('userID', user) return resp @app.route('/getcookie') def getcookie(): name = request.cookies.get('userID') return '<h1>welcome ' + name + '</h1>' Adrian Alexandrescu 2023-2024 23 2. Managementul cookie-urilor în diferite limbaje IV Java public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ List<String> cookieList = Arrays.stream(request.getCookies()) .filter(c -> key.equals(c.getName())) .map(Cookie::getValue); Cookie colorCookie = new Cookie("color", "red"); colorCookie.setMaxAge(60*60); //colorCookie.setMaxAge(0); // remove cookie response.addCookie(colorCookie); } } Adrian Alexandrescu 2023-2024 24 3. Sesiune IV Sesiune    Conversație între un client și server Secvență de cereri și răspunsuri HTTP este un protocol "fără stare" (en., stateless) Identificator de sesiune    en., session ID sau session token Șir de caractere, generat aleatoriu sau de o funcție hash, folosit pentru a identifica o sesiune Este trimis prin cookie-uri și/sau formulare HTML Adrian Alexandrescu 2023-2024 25 4. Managementul sesiunilor în diferite limbaje IV PHP <?php // Start the session session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Set session variables $_SESSION["favcolor"] = "green"; $_SESSION["favanimal"] = "cat"; echo "Session variables are set."; ?> </body> </html> Adrian Alexandrescu 2023-2024 26 4. Managementul sesiunilor în diferite limbaje IV PHP <?php // Start the session session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Set session variables $_SESSION["favcolor"] = "green"; $_SESSION["favanimal"] = "cat"; echo "Session variables are set."; ?> </body> </html> Adrian Alexandrescu 2023-2024 27 4. Managementul sesiunilor în diferite limbaje IV NodeJS app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})); app.get('/', function(req, res, next) { if (req.session.views) { req.session.views++; res.setHeader('Content-Type', 'text/html’); res.write('<p>views: ' + req.session.views + '</p>’); res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>’); res.end(); } else { req.session.views = 1; res.end('welcome to the session demo. refresh!’); } }) Adrian Alexandrescu 2023-2024 28 4. Managementul sesiunilor în diferite limbaje IV Java public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ response.setContentType("text/html"); PrintWriter out = response.getWriter(); String name=request.getParameter("userName"); out.print("Welcome "+n); HttpSession session=request.getSession(); session.setAttribute("user", name); out.print("<a href='servlet2'>visit</a>"); out.close(); } } Adrian Alexandrescu 2023-2024 29 4. Managementul sesiunilor în diferite limbaje IV Python/Flask from flask import Flask, render_template, redirect, request, session from flask_session import Session app = Flask(__name__) app.config["SESSION_PERMANENT"] = False app.config["SESSION_TYPE"] = "filesystem" Session(app) @app.route("/login", methods=["POST", "GET"]) def login(): if request.method == "POST": session["name"] = request.form.get("name") return redirect("/") return render_template("login.html") if __name__ == "__main__": app.run(debug=True) Adrian Alexandrescu 2023-2024 30 Atacuri asupra unei aplicații web  SQL Injection    Browser-ul trimite input malițios serverului Verificarea deficitară a input-ului duce la execuția unor interogări malițioase CRSF – Cross-Site Request Forgery   V Un site web malițios trimite o cerere (din browser) către un site bun folosind credențialele victimei XSS – Cross-Site Scripting  Un site web malițios trimite unei victime un script care fură informații referitoare la un site bun Adrian Alexandrescu 2023-2024 31 Atacuri asupra unei aplicații web  Clickjacking    V Utilizatorul este făcut să creadă că dă click pe o anumită pagină, dar defapt dă click pe o pagină ascunsă  Atacatorul folosește un iframe transparent/invizibil  Atacatorul ar putea folosi un formular de încărcare al unui fișier pentru a încărca un script malițios File Upload XEE – XML External Entity  Un endpoint API acceptă un payload XML, iar un XML parser de la server interpreteaă o directivă specială a XML (i.e., external entity) Adrian Alexandrescu 2023-2024 32 Atacuri asupra unei aplicații web  DOS – Denial of Service DDOS – Distributed Denial of Service    V Aplicația web primește un volum foarte mare de cereri de la un număr mare de dispozitive de rețea Astfel, serverul răspunde mult mai greu la cereri Exploatarea dependențelor third-party  Atacatorul poate profita de anumite vulnerabilități ale bibliotecilor și framework-urilor folosite de o aplicație web Adrian Alexandrescu 2023-2024 33 Bibliografie     https://www.rfc-editor.org/rfc/rfc9110 https://medium.com/@tknbnola/what-exactly-is-thishttp-thing-8979a54a8398 https://docs.oracle.com/javaee/6/tutorial/doc/gijqy.ht ml https://www.w3schools.com/js/js_cookies.asp Adrian Alexandrescu 2023-2024 34

Use Quizgecko on...
Browser
Browser