[ balkan7 @ 24.03.2014. 21:52 ] @
Zdravo
Napadnut sam XSS, treba mi pomoc o nekoliko primera.
Koristim svoj CMS tako da moram ovo sam popraviti, zato treba mi neke savete ...

1. Radi se o slikama
Tacno nesecam se gde sam pronasao da mogu hakeri koristiti XSS na slikama koje se ucitava sa echo

Recimo slika je postavljena u bazi koristeci filter dali je jpg png i sl...
Code:
$result = mysql_query("Select * gallery i take dalje");
if(mysql_num_rows($result) != ""){
 while($data = mysql_fetch_assoc($result)){
 echo "<img src='images/".$data['photo_name']."' />";
  }
 }

Jel ovo je xss vulnerability?

2. tinyMCE

U ovom slucaju moram snimiti HTML code u bazi, za ovo sam koristio samo filter stripslashes($_POST['content']) najvise sumljam u ovome.
Ali sta ako koristim za upis u bazi filter htmlentities(); prikaz sa html_entity_decode();
Jel ovo je bolja opcija za XSS vulnerability ?

3. PHP define();

Ponekad koristim HTML code u define();
Code:
define("TEST", "<b>Hello</b> <br />world.");
echo "<div>".TEST."</div>";

Jel ovo je xss vulnerability?

I za kraj sta je najbolje koristit za polja recimo text plain ( $_POST['title'] ).

Hvala

[ Nikola Poša @ 25.03.2014. 08:55 ] @
1. Iz pogrešnog ugla gledaš. Ono što nam nisi pokazao je na koji način se upisuje taj "photo_name", jer od toga zavisi da li neko može da ubaci nešto zlonamerno u taj podatak.

2. stripslashes() iskreno ničemu ne služi, to je zaostaviština iz perioda dok magic-quotes-gpc podešavanje nije postalo deprecated. Nadam se da ti je isključeno to podešavanje. Nemoj upisivati u bazu escape-ovan HTML, to nema nimalo smisla. Jer ti i ako uradiš na taj način, ako ti neko ubaci neki zlonamerni <script> tag u taj HTML, kad ga decode-uješ opet si na istom. Znači sasvim regularno je da ti na nekim mestima treba da dozvoliš članu tvog sajta da ispiše neki HTML, tipa ako je u pitanju neki sajt gde se post-uju članci, da taj autor može da dekoriše to što piše nekim HTML-om. Ili jednostavno da omogućiš posetiocima sajta da u svoim komentarima mogu koristiti samo neki osnovi set HTML tagova. E upravo u tome i jeste stvar u ovoj situaciji, da ti filtriraš HTML, a ne da ga escape-uješ, pošto je zahtev takav moraš da ga ispišeš. A filtriranje podrazumeva da iz njega izbaciš sve tagove osim onih koje želiš da dozvoliš. Jednostavan primer bi bio korišćenjem strip_tags funkcije:
Code:
$filtered = strip_tags($html, '<b><i><u>'); //dozvoli samo <b>, <i> i <u> tagove

Naravno, postoje dosta kompleksniji i robustniji filteri, tipa HTML Purifier.

3. To naravno nije XSS propust, sve dok taj HTML ne dolazi "spolja", od nekog korisnika, već ga ti sam definišeš.

A što se tog poslednjeg pitanja tiče, sve zavisi od slučaja i onoga što želiš da omogućiš kranjim korisnicima. Ako pri ispisu tog title-a kojeg si naveo, ne želiš da tu bude ikakav HTML, onda ćeš naravno bezuslovno raditi escape (htmlentities) pri ispisu tog podatka.
[ balkan7 @ 25.03.2014. 15:01 ] @
Hvala ti za pomoc Nikola.

1. Recimo za slike koristim upload script i naravno u bazi samo zapisujem ime slika.
Interesuje me dali moram koristiti escape ako je u bazi polja: photo_name [ neka_slika.jpg ]

Code:
echo "<img src='images/".$data['photo_name']."' />";


2. HTML Purifier mislim da je najbolje resenje za HTML tagove po sto koristim iframe za videa.

A što se tog poslednjeg pitanja tiče, sve zavisi od slučaja i onoga što želiš da omogućiš kranjim korisnicima. Ako pri ispisu tog title-a kojeg si naveo, ne želiš da tu bude ikakav HTML, onda ćeš naravno bezuslovno raditi escape (htmlentities) pri ispisu tog podatka.

Znaci ako imam cist title u upis, jel moram i njega escape za ispis ?

Code:
echo "<div class='content'><h2>".$data['title']."</h2><p>".$data['content']."</p></div>";
/* Result <div class='content'><h2>Test</h2><p>bla bla</p></div> */

[ Nikola Poša @ 25.03.2014. 15:21 ] @
Citat:
balkan7: Recimo za slike koristim upload script i naravno u bazi samo zapisujem ime slika.
Interesuje me dali moram koristiti escape ako je u bazi polja: photo_name [ neka_slika.jpg ]

Ne, ne treba naravno da radiš escape u tom slučaju, već da postaviš dobru validaciju u tom delu za upload, što podrazumeva dozvoljavanje upload-a samo fajlova koji su slike (jpeg, gif, png i slično), plus eventualno validacija dimenzija, veličine, itd.

Citat:
balkan7: Znaci ako imam cist title u upis, jel moram i njega escape za ispis ?

Ja uvek radim escape svih ispisa za koje znam da ne trebaju da sadrže HTML, tipa title, username i slično. Čak iako postavim neka filtriranja i validacije pri unosu tih podataka.
[ balkan7 @ 25.03.2014. 17:17 ] @
Hvala jos jednom Nikola ...