Page 1 of 1

[Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 08 17:02
by V1LKAS
Pastoviai gaunu prašymų dėl puslapio sistemų spragų tvarkymo, dažniausiai problema sql injectionas, su kuriuo iš duomenų bazių pavogiami ir ištrinami duomenys, retesniais atvėjais problema yra dėl Cross Site Scripting (XSS), šioje pamokoje pabandysiu kuo aiškiau ir paparasčiau pateikti reikalingiausią informaciją šių saugumo spragų tvarkymui step by step.

1. Visų pirma turite išsiaiškinti, ar pas jus puslapyje yra spragų, tiek sql injection tiek XSS spragas galima rasti, be jokios programinės įrangos, bet aš rekomenduoju naudoti programą pavadinimu Acunetix Web Vulnerability Scanner, ja naudotis itin paprasta, suvedi puslapio adresą ir spaudi mygtuką start, programa per tam tikrą laiko tarpą nuskaitys visą jūsų puslapį, ir raudonai pateiks rimčiausias spragas, su visa informacija apie tą spragą, konkrečiai infomaciją apie tą kintamajį/kintamuosius kuris/kurie yra nesaugūs. Torrent linkai parsisiusti programą https://thepiratebay.se/search/Acunetix ... ner/0/99/0
Programos scan lango su spragomis pavyzdys:
Image

2. Jeigu spragos pavadinimas: Cross Site Scripting (XSS)
Naudodamasis šia spraga, įsilaužėlis gali siųsti kenkėjišką kodą naudodamasis javascript formomis, taip jis gali išgauti informaciją apie kitus vartotojus, padaryti keitimus duomenų bazėse ar net išgauti duomenų bazės vartotojo prisijungimo duomenis.
Problemos sprendimas:Sprendimų yra ganėtinai daug, kaip pavydžiui pateiksiu vieną su PHP. Jums reikia filtruoti metacharacters, tai galite padaryti naudodami komandą escapeshellcmd()
Pavyzdys:

Code: Select all

$privilegija_POST = $_POST["privilegija"]; // šį kodą keičiam į:$privilegija = escapeshellcmd($privilegija_POST);
Trumpai apie kitus variantus (Jeigu nesuprantate nieko apie PHP šiuos variantus galite ignoruoti): htmlspecialchars($str, ENT_QUOTES), escapeshellargs(),
su Mysqli:

Code: Select all

$privilegija_POST = $mysqli->real_escape_string($privilegija_POST); // bus plačiau prie sql injection
su PDO:

Code: Select all

$privilegija_POST->execute(array(':privilegija' => $_SESSION['privilegija']) ); // bus plačiau prie sql injection
3. Jeigu spragos pavadinimas: SQL Injection/Blind SQL Injection
Ši spraga yra dažniausiai pasitaikanti, o ir ja pasinaudoti gali beveik kiekvienas turintis PHP pagrindus, ar nuovokos naudojantis google paieškos sistema. Naudodamasis šia spraga įsilaužėlis gali gauti visą informaciją iš jūsų duomenų bazių, ją redaguoti, ištrinti.
Problemos sprendimas: Variantų taipogi yra daug naudojantis tiek PHP, tiek Mysqli, tiek PDO.
Vienas iš variantų naudojantis įrastu PHP: suradus _POST arba _GET:

Code: Select all

$page = $_GET['page'];$country = $_GET['country'];
Pakeisti į:

Code: Select all

$page = mysql_real_escape_string($_GET['page']);$country = mysql_real_escape_string($_GET['country']); 
Aišku šis extensionas bus ateityje pašalintas iš PHP, panašiu principu veikia ir komanda

Code: Select all

addslashes();
Kiti pavydžiai: panašiai kaip su XSS rekomenduojama naudoti Mysqli arba PDO (PDO eina nuo PHP 5.1 versijos), PHP versija galima pamatysi parašius

Code: Select all

phpinfo();
Pavyzdukas su PDO:

Code: Select all

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) {    // do something with $row}
Su Mysqli:

Code: Select all

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');$stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result();while ($row = $result->fetch_assoc()) {}
---------------------------------------------------------------------------------
Pavyzdys su amxbans 6.xx Blind sql injection ir kaip tai sutvarkyti:
---------------------------------------------------------------------------------
į ban_details.php po session_start(); eilutės įrašome:

Code: Select all

$bid = mysql_real_escape_string($_GET['bid']);$bhid = mysql_real_escape_string($_GET['bhid']);
Noredami užblokuoti, kad įsilaužėlis negalėtų skanuoti jūsų web, galite blokotuoti failą robot.txt per .htaccess arba index faile įdėti kodą iš šios temos: http://amxmodx.lt/viewtopic.php?p=23035#p23035

Kol kas tiek, jeigu kažką domins papildysiu plačiau. ( Būtų naudinga stickint postą)

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 08 22:43
by laimiukas3
prisek programa jai gali

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 08 22:54
by psychical
MySQL jau pamiršk, jei mokai, mokink ant to kas veikia ir veiks ateityje, tai mysqli ir pdo.

Beje, užtenka pilnai ir: $kazkas = addslashes(htmlentities($_GET['kazkas']));
Esmė ta, kad net PDO nesugeba susidoroti su HTMLENTITIES, tad jis yra būtinas, kad būtų paverstas į kodą, ne simbolius.

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 08 23:07
by V1LKAS
psychical wrote:MySQL jau pamiršk, jei mokai, mokink ant to kas veikia ir veiks ateityje, tai mysqli ir pdo.

Beje, užtenka pilnai ir: $kazkas = addslashes(htmlentities($_GET['kazkas']));
Esmė ta, kad net PDO nesugeba susidoroti su HTMLENTITIES, tad jis yra būtinas, kad būtų paverstas į kodą, ne simbolius.
Dėl to ir pateikiau visus variantus, pamoka yra dabartinei padėčiai pagerinti, 95% visų lietuvių šioje srityje dar besinaudoja old guy MySQL, su addslashes galima praslysti su sql injection, pvz kurį ir pats išbandžiau
http://stackoverflow.com/questions/8609 ... addslashes
o komentaras

Code: Select all

 Aišku šis extensionas bus ateityje pašalintas iš PHP
ir buvo su mintimis, kad tai MySQL galima naudoti bet nebus naudojama ateityje, bet kokiu atvėju pats supranti jeigu čia viską gražiai aiškinti iš eilės tai tektų prisegti .pdf guidą su 50 psl teksto, pateikiau tik pagrindus, nieko nesigaudančiam pasitvarkyti, taipogi jeigu nori/gali papildomai kažkokių minčių prideti, esi moderatorius, edit mygtuku gali papildyti mano post. :)

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 09 10:52
by beast
Dar galima paminėti, kad prieš atliekant query, galima su PHP patikrinti įvestus duomenis pagal iš anksto numatytą whitelistą, pvz. jei žinai, kad duomenis turi būti sudaryti tik iš skaičių tai tikrini su is_numeric. Arba jei žinai, kad stringas negali būti ilgesnis nei X char'ų tikrini su strlen. Emailus ir kitką galima patikrinti su filter_var. Jei pasirinkimai yra iš anksto numatyti, pvz. formos dropdown liste, tai po to jau apdorojant duomenis, reiktų patikrinti ar pasirinkimas atitinką nors vieną iš numatytų. Ir t.t. ir pan...

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 12 11:40
by psychical
Nujei pradedam apie tai :D Tai jei skaičius turi būt tai

Code: Select all

$skaicius = (int) $_GET['skaicius'];
-- 2015 Vas 12 11:40 --

Šiaip, dar vienas pastebėjimas, kad jei sakykim turit 10, 20 POST ar GET, kad nereikėtų visų rašinėt atskirai ir escape'inti, tam yra apėjimas:

Code: Select all

$escapedPost = array_map('addslashes', $_POST); //Visiems _POST pritaikys addslashes$escapedPost = array_map('htmlentities', $escapedPost); //Visiems _POST pritaikys htmlentities

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Feb 13 10:56
by V1LKAS
psychical wrote:Nujei pradedam apie tai :D Tai jei skaičius turi būt tai

Code: Select all

$skaicius = (int) $_GET['skaicius'];
-- 2015 Vas 12 11:40 --

Šiaip, dar vienas pastebėjimas, kad jei sakykim turit 10, 20 POST ar GET, kad nereikėtų visų rašinėt atskirai ir escape'inti, tam yra apėjimas:

Code: Select all

$escapedPost = array_map('addslashes', $_POST); //Visiems _POST pritaikys addslashes$escapedPost = array_map('htmlentities', $escapedPost); //Visiems _POST pritaikys htmlentities
Kažkodėl su array_map su addlashes tiek GET tiek POST reikšmė pametama, jeigu bandai ją kitam faile gauti, tai kaip buvo pirma ideja patogumo atžvilgiu, ar viskas gerai jeigu formos yra tam pačiam faile netikrinau.

Re: [Pamoka] Puslapio sms sistemų, amxbans ir t.t apsaugos

Posted: 2015 Apr 06 16:05
by NZT
V1LKAS wrote: Pavyzdys su amxbans 6.xx Blind sql injection ir kaip tai sutvarkyti:
---------------------------------------------------------------------------------
į ban_details.php po session_start(); eilutės įrašome:

Code: Select all

$bid = mysql_real_escape_string($_GET['bid']);$bhid = mysql_real_escape_string($_GET['bhid']);
Per Amxbans 6.13 nerandu tokio failo kaip "ban_details.php".

Kaip sutvarkyti šitus?
Image