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

Forumas specialiai skirtas pamokoms kuriant CS 1.6 serverį
Post Reply
User avatar
V1LKAS
Flooderis arba specialistas
Posts: 612
Joined: 2012 Nov 08 12:55
Skype: darius489

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

Post 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ą)
Attachments
pavyzdys.png
Last edited by V1LKAS on 2015 Feb 08 23:18, edited 1 time in total.

User avatar
laimiukas3
Moderatorius
Posts: 4569
Joined: 2012 Aug 03 01:12
Skype: laimiukas3
Location: Vilnius
Contact:

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

Post by laimiukas3 »

prisek programa jai gali
Image
Image
Image

User avatar
psychical
Viršininkas
Posts: 2094
Joined: 2011 Mar 12 22:19
Skype: tautvydas11
Location: Linksmakalnis
Contact:

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

Post 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.

User avatar
V1LKAS
Flooderis arba specialistas
Posts: 612
Joined: 2012 Nov 08 12:55
Skype: darius489

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

Post 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. :)

User avatar
beast
AMX Mod X ekspertai
Posts: 509
Joined: 2011 Jan 08 18:44
Skype: thefurious4
Contact:

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

Post 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...

User avatar
psychical
Viršininkas
Posts: 2094
Joined: 2011 Mar 12 22:19
Skype: tautvydas11
Location: Linksmakalnis
Contact:

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

Post 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

User avatar
V1LKAS
Flooderis arba specialistas
Posts: 612
Joined: 2012 Nov 08 12:55
Skype: darius489

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

Post 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.

User avatar
NZT
Flooderis arba specialistas
Posts: 836
Joined: 2011 Aug 18 17:44

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

Post 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

Post Reply

Who is online

Users browsing this forum: No registered users and 4 guests