You are on page 1of 4

RelatandoErros

ModelodeArmazenamentoCriptografado
ManualdoPHP
Segurana
SeguranadeBancosdeDados
Changelanguage: BrazilianPortuguese
EditReportaBug

InjeodeSQL
MuitosdesenvolvedoreswebnosabemdecomoconsultasSQLpodemsermanipuladasepresumemque
umaconsultadeSQLumcomandoconfivel.SignificaqueconsultasSQLsocapazesdepassar
indetectadoporcontrolesdeacesso,portantodesviandodaautenticaopadroedechecagensde
autorizao,ealgumasvezesconsultasSQLpodempermitiracessocomandoemnveldosistema
operacionaldoservidor.
InjeodiretadecomandosSQLumatcnicaondeumatacantecriaoualteracomandosSQLexistentes
paraexpordadosescondidos,ousobrescreverdadosvaliosos,ouaindaexecutarcomandosdesistema
perigososnoservidor.Issopossvelseaaplicaopegaraentradadousurioecombinarcomparmetros
estticosparamontarumaconsultaSQL.Osexemplosaseguirsobaseadosemhistriasverdadeiras,
infelizmente.
Devidofaltadevalidaodeentradaeconectandoaobancodedadosusandoosuperusurioouum
usurioquepodecriarusurio,oatacantepodecriarumsuperusurionoseubancodedados.
Exemplo#1Dividintooresultsetempginas...ecriandosuperusurios(PostgreSQL)
<?php
$offset=$argv[0];//Cuidado,semvalidaodeentrada!
$query="SELECTid,nameFROMproductsORDERBYnameLIMIT20OFFSET$offset;";
$result=pg_query($conn,$query);
?>

Usuriosnormaisclicamnoslinks'prxima'e'anterior'onde$offsetcodificadonaURL.Oscriptespera
queovalorde$offsetsejaumnmerodecimal.Noentanto,esealgumtentarinvadiracrescentandoaforma
codificadaporurlencode()daURLseguinte:
0;
insertintopg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select'crack',usesysid,'t','t','crack'
frompg_shadowwhereusename='postgres';

Seissoacontecesse,entooscriptdariadepresenteacessodesuperusurioaoatacante.Percebaque0
parafornecerumadeslocamentovlidoparaaconsultaoriginaleterminla.
Nota:
umatcnicacomumforaroavaliadordeSQLignorarorestodaconsultaescritapelo
desenvolvedorcom,queosinaldecomentrionoSQL.
Umamaneiradeganharsenhadesviarsuaspginasderesultadodebusca.Anicacoisaqueoatacante
precisafazerversealgumavarivelenviadausadaemumcomandoSQLquenotratadocorretamente.
EssesfiltrospodemserconfiguradosdeformaapersonalizarclusulasWHERE,ORDERBY,LIMITe
OFFSETemcomandosSELECTSeseubancodedadossuportaoconstrutorUNION,oatacantepodetentar

adicionarumaconsultainteiraconsultaoriginalparalistarsenhasdeumatabelaarbitrria.Usodecampos
desenhacriptografadosfortementeincentivado.
Exemplo#2Listandoartigos...ealgumassenhas(qualquerbancodedados)
<?php
$query="SELECTid,name,inserted,sizeFROMproducts
WHEREsize='$size'
ORDERBY$orderLIMIT$limit,$offset;";
$result=odbc_exec($conn,$query);
?>

AparteestticadaconsultapodesercombinadacomoutrocomandoSELECTquerevelatodasassenhas:
'
unionselect'1',concat(uname||''||passwd)asname,'19710101','0'fromusertable;

Seessaconsulta(brincandocom'e)fosseatribudaparaumadasvariveisusadasem$query,aconsulta
bobaacordaria.
ComandosdeUPDATEtambmsosuscetveisaataques.Essasconsultastambmsoameaadasporcortes
eacrscimosdeumanovaconsulta.MasoatacantepodebrincarcomaclusulaSET.Nessecasoeleprecisa
estardepossedealgumainformaosobreoesquemaparamanipularaconsultacomsucesso.Issopodeser
conseguidoexaminandoosnomesdasvariveisdoformulrio,ousimplesmenteporforabruta.No
existemmuitasconvenesparacamposguardandosenhasounomesdeusurios.
Exemplo#3Dereinicializandoumasenha...paraganhandomaisprivilgios(qualquerbancode
dados)
<?php
$query="UPDATEusertableSETpwd='$pwd'WHEREuid='$uid';";
?>

Masumusuriomaliciosoenviaovalor'oruidlike'%admin%'para$uidparamudarasenhado
administrador,ousimplesmenteconfigura$pwdpara"hehehe',admin='yes',trusted=100"(comumespao
sobrando)paraganharmaisprivilgios.Ento,aconsultaficartorta:
<?php
//$uid=='oruidlike'%admin%';
$query="UPDATEusertableSETpwd='...'WHEREuid=''oruidlike'%admin%';";
//$pwd=="hehehe',admin='yes',trusted=100"
$query="UPDATEusertableSETpwd='hehehe',admin='yes',trusted=100WHERE
...;";
?>

Umexemploassustadordecomocomandosdosistemaoperacionalpodemseracessadosemalgunsbancos
dedados.
Exemplo#4Atacandoosistemaoperacionaldoservidor(MSSQLServer)
<?php
$query="SELECT*FROMproductsWHEREidLIKE'%$prod%'";
$result=mssql_query($query);
?>

Seoatacanteenviarovalora%'execmaster..xp_cmdshell'netusertesttestpass/ADD'para$prod,ento
$queryterovalor:
<?php
$query="SELECT*FROMproducts
WHEREidLIKE'%a%'
execmaster..xp_cmdshell'netusertesttestpass/ADD'";
$result=mssql_query($query);
?>

MSSQLServerexecutaoscomandosSQLemumloteincluindoumcomandoparaadicionarumnovo
usurioparaobancodedadosdecontaslocais.Seessaaplicaoestiversendoexecutadacomosaeo
servioMSSQLSERVERestivessesendoexecutadocomprivilgiossuficientes,oatacanteteriaagorauma
contacomaqualpoderiaacessaressamquina.
Nota:
Algunsdosexemplosacimaestoligadosabancosespecficos.Issonosignificaqueumataque
similarimpossvelcontraoutrosprodutos.Seuservidordebancodedadospodeteruma
vulnerabilidadesimilardeoutamaneira.

TcnicasparaEvitarAtaques
Vocpodedizerqueoatacanteprecisapossuirumpoucodeinformaosobreoesquemadebancodedados
namaioriadosexemplos.Voctemrazo,masvocnuncasabequandoecomoissopodeserobtidoe,se
acontecer,seubancodedadospodeficarexposto.Sevocestiverusandoumpacoteopensource
publicamentedisponvelparalidarcombancodedeados,quepodepertenceraumsistemadecontrolede
contedoouforum,osinvasoresfacilmenteproduzemumacpiadepartedeseucdigo.Tambmpodeser
umriscodeseguranaseesteformaldesenhado.
Essesataquessebaseamprincipalmenteemexplorarfalhasnocdigoescritosemsepreocuparcom
segurana.Nuncaconfieemnenhumtipodeentrada,especialmenteaquelaquevemdoladodocliente,
mesmoquevenhadeumcombobox,umcampodeentradaescondido(hidden)ouumcookie.Oprimeiro
exemplomostracomoumaconsultainocentepodecausardesastres.
Nuncaconecteaobancodedadoscomoumsuperusuriooucomoodonodobancodedados.Use
sempreusuriospersonalidadoscomprivilgiosbemlimitados.
Verifiqueseumaentradaqualquertemotipodedadosexperado.OPHPtemumgrandenmerode
funesdevalidaodeentrada,desdeasmaissimplesencontradaemFunesdeVariveiseem
FunesdeTipodeCaracteres(ex.:is_numeric(),ctype_digit()respectivamente)almdeusaro
suporteaExpressesRegularesCompatvelcomPerl.
Seaaplicaoesperaporentradasnumricas,considereverificarosdadoscomafunois_numeric(),
ousilenciosamentemudaroseutipousandosettype(),ouusararepresentaonmericausandoa
funosprintf().
Exemplo#5Umamaneiramaisseguraparacomporconsultasdepaginao
<?php
settype($offset,'integer');
$query="SELECTid,nameFROMproductsORDERBYnameLIMIT20OFFSET$offset;";
//porfavorpercebao%dnastringdeformato,usando%sseriaintil
$query=sprintf("SELECTid,nameFROMproductsORDERBYnameLIMIT20OFFSET%d;",
$offset);
?>

Adicioneaspasparacadavalornonumricoespecificadopelousurioqueserpassadoparaobanco
dedadoscomasfunesdecaracteresdeescape(ex.:mysql_real_escape_string(),
sqlite_escape_string(),etc.).Seummecanismodeescapedecaracterespecficoparaoseubancode
dadosnofordisponvel,asfunesaddslashes()estr_replace()podemserteis(dependendodotipo
debancodedados).Vejaooprimeiroexemplo.Comooexemplomostra,adicionaraspasparte
estticadaconsultanosuficiente,fazendocomqueaconsultasejafacilmenteatacada.
Noimprimaqualquerinformaoespecficadobancodedados,especialmentesobreoesquema,
custeoquecustar.VejatambmRelatriodeErroseFunesdeTratamentoeRelatriodeErros.
Vocpodeusarstoredproceduresecursorespreviamentedefinidasparaabstrairacessoaosdadospara
queosusuriosnoacessemtabelasouviewsdiretamente,masessasoluopodeteroutrosimpactos.
Almdisso,vocganhaemrelatarconsultasoudentrodoscriptounoprpriobancodedados,seesse
suportar.Obviamente,orelatrioparaprevinirqualquertentativadanosa,maspodesertilparaajudara
rastrearqualaplicaofoiatacada.Orelatrionotilemsi,masatrvesdainformaoqueelecontm.
Maisdetalhesgeralmentemelhorquemenos.
addanote

UserContributedNotes2notes
up
down
42
RicharddotCorfieldatgmaildotcom
5yearsago
Thebestwayhasgottobeparameterisedqueries.Thenitdoesn'tmatterwhattheusertypesin
thedatagoestothedatabaseasavalue.
AquicksearchonlineshowssomepossibilitiesinPHPwhichisgreat!Evenonthissite
http://php.net/manual/en/pdo.preparedstatements.php
whichalsogivesthereasonsthisisgoodbothforsecurityandperformance.

up
down
26
valerylourieatgmaildotcom
8yearsago
NotethatPHP5introducedfiltersthatyoucanuseforuntrusteduserinput:
http://us.php.net/manual/en/intro.filter.php
addanote

SeguranadeBancosdeDados
DesenhandoBancosdeDados
ConectandocomoBancodeDados
ModelodeArmazenamentoCriptografado
InjeodeSQL
Copyright20012017ThePHPGroup
MyPHP.net
Contact
OtherPHP.netsites
Mirrorsites
Privacypolicy

You might also like