Exploitable PHP functions

Próbuję zbudować listę funkcji, które mogą być używane do dowolnego wykonywania kodu. Celem nie jest lista funkcji, które powinny być umieszczone na czarnej liście lub w inny sposób wyłączone. Raczej chciałbym mieć grep-able listę red-flag słów kluczowych przydatnych podczas wyszukiwania skompromitowanego serwera w poszukiwaniu back-doors.

Chodzi o to, że jeśli chcesz zbudować wielozadaniowy złośliwy skrypt PHP - taki jak skrypt "web shell", taki jak c99 lub r57-będziesz musiał użyć jednego lub więcej stosunkowo małego zestawu funkcji gdzieś w pliku, aby umożliwić użytkownikowi wykonanie dowolnego kodu. Wyszukiwanie tych funkcji pomaga szybciej zawęzić stóg dziesiątek tysięcy plików PHP do stosunkowo małego zestawu skryptów, które wymagają bliższego zbadania.

Na przykład, każda z poniższych sytuacji byłaby uważana za złośliwą (lub straszną):]}
<? eval($_GET['cmd']); ?>

<? system($_GET['cmd']); ?>

<? preg_replace('/.*/e',$_POST['code']); ?>

I tak dalej.

Przeszukiwanie zainfekowanej strony internetowej pewnego dnia, nie zauważyłem kawałka złośliwego kodu, ponieważ nie zdawałem sobie sprawy, że preg_replace może być niebezpieczny przez użycie /e flaga (który, poważnie? Dlaczego w ogóle tam jest ?). Są jeszcze jakieś inne, za którymi tęskniłem?

Oto moja lista do tej pory:

Shell Execute

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

PHP Wykonaj

  • eval
  • preg_replace (z modyfikatorem /e)
  • create_function
  • include[_once] / require[_once] (w tym samym czasie, mario i jego przyjaciele zostali zabici.]}

Przydałaby się również lista funkcji zdolnych do modyfikowania plików, ale wyobrażam sobie, że 99% kodu exploita będzie zawierać co najmniej jedną z powyższych funkcji. Ale jeśli masz listę wszystkich funkcji zdolnych do edycji lub wyprowadzania plików, opublikuj ją i Dołączę to tutaj. (I nie liczę mysql_execute, ponieważ jest to część innej klasy exploitu.)

Author: tylerl, 2010-06-25

23 answers

Do zbudowania tej listy użyłem 2 źródeł. A Study In Scarlet and RATS . Dodałem również kilka moich własnych do miksu i ludzie z tego wątku pomogli.

Edit: po zamieszczeniu tej listy skontaktowałem się z założycielem RIPS i od tej pory to narzędzie przeszukuje kod PHP pod kątem użycia każdej funkcji z tej listy.

Większość tych wywołań funkcji jest klasyfikowana jako Sinki. Gdy skażona zmienna (np. $_REQUEST) jest przekazywana do funkcja umywalki, wtedy masz słabość. Programy takie jak RATS i RIP używają funkcji grep like do identyfikacji wszystkich zlewozmywaków w aplikacji. Oznacza to, że programiści powinni zachować szczególną ostrożność podczas korzystania z tych funkcji, ale jeśli wszystkie one są zakazane, nie będziesz w stanie wiele zrobić.

"z wielką mocą przychodzi wielka odpowiedzialność."

--Stan Lee

Wykonanie Polecenia

exec           - Returns last line of commands output
passthru       - Passes commands output directly to the browser
system         - Passes commands output directly to the browser and returns last line
shell_exec     - Returns commands output
`` (backticks) - Same as shell_exec()
popen          - Opens read or write pipe to process of a command
proc_open      - Similar to popen() but greater degree of control
pcntl_exec     - Executes a program

Kod PHP Wykonanie

Oprócz eval istnieją inne sposoby wykonywania kodu PHP: include/require może być używany do zdalnego wykonywania kodu w postaci luk Local File Include oraz Remote File Include.

eval()
assert()  - identical to eval()
preg_replace('/.*/e',...) - /e does an eval() on the match
create_function()
include()
include_once()
require()
require_once()
$_GET['func_name']($_GET['argument']);
$func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array());

Lista funkcji, które akceptują wywołania zwrotne

Funkcje te akceptują parametr Łańcuchowy, który może być użyty do wywołania funkcji wybranej przez atakującego. W zależności od funkcji atakujący może lub nie może mieć możliwości przejścia parametr. W takim przypadku można użyć funkcji Information Disclosure, takiej jak phpinfo().

Function                     => Position of callback arguments
'ob_start'                   =>  0,
'array_diff_uassoc'          => -1,
'array_diff_ukey'            => -1,
'array_filter'               =>  1,
'array_intersect_uassoc'     => -1,
'array_intersect_ukey'       => -1,
'array_map'                  =>  0,
'array_reduce'               =>  1,
'array_udiff_assoc'          => -1,
'array_udiff_uassoc'         => array(-1, -2),
'array_udiff'                => -1,
'array_uintersect_assoc'     => -1,
'array_uintersect_uassoc'    => array(-1, -2),
'array_uintersect'           => -1,
'array_walk_recursive'       =>  1,
'array_walk'                 =>  1,
'assert_options'             =>  1,
'uasort'                     =>  1,
'uksort'                     =>  1,
'usort'                      =>  1,
'preg_replace_callback'      =>  1,
'spl_autoload_register'      =>  0,
'iterator_apply'             =>  1,
'call_user_func'             =>  0,
'call_user_func_array'       =>  0,
'register_shutdown_function' =>  0,
'register_tick_function'     =>  0,
'set_error_handler'          =>  0,
'set_exception_handler'      =>  0,
'session_set_save_handler'   => array(0, 1, 2, 3, 4, 5),
'sqlite_create_aggregate'    => array(2, 3),
'sqlite_create_function'     =>  2,

Ujawnianie Informacji

Większość z tych wywołań funkcji nie jest sinkami. Ale raczej może to być luka, jeśli któreś z zwróconych danych jest widoczne dla atakującego. Jeśli atakujący widzi phpinfo(), jest to zdecydowanie Luka.

phpinfo
posix_mkfifo
posix_getlogin
posix_ttyname
getenv
get_current_user
proc_get_status
get_cfg_var
disk_free_space
disk_total_space
diskfreespace
getcwd
getlastmo
getmygid
getmyinode
getmypid
getmyuid

Inne

extract - Opens the door for register_globals attacks (see study in scarlet).
parse_str -  works like extract if only one argument is given.  
putenv
ini_set
mail - has CRLF injection in the 3rd parameter, opens the door for spam. 
header - on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area. 
proc_nice
proc_terminate
proc_close
pfsockopen
fsockopen
apache_child_terminate
posix_kill
posix_mkfifo
posix_setpgid
posix_setsid
posix_setuid

Funkcje Systemu Plików

Według RATS wszystkie funkcje systemu plików w php są paskudne. Niektóre z nich nie wydaje się to zbyt użyteczne dla napastnika. Inne są bardziej przydatne, niż mogłoby się wydawać. Na przykład, jeśli allow_url_fopen=On to url może być użyty jako ścieżka do pliku, więc wywołanie copy($_GET['s'], $_GET['d']); może być użyte do przesłania skryptu PHP w dowolnym miejscu systemu. Również jeśli witryna jest podatna na żądanie wysyłane przez GET wszystkie z tych funkcji systemu plików mogą być nadużywane do kanału i ataku na inny host za pośrednictwem serwera.

// open filesystem handler
fopen
tmpfile
bzopen
gzopen
SplFileObject->__construct
// write to filesystem (partially in combination with reading)
chgrp
chmod
chown
copy
file_put_contents
lchgrp
lchown
link
mkdir
move_uploaded_file
rename
rmdir
symlink
tempnam
touch
unlink
imagepng   - 2nd parameter is a path.
imagewbmp  - 2nd parameter is a path. 
image2wbmp - 2nd parameter is a path. 
imagejpeg  - 2nd parameter is a path.
imagexbm   - 2nd parameter is a path.
imagegif   - 2nd parameter is a path.
imagegd    - 2nd parameter is a path.
imagegd2   - 2nd parameter is a path.
iptcembed
ftp_get
ftp_nb_get
// read from filesystem
file_exists
file_get_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
linkinfo
lstat
parse_ini_file
pathinfo
readfile
readlink
realpath
stat
gzfile
readgzfile
getimagesize
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromwbmp
imagecreatefromxbm
imagecreatefromxpm
ftp_put
ftp_nb_put
exif_read_data
read_exif_data
exif_thumbnail
exif_imagetype
hash_file
hash_hmac_file
hash_update_file
md5_file
sha1_file
highlight_file
show_source
php_strip_whitespace
get_meta_tags
 205
Author: Rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 04:12:07

Będziesz musiał skanować w poszukiwaniu include ($tmp) I require(HTTP_REFERER) oraz *_once. Jeśli skrypt exploita może zapisać do pliku tymczasowego, może to po prostu dołączyć później. Zasadniczo dwuetapowa ocena.

I możliwe jest nawet ukrycie zdalnego kodu za pomocą obejść takich jak:

 include("data:text/plain;base64,$_GET[code]");

Ponadto, jeśli twój serwer WWW został już skompromitowany, nie zawsze zobaczysz niezakodowane zło. Często powłoka exploita jest zakodowana w gzip. Pomyśl o include("zlib:script2.png.gz"); No eval tutaj, nadal ten sam efekt.

 59
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 17:24:25

To nie jest odpowiedź per se, ale tutaj jest coś ciekawego:

$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");

W tym samym duchu, call_user_func_array() mogą być używane do wykonywania zaciemnionych funkcji.

 48
Author: Aillyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-17 12:11:46

Dziwię się, że nikt nie wspomniał o echo i print jako o punktach wyzysku bezpieczeństwa.

Cross-Site Scripting (XSS) jest poważnym exploitem bezpieczeństwa, ponieważ jest jeszcze bardziej powszechny niż exploity związane z wykonywaniem kodu po stronie serwera.

 20
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 17:01:25

Szczególnie chciałbym dodać unserialize () do tej listy. Ma długą historię różnych luk w zabezpieczeniach, w tym arbitralnego wykonywania kodu, odmowy usługi i wycieku informacji pamięci. Nigdy nie należy go wywoływać na danych dostarczonych przez użytkownika. Wiele z tych wulów zostało naprawionych w wydaniach w ciągu ostatnich lat rosy, ale nadal zachowuje kilka paskudnych wulów w obecnym czasie pisania.

Aby uzyskać inne informacje o podejrzanych funkcjach / użytkowaniu PHP, rozejrzyj się po utwardzonym PHP Projekt i jego porady. Również ostatni miesiąc bezpieczeństwa PHP i 2007 miesiąc błędów PHP projekty

Zauważ również, że z założenia unserializacja obiektu spowoduje uruchomienie funkcji konstruktora i destruktora; kolejny powód, aby nie wywoływać go na danych dostarczonych przez użytkownika.

 19
Author: Cheekysoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 13:13:14

Mój VPS jest ustawiony na wyłączanie następujących funkcji:

root@vps [~]# grep disable_functions /usr/local/lib/php.ini
disable_functions = dl, exec, shell_exec, system, passthru, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, pfsockopen, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid

PHP ma wystarczająco dużo potencjalnie zniszczalnych funkcji, że Twoja lista może być zbyt duża dla grepa. Na przykład PHP ma chmod i chown, które mogą być używane do prostego dezaktywowania strony internetowej.

EDIT: być może warto zbudować skrypt bash, który wyszukuje plik dla tablicy funkcji pogrupowanych według zagrożeń( funkcje, które są złe, funkcje, które są gorsze, funkcje, które nigdy nie powinny być używane), a następnie obliczyć względność niebezpieczeństwa, jakie plik nakłada na procent. Następnie wypisz to do drzewa katalogu z procentami oznaczonymi obok KAŻDEGO pliku, jeśli jest większy niż próg, powiedzmy, 30% zagrożenia.

 17
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 17:10:00

Należy również pamiętać o klasie "luk w zabezpieczeniach przerwań", które pozwalają odczytywać i zapisywać dowolne miejsca pamięci!

Wpływają one na funkcje takie jak trim(), rtrim(), ltrim(), explode(), strchr(), strstr(), substr(), chunk_split(), strtok(), addcslashes(), str_repeat() i inne. Jest to w dużej mierze, ale nie wyłącznie, ze względu na funkcję przekazywania czasu wywołania w języku, który jest przestarzały od 10 lat, ale nie jest wyłączony.

Aby uzyskać więcej informacji, patrz Stefan Esser ' s talk about interruption vulnerabilities and other lower-level issues at BlackHat USA 2009 Slides Papier

Ten artykuł / prezentacja pokazuje również, jak dl() może być użyte do wykonania dowolnego kodu systemowego.

 15
Author: Cheekysoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-11 09:06:37

Plattform-specyficzne, ale także teoretyczne wektory exec:

  • dotnet_load ()
  • new COM ("WScript.Shell")
  • new Java ("java.lang.Runtime")
  • event_new () - bardzo ostatecznie

I jest o wiele więcej metod maskowania:

  • proc_open jest aliasem dla popen
  • call_user_func_array ("exE".chr (99), array ("/usr/bin/damage", "--all"));
  • file_put_contents("/cgi-bin/nextinvocation.cgi") && chmod(...)
  • PharData:: setDefaultStub - jeszcze trochę pracy, aby sprawdzić kod w .phar files
  • runkit_function_rename ("exec"," innocent_name") lub APD rename_function
 14
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 16:40:52

Oprócz konstrukcji języka eval Istnieje jeszcze jedna funkcja, która umożliwia dowolne wykonywanie kodu: assert

assert('ex' . 'ec("kill --bill")');
 13
Author: NikiC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-17 17:04:24

Nie wspomniano o jednym źródle ciekawych exploitów. PHP pozwala ciągom zawierać 0x00 bajty. Podstawowe funkcje (libc) traktują to jako koniec łańcucha znaków.

Pozwala to na sytuacje, w których (źle zaimplementowane) sprawdzanie poprawności w PHP da się oszukać, np. w sytuacji takiej jak:

/// note: proof of principle code, don't use
$include = $_GET['file'];
if ( preg_match("/\\.php$/",$include) ) include($include);

Może to obejmować każdy plik-nie tylko te kończące się na .php - przez wywołanie script.php?file=somefile%00.php

Więc każda funkcja, która nie będzie posłuszna długości łańcucha PHP może prowadzić do wrażliwość.

 10
Author: mvds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 12:41:33

A co z niebezpiecznymi elementami składni?

Zmienna "zmienna" ($$var) znajdzie zmienną w bieżącym zakresie o nazwie $var. Jeśli jest źle użyty, zdalny użytkownik może zmodyfikować lub odczytać dowolną zmienną w bieżącym zakresie. W zasadzie słabszy eval.

Ex: piszesz jakiś kod $$uservar = 1;, następnie zdalny użytkownik ustawia $uservar na "admin", powodując, że $admin zostanie ustawione na 1 w bieżącym zakresie.

 9
Author: L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 05:08:02

Myślę, że nie będziesz w stanie znaleźć wszystkich możliwych exploitów, analizując swoje pliki źródłowe.

  • Ponadto, jeśli są tu naprawdę świetne listy, możesz pominąć funkcję, która może być exploitet

  • Nadal może być" ukryty " zły kod jak ten

$myEvilRegex = base64_decode ('Ly4qL2U=');

Preg_replace ($myEvilRegex, $_POST['code']);

  • Można teraz powiedzieć, ja po prostu rozszerzyć mój skrypt pasujący również do tego

  • Ale wtedy będziesz miał ten mayn "prawdopodobnie zły kod", który dodatkowo jest poza jego kontekstem

  • Aby być (pseudo)bezpiecznym, powinieneś naprawdę napisać dobry kod i przeczytać cały istniejący kod samemu

 6
Author: Andreas Linden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 19:52:23

Backtick Operator Backtick on PHP manual

 5
Author: opHASnoNAME,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 04:38:34

Wiem, że move_uploaded_file zostało już wspomniane, ale przesyłanie plików w ogóle jest bardzo niebezpieczne. Sama obecność $_FILES powinna budzić pewne obawy.

Całkiem możliwe jest osadzenie kodu PHP w dowolnym pliku. Obrazy mogą być szczególnie narażone na komentarze tekstowe. Problem jest szczególnie kłopotliwy, jeśli kod akceptuje rozszerzenie Znalezione w danych $_FILES w takiej postaci, w jakiej jest.

Na przykład użytkownik może przesłać poprawny plik PNG z osadzonym kodem PHP jako " foo.php". Jeśli skrypt jest szczególnie naiwny, może faktycznie skopiować plik jako " / uploads / foo.php". Jeśli serwer jest skonfigurowany tak, aby umożliwić wykonywanie skryptów w katalogach wysyłania przez użytkownika (często tak jest i straszne niedopatrzenie), możesz natychmiast uruchomić dowolny dowolny kod PHP. (Nawet jeśli obraz jest zapisany jako .png, może być możliwe uzyskanie kodu do wykonania za pomocą innych wad bezpieczeństwa.)

A (niewyczerpująca) lista rzeczy do sprawdzenia przy przesyłaniu:

  • upewnij się, aby przeanalizować zawartość, aby upewnić się, że upload jest typem, który twierdzi, że jest
  • Zapisz plik ze znanym, bezpiecznym rozszerzeniem, które nigdy nie zostanie wykonane
  • upewnij się, że PHP (i inne wykonanie kodu) jest wyłączone w katalogach wysyłania użytkowników
 5
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-15 08:35:12

Dodajmy pcntl_signal i pcntl_alarm do listy.

Za pomocą tych funkcji możesz obejść dowolne ograniczenie set_time_limit utworzone w php.ini lub w skrypcie.

Ten skrypt na przykład będzie działał przez 10 sekund pomimo set_time_limit(1);

(kredyt dla Sebastiana Bergmannsa tweeti gist:

<?php
declare(ticks = 1);

set_time_limit(1);

function foo() {
    for (;;) {}
}

class Invoker_TimeoutException extends RuntimeException {}

class Invoker
{
    public function invoke($callable, $timeout)
    {
        pcntl_signal(SIGALRM, function() { throw new Invoker_TimeoutException; }, TRUE);
        pcntl_alarm($timeout);
        call_user_func($callable);
    }
}

try {
    $invoker = new Invoker;
    $invoker->invoke('foo', 1);
} catch (Exception $e) {
    sleep(10);
    echo "Still running despite of the timelimit";
}
 5
Author: edorian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-13 20:31:45

Istnieje mnóstwo exploitów PHP, które można wyłączyć za pomocą ustawień w PHP.plik ini. Oczywistym przykładem jest register_globals, ale w zależności od ustawień może być również możliwe dołączanie lub otwieranie plików ze zdalnych maszyn przez HTTP, które mogą być wykorzystane, jeśli program używa zmiennych nazw plików dla którejkolwiek z funkcji include() lub obsługi plików.

PHP umożliwia również wywołanie funkcji zmiennej poprzez dodanie () na końcu nazwy zmiennej -- np $myvariable(); wywoła nazwę funkcji określoną przez zmienna. Jest to możliwe do wykorzystania; np. jeśli atakujący może uzyskać zmienną zawierającą słowo 'eval' i może kontrolować parametr, to może zrobić wszystko, co chce, nawet jeśli program nie zawiera funkcji eval ().

 4
Author: Spudley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-15 08:45:23

Te funkcje mogą również mieć nieprzyjemne skutki.

  • str_repeat()
  • unserialize()
  • register_tick_function()
  • register_shutdown_function()
Pierwsze dwa mogą wyczerpać całą dostępną pamięć, a drugie utrzymać wyczerpanie...
 4
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-19 14:54:40

Była dyskusja na ten temat security.stackexchange.com Ostatnio

Funkcje, które mogą być używane do dowolnego wykonywania kodu

Dobrze, że zmniejsza zakres trochę-ale ponieważ 'print' może być używany do wstrzykiwania javascript (i tym samym ukraść sesje itp) Jego nadal nieco arbitralne.

Nie jest listą funkcji, które powinny być umieszczone na czarnej liście lub w inny sposób niedozwolone. Raczej chciałbym mieć listę grep-able

To rozsądne podejście.

Rozważ jednak napisanie własnego parsera - wkrótce znajdziesz podejście oparte na grep, które wymyka się spod kontroli (awk byłby nieco lepszy). Wkrótce też zaczniesz żałować, że zaimplementowałeś białą listę!

Oprócz tych oczywistych, zalecałbym oznaczanie wszystkiego, co zawiera include argumentem czegoś innego niż literalny ciąg znaków. Uważaj też na _ _ autoload ().

 2
Author: symcbean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 10:45:55

Obawiam się, że moja odpowiedź może być zbyt negatywna, ale...

IMHO, każda pojedyncza funkcja i metoda może być używana do nikczemnych celów. Pomyśl o tym jak o efektach niefaryczności: zmienna zostaje przypisana do użytkownika lub zdalnego wejścia, zmienna jest używana w funkcji, wartość zwracana funkcji użyta we właściwości klasy, Właściwość klasy użyta w funkcji pliku, i tak dalej. Pamiętaj: sfałszowany adres IP lub atak man-in-the-middle może wykorzystać cały twój strona internetowa.

Najlepszym rozwiązaniem jest śledzenie od początku do końca każdego możliwego wejścia użytkownika lub zdalnego, zaczynając od $_SERVER, $_GET, $_POST, $_FILE, $_COOKIE, include(some remote file) (Jeśli allow_url_fopen jest włączony), wszystkie inne funkcje / klasy zajmujące się zdalnymi plikami itp. Programowo budujesz profil śledzenia stosu dla każdej wartości dostarczanej przez użytkownika lub zdalnie. Można to zrobić programowo, pobierając wszystkie powtarzające się instancje przypisanej zmiennej i funkcji lub metod, w których jest używana, a następnie rekurencyjnie kompilując lista wszystkich wystąpień tych funkcji / metod itd. Zbadaj go, aby upewnić się, że najpierw przejdzie przez odpowiednie funkcje filtrowania i walidacji względem wszystkich innych funkcji, których dotknie. Jest to oczywiście badanie manualne, w przeciwnym razie będziesz miał całkowitą liczbę przełączników case równą liczbie funkcji i metod w PHP (w tym zdefiniowanych przez użytkownika).

Alternatywnie dla obsługi tylko wejścia użytkownika, mieć statyczną klasę kontrolera zainicjowaną na początku wszystkie skrypty, które 1) waliduje i przechowuje wszystkie wartości wejściowe dostarczone przez użytkownika na białej liście dozwolonych celów; 2) usuwa źródło danych wejściowych (ie $_SERVER = null). Widzisz, jak to się robi Nazieskie.

 2
Author: bob-the-destroyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-27 06:11:25

Oto lista funkcji, które Mój dostawca wyłącza dla bezpieczeństwa cele:

  • exec
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • escapeshellarg
  • escapeshellcmd
  • ini_restore
  • openlog
  • passtru
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • syslog
  • system
  • url_exec
 1
Author: Vladislav Rastrusny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 08:32:20

Większość ataków w kodzie wykorzystuje wiele źródeł dostępu lub wiele kroków do ich wykonania. Szukałbym nie tylko kodu lub metody posiadającej złośliwy kod, ale wszystkich metod, funkcji wykonujących lub wywołujących go. Najlepsze zabezpieczenie obejmowałoby również kodowanie i walidację danych formularzy, gdy wchodzą i wychodzą.

Uważaj również na definiowanie zmiennych systemowych, które mogą być następnie wywołane z dowolnej funkcji lub metody w kodzie.

 1
Author: Cninroh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 10:32:34

Kilka przepełnień bufora zostało wykrytych przy użyciu 4bit funkcje znaków interpretujące tekst. htmlentities() htmlspecialchars ()

Były na szczycie, dobrą obroną jest użycie mb_convert_encoding () do konwersji na single kodowanie przed interpretacją.

 0
Author: ehime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 22:43:47

Możesz znaleźć stale aktualizowaną listę wrażliwych zlewozmywaków (exploitowalnych funkcji php) i ich parametrów w RIPS /config/sinks.php, statyczny analizator kodu źródłowego dla luk w aplikacjach PHP, który wykrywa również backdoory PHP.

 0
Author: Reiners,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-01 17:21:31