SQL Süst

Tõlkida koos – http://shiflett.org/articles/sql-injection

Tere tulemast teise väljaanne Turvalisuse Nurgas. Selle kuu teema on SQL süst, rünnak vektor, mis frequents mõtetes PHP arendajad, kuid mille puudus on hea dokumentatsioon.

Enamik veebirakenduste suhelda andmebaasi ning andmeid säilitatakse seal sageli pärineb kaugetest allikatest. Seega, kui luua SQL, kasutad sageli sisend, selle ehitus. Tüüpiline SQL injection attack kasutab see stsenaarium, üritades saata killud kehtiv SQL päringute nagu ootamatu väärtused GET ja POST andmeid. See on põhjus, miks SQL süst haavatavuse on sageli süüdi halb filtreerimist ja põgenevad, ja see asjaolu ei saa piisavalt rõhutada.

See artikkel selgitab, SQL süst vaadates mõne näite rünnakud ja siis kasutusele mõned lihtsad ja tõhusad meetmed. Rakendades parimaid tavasid, saate praktiliselt kõrvaldada SQL süst loendist turvalisuse probleeme.

SQL SÜST

Hetkeks, pane ennast rolli ründaja. Sinu eesmärk on esialgu lihtne. Sa tahad saada ootamatud SQL teostada andmebaasi. Sa oled ainus, kes soovivad saada midagi teha, sest see toob esile asjaolu, et taotluse on potentsiaalse haavatavuse. Teil on nii palju võimalusi, kui soovite, ja teil on palju teavet, et töötada. Näiteks leiavad lihtne autentimine vorm on näidatud Joonisel 1.

Joonis 1:

Selleks, et saada rohkem infot selle vormi, mida te vaatate allikas:

  1. <form action="/login.php" method="POST">
  2. <p>Username: <input type="text" name="username" /></p>
  3. <p>Password: <input type="text" name="password" /></p>
  4. <p><input type="submit" value="Log In" /></p>
  5. </form>

Juba saate teha väga haritud arvan, et umbes tüüpi SQL kinnitus, et käesoleva taotluse võib kasutada, et kontrollida juurdepääsu volikirja. See on tõenäoliselt SELECT kinnitus. Saab teha ka vist umbes nimereeglistik, mida kasutatakse andmebaasi tabel, sest see ilmselt sobib lihtsad nimed, mida kasutatakse HTML-kujul. (See on ka võimalik, et teil võib põhjustada viga, mis näitab seda teavet teie.) Sest see vorm on autentimiseks, seal on ilmselt WHERE klausel, mis kasutab $_POST[‘username’] ja POST[‘password$_’].

Kõik see, mida võib ennustada, milline on järgmine:

  1. <?php
  2.  
  3. $sql = "SELECT count(*)
  4.         FROM users
  5.         WHERE username = '{$_POST['username']}'
  6.         AND password = '...'";
  7.  
  8. ?>

Eeldusel, et see oletus on õige, mida saate teha, et manipuleerida seda päringut? Kujutage ette, saatmine järgmised kasutajanimi:

  1. chris' /*

SQL avaldus muutub järgmised:

  1. SELECT count(*)
  2. FROM users
  3. WHERE username = 'chris' /*'
  4. AND password = '...'";

MÄRKUS: selles näites, /* kasutatakse algab mitmerealine kommentaar tõhusalt lõpetamise päring sel hetkel. See on testitud edukalt MySQL. Standard kommentaar SQL algab –, ja see on triviaalne, et proovida nii.

See päring näitab eduka autentimise katse nii kaua, kui chris konto on olemas, sõltumata parool. See konkreetne rünnak on sageli kasutatakse varastada kontodelt. Muidugi, iga kasutajanime võib kasutada (admin on populaarne eesmärk). Seega, saates vigane kasutajanimi, saate hallata logi sisse ilma kehtiva konto.

Pidage meeles, et loovus mängib suurt rolli kõige rünnakuid. Eelmises näites, rünnak on piiratud tüüpi päring (SELECT) ja viis kasutajanime ja parooli, mida kasutatakse. Teisisõnu, kui ründaja, siis on mõnevõrra seotud, ja oma rünnakuid tuleb proovida olukorda ära kasutada nende piire. Muud tüüpi päringud esitada uusi võimalusi ja parimaid tavasid, mis on mainitud käesoleva artikli sätteid kohaldatakse kõikide SQL süst rünnakud.

WHERE HÄKKIMINE

WHERE klauslit kasutatakse selleks, et piirata andmete kohta, mida konkreetse päringu vasted. SELECT avaldus, ta leiab dokumendid, mis on tagastatud. UPDATE saamiseks avaldust, määrab kindlaks andmed, mis on modifitseeritud. A DELETE avaldus, see määrab andmeid, mis on kustutatud. Kui kasutaja saab manipuleerida, WHERE klausel, seal on palju võimalusi teha drastilisi muutusi – valimine, uuendamine ja kustutamine suvalised andmed andmebaasi.

Kujutage ette, SELECT avaldusega on ette nähtud, et tõmbad kõik krediitkaardi numbrid praeguse kasutaja jaoks:

  1. <?php
  2.  
  3. $sql = "SELECT card_num, card_name, card_expiry
  4.         FROM credit_cards
  5.         WHERE username = '{$_GET['username']}'";
  6.  
  7. ?>

Seda eriti juhul, kui taotlus ei pruugi isegi küsida kasutajanime kuid selle asemel, et pakkuda seda linki:

  1. <a href="/account.php?username=shiflett">
  2. Credit Card Information
  3. </a>

Kui kasutajal võib olla mitu kaarti, taotluse, võib aas läbi tulemuste andmebaasi päringu, väljapanek kaardi number, nimi kaardile, ja lõppemise kuupäev, iga kaardi.

Kujutage ette, kasutaja, kes külastab järgneva ressursi:

  1. /account.php?username=shiflett%27+OR+username+%3D+%27lerdorf

See esitab järgmised väärtus kasutajanimi:

  1. shiflett' OR username = 'lerdorf

Kui kasutada eelmise SQL query, $sql on järgmine väärtus:

  1. SELECT card_num, card_name, card_expiry
  2. FROM credit_cards
  3. WHERE username = 'shiflett' OR username = 'lerdorf'

Nüüd kasutaja näeb nimekirja kõik krediitkaardid, mis kuuluvad kas shiflett või lerdorf. See on päris suuri turvalisuse haavatavust. Muidugi, suurem haavatavus on olemas see konkreetne näide, sest kasutaja saab suvaliselt liigu ühtegi kasutajanimi URL-i. Lisaks, kasutajanimi, mis põhjustab WHERE klausel sobitada kõik andmeid võib potentsiaalselt paljastada kõik andmeid:

  1. shiflett' OR username = username

Kujutage ette, kui see konkreetne kasutajanimi on salvestatud andmebaasi (kasutades eraldi SQL injection attack) kui ründaja enda kasutajanimi. Iga päringu, mis on piiratud poolt, WHERE klausel, et kohaldada ainult kasutaja enda rekord võib kohaldada kõigi arvestust asemel. See on mitte ainult äärmiselt ohtlik, aga see ka teeb edasisi rünnakuid väga mugav.

SISEND FILTREERIMINE

MÄRKUS: See artikkel eeldab, magic_quotes_gpc on keelatud. Kui see on sisse lülitatud, saate selle välja lülitada või kasutada fix_magic_quotes() funktsiooni, et paranda sisend.

Seal on parimad tavad, mida tuleks järgida, et vältida SQL süst rünnakud, ja need pakuvad väga kõrge kaitsetaseme. Kõige olulisem samm on filter kõik sisend (informatsioon, mis pärineb kaug-allikas). See hõlmab $_GET, $_POST, $_COOKIE, jne. Et aidata selgitada seda, kaaluge järgmisi HTML-vormi:

  1. <form action="/receive.php" method="POST">
  2. <select name="color">
  3.     <option value="red">red</option>
  4.     <option value="green">green</option>
  5.     <option value="blue">blue</option>
  6. </select>
  7. <input type="submit">
  8. </form>

Selgelt, oodatavad väärtused on red, green ja blue. Nii, sisend filtreerimine tuleks kontrollida, kas see:

  1. <?php
  2.  
  3. $clean = array();
  4.  
  5. switch ($_POST['color']) {
  6.     case 'red':
  7.     case 'green':
  8.     case 'blue':
  9.         $clean['color'] = $_POST['color'];
  10.         break;
  11.     default:
  12.         /* Error */
  13.         break;
  14. }
  15.  
  16. ?>

See kood kasutab eraldi array ($clean), et salvestada filtreeritud andmed. See on hea mõte valida nimereeglistik, mis aitavad teil tuvastada potentsiaalselt räämas andmeid. Selles näites $clean[‘color’] saab usaldada, sisaldavad kehtiv värvi, sest see on esimene initsialiseeritud ja seejärel ainult määratud väärtus $_POST[‘color’] kui see väärtus, läbib katse.

Kaks kõige olulisemat punkti, sisend filtreerimine on:

  • Nõustuda ainult kehtivad andmed asemel, et püüda vältida vigaseid andmeid.
  • Valida nimereeglistik, mis aitab teil eristada räämas andmeid filtreeritud andmed.

PÕGENEDES VÄLJUND

Korralikult filtreeritud sisend, sa oled juba päris hästi kaitstud pahatahtlike rünnakute eest. Ainus järelejäänud samm on, et sellest pääseda nii, et vormi sisend ei ole kogemata segada vorm SQL. Kui kasutad MySQL, see lihtsalt on vaja teil läbida kõik andmed läbi mysql_real_escape_string() enne kasutamist:

  1. <?php
  2.  
  3. $mysql = array();
  4.  
  5. $mysql['color'] = mysql_real_escape_string($clean['color']);
  6.  
  7. $sql = "SELECT username
  8.         FROM users
  9.         WHERE favorite_color = '{$mysql['color']}'";
  10.  
  11. ?>

Sel juhul, eeldades, $clean[‘color’] on loodud eelmise näite, võite olla kindel, et värv sisaldab ainult tähestiku tähtedega. (See on üks punane, roheline, või sinine.) Seega, põgenedes võib tunduda üleliigne, ja see on. Kuid, see on ikka hea komme, et alati põgeneda andmeid. See praktika aitab teil vältida unustamist see oluline samm ning ta järgib põhimõtet riigikaitse sügavus, mis rõhutab, kui oluline on koondatud tagatiste.

KUNI JÄRGMISE KORRANI…

Vältida SQL süst on lihtne, kuid see on üks kõige levinum veebirakenduse nõrgad kohad. Loodetavasti on sul nüüd alati järgida järgmisi suuniseid:

  • Filtri sisend.
  • Põgeneda väljundi.

NYPHP on kasulik ressurss, mis selgitab, SQL pääseks.

Ma loodan, et teil saab nüüd turvaliselt kaitsta oma taotlusi vastu SQL süst rünnakud. Kuni järgmise kuu jooksul, on ohutu.

 

Tagasi esilehele

Leave a Reply

Your email address will not be published. Required fields are marked *