Jakieś badziewie przybłąkało się na jedno z forów opartych na SMF. Klasycznie - doklejone base64_decode" title="Zobacz w manualu PHP" target="_manual do wszystkich plików php w ramach public_html. I szukanie wiatru w polu, co jest grane - przecież soft załatany, wszystko niby ok.

Po wyczyszczeniu wszystkiego, kopię w plikach, to jakis spamerski bot, bo zebrał ~8000 reklamówek w katalogu skinów TinyMCE gotowych do odpalenia, 3 skrypty PHP o sporej wadze i wszędzie podoklejane exploity naszpikowane eval" title="Zobacz w manualu PHP" target="_manualami. Na szczęście, żadnej niszczycielskiej działalności nie ma (przynajmniej nie znalazłem), za to napuchnięty dziennik błędów.

Lock forum, czyszczenie. Wszystko połatane, ale jak zabezpieczyć...? Dokopałem się na oficjalnym forum do wątku: http://www.simplemachines.org/community/in...?topic=291486.0

Kto był winowajcą? Spambot, który rejestruje się na forum, dorzuca avatar i za pomocą wbudowanych atrybutów omija zabezpieczenie w postaci getimagesize" title="Zobacz w manualu PHP" target="_manual:



Normalnie żyć, nie umierać... Owszem, pozostaje blokada rejestracji użyszkodników (mod: http://custom.simplemachines.org/mods/index.php?mod=1547), ale przestrzegam wszystkich przed takim sprawdzaniem... Dawno wykorzystywana luka, niestety...

Trzeba zrobić filtrowanie do uploadowania, poszukam jeszcze jakiegoś sposobu na wywalenie atrybutów z pliku i chyba napiszę łatkę.

Obejście:
Kod
mogrify -strip image.jpg


edit:
  1. <?php
  2. $fp = fopen($destName, 'wb');
  3.    if ($fp && substr($url, 0, 7) == 'http://')
  4.    {
  5.        $fileContents = fetch_web_data($url);
  6.  
  7.        // Though not an exhaustive list, better safe than sorry.
  8.        if (preg_match('~(iframe|<?php|<?|<%|html|eval|body|script)~', $fileContents) === 1)
  9.        {
  10.            fclose($fp);
  11.            return false;
  12.        }
  13.  
  14.        fwrite($fp, $fileContents);
  15.        fclose($fp);
  16.    }
  17.    elseif ($fp)
  18.    {
  19.        $fp2 = fopen($url, 'rb');
  20.        while (!feof($fp2))
  21.            fwrite($fp, fread($fp2, 8192));
  22.        fclose($fp2);
  23.        fclose($fp);
  24.    }
  25. ?>


Sprawdzanie jest, ale tylko dla zewnętrznych plików, uploadowanych już nie... :X

edit2: No i gotowa łatka. Powyższy listing jest z pliku ./Sources/Subs-Graphics.php i powinno wystarczyć:
  1. <?php
  2. $fp = fopen($destName, 'wb');
  3.    if ($fp && substr($url, 0, 7) == 'http://')
  4.    {
  5.        $fileContents = fetch_web_data($url);
  6.  
  7.        // Though not an exhaustive list, better safe than sorry.
  8.        if (preg_match('~(iframe|<?php|<?|<%|html|eval|body|script)~', $fileContents) === 1)
  9.        {
  10.            fclose($fp);
  11.            return false;
  12.        }
  13.  
  14.        fwrite($fp, $fileContents);
  15.        fclose($fp);
  16.    }
  17.    elseif ($fp)
  18.    {
  19.        $fp2 = fopen($url, 'rb');
  20.        while (!feof($fp2))
  21.            fwrite($fp, fread($fp2, 8192));
  22.        fclose($fp2);
  23.        fclose($fp);
  24.        
  25.        if (preg_match('~(iframe|<?php|<?|<%|html|eval|body|script)~', file_get_contents($destName)) === 1){
  26.            file_put_contents($destName, '');
  27.            return false;
  28.        }
  29.    }
  30. ?>


Zamiast tamtego fragmentu. Nieco obejście, ale powinno działać. Buga zgłosiłem autorom. Aha, nie zapomnijcie o
Kod
mogrify -strip *.jpg
dla katalogu attachments.

edit3: wyszła wersja 1.1.9 łatająca tę dziurę.