Lankide:Markelrlopez/SQL Injekzioa
SQL injekzioa
[aldatu | aldatu iturburu kodea]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]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:
- Erabiltzailea bere erabiltzaile izena eta pasahitza sartzen ditu testu sarreretan (adibidez, erabiltzaile izena = "Jon11" eta pasahitza = "j1234jon11").
- Erabiltzaileak Log in botoia sakatzen du.
- Bi sarrera horiek ("Jon11" eta "j123jon11") web-orrira atxikituta dagoen datu-basean konprobatzen dira:"Erakutsi erabiltzaileak taulan dauden sarrera guztiak non erabiltzaileIzena 'Jon11' den eta pasahitza 'j123jon11' den" da bere esanahia.
SELECT * FROM erabiltzaileak WHERE erabiltzaileIzena = 'Jon11' AND pasahitza = 'j123jon11'
- 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);
Sententzien parametrizazioa erabiliz
[aldatu | aldatu iturburu kodea]PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();
Ikus daitekeenez, kontsulta parametrizatuak edozein egoeratan erabil daitezke eta gainera segurtasun maila handiago bat emango dute.
Bibliografia
[aldatu | aldatu iturburu kodea]- ↑ (Ingelesez) «SQL Injection | OWASP Foundation» owasp.org (Noiz kontsultatua: 2022-12-10).
- ↑ «What is SQL Injection? Tutorial & Examples | Web Security Academy» portswigger.net (Noiz kontsultatua: 2022-12-10).
- ↑ «What is SQL Injection? Tutorial & Examples | Web Security Academy» portswigger.net (Noiz kontsultatua: 2022-12-10).