Lankide:Markelrlopez/SQL Injekzioa

Wikipedia, Entziklopedia askea

SQL injekzioa[aldatu | aldatu iturburu kodea]

SQL injekzio moten sailkapena

SQL injekzioa (SQLi) datu-baseei egiten zaizkien kontsultetan kode maltzurra sartzean oinarritzen den hacking teknika ohikoena da. Web sistemaren egonkortasuna eta segurtasuna arriskuan jartzea dute helburu. Kasurik txarrenean, datu-base osoa suntsitzea lortzen dute. Normalean, erasoa gertatzen da erabiltzaile bati testu sarrera bat eskatzen zaionean, hala nola erregistro formularioan edota saioa hasteko orrietan erabiltzaile izena, pasahitza, korreoa edota nortasun-agiria sartzerakoan.

Eraso mota hauek aukera ematen diote erasotzaileari normalean ikusi ezin dituen datuak ikusteko, hala nola erabiltzaile guztien datu pertsonalak, web-orriaren salmentak, kontu korronteko zenbakiak, etab. Kasu askotan, erasotzailea datu horiek alda edo ezaba ditzake, web-orriaren edukian edo portaeran etengabeko aldaketak eraginez.[1]

SQL injekzio motak[aldatu | aldatu iturburu kodea]

SQL injekzio eraso eta teknika ugari daude, eta egoera ezberdinetan sortzen dira. Hona hemen SQL injekzio mota batzuk:

  • SQLi klasikoa
  • Aplikazioaren logika iraultzea
  • UNION motatako erasoak
  • Datu-basearen egitura ezagutzea
  • SQL injekzio itsua

SQL kontsulta arrunta[aldatu | aldatu iturburu kodea]

Sesioa hasteko formularioa

Lehen aipatu den moduan, SQL injekzioa datu-base bati egiten zaizkien kontsultetan kode maltzurra sartzean datza. Normalean kontsulta hauek saioa hasteko formularioetan egiten direnez hona hemen adibide bat kontsulta nola egiten den ulertzeko:

  1. Erabiltzailea bere erabiltzaile izena eta pasahitza sartzen ditu testu sarreretan (adibidez, erabiltzaile izena = "Jon11" eta pasahitza = "j1234jon11").
  2. Erabiltzaileak Log in botoia sakatzen du.
  3. Bi sarrera horiek ("Jon11" eta "j123jon11") web-orrira atxikituta dagoen datu-basean konprobatzen dira:
    SELECT * FROM erabiltzaileak WHERE erabiltzaileIzena = 'Jon11' AND pasahitza = 'j123jon11'
    
    "Erakutsi erabiltzaileak taulan dauden sarrera guztiak non erabiltzaileIzena 'Jon11' den eta pasahitza 'j123jon11' den" da bere esanahia.
  4. Erabiltzailea aurretiaz erregistratuta balego honako emaitza bat bueltako luke datu baseak:
ErabiltzaileIzena Pasahitza ErregistroData Izena Abizena Adina Korreoa Jaioterria AzkenSaioa Kontua
Jon11 j123jon11 2020/09/04 Jon Jimenez 22 jonJimenez11@gmail.com Basauri 2022/10/07 Free

SQLi klasikoa[aldatu | aldatu iturburu kodea]

Aurreko atalean azaldu den moduan, saioa hasteko kontsulta horrekin sarrera bakar bat lortzen da, hau da, erabiltzailearen datuen sarrera, baina kontsultaren egituraren arabera emaitza ezberdinak lortu daitezke, hona hemen irteera bat baino gehiago lortzen dituen kontsulta bat:

SELECT * FROM erabiltzaileak WHERE kontua = 'Free' AND ErregistroData = '04/09/2020'

"Erakutsi erabiltzaileak taulan dauden sarrera guztiak non Kontua Free motatakoa den eta ErregistroData 04/09/2020 den" da bere esanahia.

Datu-baseak bueltatuko lukeen emaitza:

ErabiltzaileIzena Pasahitza ErregistroData Izena Abizena Adina Korreoa Jaioterria AzkenSaioa Kontua
Jon11 j123jon11 2020/09/04 Jon Jimenez 22 jonJimenez11@gmail.com Basauri 2022/10/07 Free
Mikel22 mikel124aa 2020/09/04 Mikel Lopez 31 mikelLopezAA@gmail.com Madrid 2021/04/11 Free
Mariaajbrt m997744a 2020/09/04 Maria Ceballos 21 mariaCeballos77@gmail.com Cantabria 2022/05/06 Free

Ikusi daitekeenez kontsulta honen bidez hiru irteera ezberdin lortzen dira.

SQL injekzio-erasoa egiteko soilik testu-sarrera bateko testuan 'OR 1=1' kodea injektatzearekin balio du, sententzia honekin SQL komandoaren WHERE atala baliogabesten da. Konkretuki, erabiltzailearen izena sartzeko sarreran 'Jon11' jarriz eta pasahitza sartzeko sarreran 'pasahitzMaltzurra' OR 1=1' jarriz, pasahitza irakurriko duen komatxoa ixtea lortzen du:

SELECT * FROM erabiltzaileak WHERE erabiltzailea = 'Jon11' AND pasahitza = 'pasahitzMaltzurra' OR 1=1'

1=1 beti egia denez WHERE horrek dena egia dela onartuko du; beraz, datu-basearen irteera guztiak bueltatuko ditu, erabiltzaile guztien informazioa emanez. Hona hemen datu-baseak bueltatuko lituzkeen sarrerak:

ErabiltzaileIzena Pasahitza ErregistroData Izena Abizena Adina Korreoa Jaioterria AzkenSaioa Kontua
Jon11 j123jon11 04/09/2020 Jon Jimenez 22 jonJimenez11@gmail.com Basauri 07/10/2022 Free
Nekane12rt nsdka228 18/12/2022 Nekane Rubiños 22 neks1rub@gmail.com Barcelona 09/12/2021 Premium
Mikel22 mikel124aa 04/09/2020 Mikel Lopez 31 mikelLopezAA@gmail.com Madrid 11/04/2021 Free
AinaraTR ainas123.a 07/11/2019 Ainara Tabara 19 ianadwdTW@gmail.com Madrid 09/02/2020 Premium
Mariaajbrt m997744a 04/09/2020 Maria Ceballos 21 mariaCeballos77@gmail.com Cantabria 06/05/2022 Free
... ... ... ... ... ... ... ... ... ...

Azken finean, erasoa SQL kodea injektatzean oinarritzen denez, kode arrikutsuago bat sartzearekin balio du ondorio larriagoak lortzeko. Adibidez 'DROP table' kodeak datu-basearen taula ezabatzea eta datu guztiak desagertzea eragingo luke eta, horregatik, web-sistemaren segurtasuna zaintzea oso garrantzitsua da.

SQLi-a saihesteko erak[aldatu | aldatu iturburu kodea]

SQL injekzioa nola detektatu[aldatu | aldatu iturburu kodea]

Webgunearen ahultasun gehienak modu fidagarri batean aurki daitezke Burp Suite sitemaren web-eskanerraren bidez. Baita modu manualan aurki daitezke:

  • Komatxo sinplea (') ezabatuz eta errore edota anomalia ezberdinak bilatuz.
  • Boolear baldintza espezifiko batzuk detektatuz, hala nola OR 1=1 eta 1=2 motatako baldintzak.
  • Exekuzio-denborak kontrolatuz, hau da, kontsultak behar duen denbora baino gehiago behar badu, zerbait txarto dabilela esan nahi du.

Prepared Statement teknika[aldatu | aldatu iturburu kodea]

Bestaldetik, eraso hauek saihesteko erabiltzen den beste teknika bat sententzien parametrizazioa da, string-en konkatenazioa erabili ordez. Izan ere, seguruagoa da kode injekzioen aurrean.

String-en konkatenazioa erabiliz[aldatu | aldatu iturburu kodea]

String query = "SELECT * FROM products WHERE category = '"+ input + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);

[2]

Sententzien parametrizazioa erabiliz[aldatu | aldatu iturburu kodea]

PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();

[3]

Ikus daitekeenez, kontsulta parametrizatuak edozein egoeratan erabil daitezke eta gainera segurtasun maila handiago bat emango dute.

Bibliografia[aldatu | aldatu iturburu kodea]

  1. (Ingelesez) «SQL Injection | OWASP Foundation» owasp.org (Noiz kontsultatua: 2022-12-10).
  2. «What is SQL Injection? Tutorial & Examples | Web Security Academy» portswigger.net (Noiz kontsultatua: 2022-12-10).
  3. «What is SQL Injection? Tutorial & Examples | Web Security Academy» portswigger.net (Noiz kontsultatua: 2022-12-10).