X

Autorius Tema: SQL Injekcija  (Skaityta 259 kartus)

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 973
  • Karma: +18/-6
  • SCTVS Kūrėjas
    • Žiūrėti profilį
SQL Injekcija
« Įrašytas: 2012-03-22 22:19:56 pm »
Sveiki,
Kaip mačiau visur kur klausia patariama yra naudoti:
mysql_real_escape_string();
strip_tags();
htmlspecialchars();

ir panašiai, bet ar Jums teko su tuo susidurti praktikoje? Nemanau :)

Esmė tame, kad pirmiausia tai būtų klausimas, ar užtenka sakykim paleisti per mysql_real_escape_string(); kad nebūtų papildomos injekcijos?

Jei taip, tai klystate ;)

Kūriau puslapį, viskas veikė be problemų, bet... Įsikišo hakeriai ( Šiuo atvėju ačiu jiems ;) ) ir per vieną input laukelį, kurį tikrinau su mysql_real_escape_string() jie pridirbo šiek tiek :D

Na o šiaip, tai kaip iš tikro reiktų nuo tokių dalykų apsisaugoti?
Moksleivis besimokantis web kūrimo pagrindų :)

Neprisijungęs vitalikaz

  • Dalyvis
  • **
  • Įrašai: 602
  • Karma: +38/-0
  • Tikėk kuo tiki
    • Žiūrėti profilį
    • blast.lt
Re: SQL Injekcija
« Atsakymas #1 Įrašytas: 2012-03-22 22:56:05 pm »
Nuo SQL injekcijos apsisaugoti pilnai užtenka to escape'inimo ir nieks dėl to neklysta. Matyt ne injekcija buvo, o koks nors kitas atakos tipas. Jeigu papasakosi smulkiau kas įvyko, galėsim panagrinėti :)
BlaST
Serveriai.lt paslaugos su 50% nuolaida!

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 973
  • Karma: +18/-6
  • SCTVS Kūrėjas
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #2 Įrašytas: 2012-03-22 23:09:21 pm »
Citata
Va ka buvo irashe i laukeli

1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1&n922231=v992956       Trinti?
1       1       Trinti?
1       ${99333+100462}         Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       http://some-inexistent-website.acu/some_inexistent_file_with_long_name
       Trinti?
1       SomeCustomInjectedHeader:injected_by_wvs        Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       )       Trinti?
1       1       Trinti?
1       SomeCustomInjectedHeader:injected_by_wvs        Trinti?
1       1some_inexistent_file_with_long_name    Trinti?
1       1       Trinti?
1       1       Trinti?
1       !(()&&!|*|*|    Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       SomeCustomInjectedHeader:injected_by_wvs        Trinti?
1       ^(#$!@#$)(()))******    Trinti?
1       http://testasp.vulnweb.com/t/fit.txt?   Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1               Trinti?
1       print(md5(acunetix_wvs_security_test));die();/*         Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       '"()    Trinti?
1       1       Trinti?
1       ${@print(md5(acunetix_wvs_security_test))}      Trinti?
1       1       Trinti?
1       )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       //www.acunetix.tst      Trinti?
1       ${@print(md5(acunetix_wvs_security_test))}\     Trinti?
1       1       Trinti?
1       1       Trinti?
1       &cat /etc/passwd        Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       ]> &acunetixent;        Trinti?
1       1       Trinti?
1       1       Trinti?
1       &cat /etc/passwd&       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       1       Trinti?
1       '"      Trinti?
1       1       Trinti?
1       1       Trinti?
1       '"()&%1         Trinti?
1       1       Trinti?
1       1       Trinti?


Štai kas buvo laukelyje :)
Escapinimas buvo uždėtas duomenims gautiems ;) Tad kaip tai galėjo įvykti? :)

ps. Nor man atrodo, čia iš outside scripto viską padarė....
Moksleivis besimokantis web kūrimo pagrindų :)

Neprisijungęs vitalikaz

  • Dalyvis
  • **
  • Įrašai: 602
  • Karma: +38/-0
  • Tikėk kuo tiki
    • Žiūrėti profilį
    • blast.lt
Re: SQL Injekcija
« Atsakymas #3 Įrašytas: 2012-03-22 23:20:30 pm »
Tai tau šitą tekstą idėjo į laukelį, kurį tu išescape'inai ir padarei ką? Kokią užklausą vykdei? Išsaugojai pas save duombazėje? Kokiu budu paskui jį išvedinėjai?
BlaST
Serveriai.lt paslaugos su 50% nuolaida!

html css photoshop php forumas

Re: SQL Injekcija
« Atsakymas #3 Įrašytas: 2012-03-22 23:20:30 pm »

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 973
  • Karma: +18/-6
  • SCTVS Kūrėjas
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #4 Įrašytas: 2012-03-22 23:23:00 pm »
Taip, tekstas buvo įdėtas į laukelį, kuris poto po escapinimo buvo dedamas į mysql ir buvo siunčiamas el-laiškas :)
Moksleivis besimokantis web kūrimo pagrindų :)

Neprisijungęs vitalikaz

  • Dalyvis
  • **
  • Įrašai: 602
  • Karma: +38/-0
  • Tikėk kuo tiki
    • Žiūrėti profilį
    • blast.lt
Re: SQL Injekcija
« Atsakymas #5 Įrašytas: 2012-03-22 23:25:07 pm »
Ir kas tau atsitiko, saugant visą šitą išescape'intą tekstą į duombazę? Turėtų ir išsisaugot toks, kokį tu parodei.
BlaST
Serveriai.lt paslaugos su 50% nuolaida!

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 973
  • Karma: +18/-6
  • SCTVS Kūrėjas
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #6 Įrašytas: 2012-03-22 23:27:53 pm »
Visas šitas ir išsisaugojo, o kartu su juo buvo pasiūstas ir masinis spamas su emailu :) Tiesiog buvo ištraukti visi kontaktai ir jiems buvo pasiūsta neaiški žinutė, kurios dabar dar neturiu gavęs
Moksleivis besimokantis web kūrimo pagrindų :)

Neprisijungęs vitalikaz

  • Dalyvis
  • **
  • Įrašai: 602
  • Karma: +38/-0
  • Tikėk kuo tiki
    • Žiūrėti profilį
    • blast.lt
Re: SQL Injekcija
« Atsakymas #7 Įrašytas: 2012-03-22 23:42:59 pm »
Klaida bus tavo kode kažkur. Čia ne injekcija :) eval() spėju irgi niekur nedarai, todėl drįstu teigti, kad ne dėl to nusisiuntė tie email'ai (jeigu apskritai nusisiuntė). Rodyk kodą, ieškosim bug'ų.

Visi taip šneka apie tą injekciją, kartais atrodo kad net nežinodami kas tai yra. Tai galimybė nusiųsti tokią HTTP užklausą serveriui, kad galima būtų pakeisti konstruojamą SQL užklausą ir tokiu būdu išgauti arba įrašyti duomenis, kartais galima užuploadinti failą ir t.t., bet tai niekaip nesusiję su tavo situacija. Jeigu visas tekstas, įrašytas į inputą išsisaugojo tau į lentelę - injekcijos neįvyko.

Paprasčiausia injekcija. Pavyzdžiui PHP kodas:
$id = $_GET['id'];
mysql_query("SELECT * FROM news WHERE id = '$id' ");
kintamasis neišescape'intas, simbolis ' lieka toks pat, todėl galima pakeisti konstruojama užklausą, padavus tam tikrą id parametrą. Pavyzdžiui:
?id=1' OR '1'='1
Tada PHP įstačius kintamąjį, tavo užklausa atrodys

SELECT * FROM news WHERE id = '1' OR '1'='1'

Kas gražins visus rezultatus, o ne tik su reikiamu id. Tada galima apjunginėt lenteles, vietoj naujienos pavadinimo ištraukti pavyzdžiui user'io, kurio vardas `admin` slaptažodžio hash'ą, bandyti naudoti blind injection ir t.t.
Kai padarai escape'ą, simbolis ' pakeičiamas į \', kad užklausa įvyktų sklandžiai. Jeigu auksčiau aprašytu atveju $_GET['id'] būtų išescape'intas, tai užklausa atrodytų
SELECT * FROM news WHERE id = '1\' OR \'1\'=\'1'
ir tiesiog pasakytų, kad tokio įrašo nėra.
Čia aišku pats paprasčiausias variantas, jų yra daug skirtingų ir daug sudėtingesniu :)
BlaST
Serveriai.lt paslaugos su 50% nuolaida!

Neprisijungęs Modestas Vaitkevičius

  • Dalyvis
  • **
  • Įrašai: 973
  • Karma: +18/-6
  • SCTVS Kūrėjas
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #8 Įrašytas: 2012-03-22 23:44:54 pm »
Okey, apie tą eval() išgirdau pirmą kart :)

Gal gali plačiau apie jį? :)

O kas dėl kodo, perdariau, kad dabar išvis tik e-mail galėtum įrašyti :) Nemanau, kad bebus bėdų :)
Moksleivis besimokantis web kūrimo pagrindų :)

Neprisijungęs vitalikaz

  • Dalyvis
  • **
  • Įrašai: 602
  • Karma: +38/-0
  • Tikėk kuo tiki
    • Žiūrėti profilį
    • blast.lt
Re: SQL Injekcija
« Atsakymas #9 Įrašytas: 2012-03-22 23:50:02 pm »
eval() funkcija įvykdo kodą iš string'o.
<?php
$s 
"print 'blabla';";
eval(
$s); // išves 'blabla'
?>

Bet labai pavojinga funkcija ir su ja reikia labai atsargiai.

Plačiau - http://php.net/manual/en/function.eval.php .

O duomenis taip, reikia validuoti prieš saugant. Jeigu lauki email adreso - tikrink, jeigu int'o - tikrink, jei dar kažko konkretaus - tikrink (prieš įrašydamas į duombaze). Prie irašant - escapeink, prieš išvedant - htmlspecialchars() ir neturėsi tokių bėdų :)
BlaST
Serveriai.lt paslaugos su 50% nuolaida!

Prisijungęs bendzaminas

  • Naujokas
  • *
  • Įrašai: 69
  • Karma: +5/-0
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #10 Įrašytas: 2012-03-23 00:13:11 am »
Pasidalinsiu viena nebloga klase vardan saugių svetainių, tinkamai panaudojus ją - problemų nebus ;).

https://github.com/Wixel/GUMP

Neprisijungęs justinas

  • Naujokas
  • *
  • Įrašai: 18
  • Karma: +0/-0
    • Žiūrėti profilį
Re: SQL Injekcija
« Atsakymas #11 Įrašytas: 2012-03-23 17:24:32 pm »
Kas DB liečia, geriausia naudoti normalią biblioteką tam, kaip PDO. Tada pribindini argumentus ir viskuo pasirūpina už tave, nebus taip, kad pamirši kokį vieną parametrą išescapint...

Tačiau jei negali be mysql_* funkcijų, tai taisyklės tokios, stringams real_escape, o int'ams - būtinas castinimas į int (kadangi čia real_escape gali ir nepadėti - tokią injekciją galima parašyti ir be apostrofų).

Dėl XSS, tai paprasčiausiai reikia tokius ženklus kaip < > ", kurie turi reikšmę html'e, pakeisti atitinkamais HTML kodais (kad jų nesuprastų kaip tagų). Tą ant PHP berods padaro htmlspecialchars()...

Dėl eval/komandų paleidinėjimo su user inputu - geriausia išvis nenaudot tokių dalykų, jei yra alternatyvų (eval is evil - tas posakis tinka beveik viskame :) ). Na, bet jei labai reikia, tai shellui vėl yra atskiros php funkcijos (escapeshellcmd, escapeshellarg ar pan.)
« Paskutinį kartą keitė: 2012-03-23 17:26:10 pm sukūrė justinas »

html css photoshop php forumas

Re: SQL Injekcija
« Atsakymas #11 Įrašytas: 2012-03-23 17:24:32 pm »