Kullanılabilir PHP işlevleri


277

Ben rasgele kod yürütme için kullanılabilecek işlevlerin bir listesini oluşturmaya çalışıyorum. Amaç kara listeye alınması veya başka şekilde izin verilmemesi gereken işlevleri listelemek değildir. Bunun yerine, güvenliği ihlal edilmiş bir sunucuda arka kapılar için arama yaparken kullanışlı bir kırmızı bayrak anahtar kelimelerinin etkin bir greplistesine sahip olmak istiyorum .

Fikir, c99 veya r57 gibi bir "web kabuğu" komut dosyası gibi çok amaçlı bir kötü amaçlı PHP komut dosyası oluşturmak istiyorsanız, nispeten küçük bir işlev kümesinden birini veya daha fazlasını kullanmanız gerekecek olmasıdır. kullanıcının rasgele kod yürütmesine izin vermek için dosyada bir yerde. Bu işlevleri aramak, on binlerce PHP dosyasının samanlığını daha yakından incelemeniz gereken nispeten küçük bir komut dosyası kümesine daha hızlı bir şekilde daraltmanıza yardımcı olur.

Açıkçası, örneğin, aşağıdakilerden herhangi biri kötü niyetli (veya korkunç kodlama) olarak kabul edilir:

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

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

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

ve benzerleri.

Geçtiğimiz gün güvenliği ihlal edilmiş bir web sitesinde arama yaparken, bir takım kötü amaçlı kod fark etmedim, çünkü bayrağın preg_replacekullanılmasıyla tehlikeli hale getirilebileceğini fark etmedim /e( ki, ciddi, neden orada bile ?). Kaçırdığım başka var mı?

İşte şimdiye kadar listem:

Kabuk Yürütme

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

PHP Yürütme

  • eval
  • preg_replace( /edeğiştirici ile)
  • create_function
  • include[ _once] / require[ _once] ( istismar ayrıntıları için mario'nun cevabına bakın)

Dosyaları değiştirebilen işlevlerin bir listesine sahip olmak da yararlı olabilir, ancak zaman yararlanma kodunun% 99'unun yukarıdaki işlevlerden en az birini içerdiğini hayal ediyorum. Ancak, dosyaları düzenleyebilen veya çıktılandırabilecek tüm işlevlerin bir listesine sahipseniz, buraya gönderin ve buraya ekleyeceğim. (Ve saymıyorum mysql_execute, çünkü bu başka bir sömürü sınıfının parçası.)


43
bir sidenote olarak, eğer mümkünse yakın gelecekte yayınlanan listeyi görmek istiyorum :)
yoda

16
@yoda: nerede yayınlandı? Listeyi burada güncel tutacağım, çünkü SO Tüm Bilgilerin Kaynağıdır.
tylerl

3
/eDeğiştirici ne yapar ?
Billy ONeal

6
@Billy: edeğiştirici, değiştirilen dizginin PHP kodu olarak değerlendirilmesini sağlar.
nikc.org

1
Şunu söylemeliyiz: regex kodunu çalıştırmak Perl ve muhtemelen Python da PHP'ye özel bir şey değil. Yine de ayrıntıları bilmiyorum.
Adriano Varoli Piazza

Yanıtlar:


205

Bu listeyi oluşturmak için 2 kaynak kullandım. Scarlet ve RATS Üzerine Bir Çalışma . Ayrıca karışıma kendi bazı ekledim ve bu iş parçacığındaki insanlar yardımcı oldu.

Düzenleme: Bu listeyi gönderdikten sonra ben RIPS kurucusu ile temasa geçti ve şu anda bu araçlar bu listedeki her işlevin kullanımı için PHP kodu arar.

Bu işlev çağrılarının çoğu Lavabo olarak sınıflandırılır. Bir batırma işlevine renkli bir değişken ($ _REQUEST gibi) iletildiğinde, bir güvenlik açınız vardır. RATS ve RIPS gibi programlar , bir uygulamadaki tüm lavaboları tanımlamak için grep benzeri işlevler kullanır. Bu, programcıların bu işlevleri kullanırken ekstra özen göstermesi gerektiği anlamına gelir, ancak eğer hepsi yasaklandıysa çok fazla şey yapamazsınız.

" Büyük güçle büyük sorumluluk gelir. "

--Stan Lee

Komut Yürütme

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

PHP Kod Yürütme

Bunun dışında evalPHP kodunu çalıştırmanın başka yolları da vardır: include/ Yerelrequire Kod İçerme ve Uzak Dosya İçerme güvenlik açıkları biçiminde uzaktan kod yürütme için kullanılabilir .

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());

Geri aramaları kabul eden işlevlerin listesi

Bu işlevler, saldırganın tercih ettiği bir işlevi çağırmak için kullanılabilecek bir dize parametresini kabul eder. İşleve bağlı olarak, saldırgan bir parametre iletebilir veya edemeyebilir. Bu durumda, Information Disclosurebenzer bir işlev phpinfo()kullanılabilir.

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,

Bilginin Açığa Çıkması

Bu işlev çağrılarının çoğu lavabo değildir. Ancak bunun yerine, döndürülen verilerden herhangi birinin bir saldırgan tarafından görüntülenmesi bir güvenlik açığı olabilir. Bir saldırgan görebiliyorsa phpinfo()kesinlikle bir güvenlik açığıdır.

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

Diğer

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

Dosya Sistemi İşlevleri

RATS'a göre php'deki tüm dosya sistemi fonksiyonları kötüdür . Bunlardan bazıları saldırgan için pek kullanışlı görünmüyor. Diğerleri düşündüğünüzden daha faydalıdır. Örneğin, allow_url_fopen=Onbir url dosya yolu copy($_GET['s'], $_GET['d']);olarak kullanılabilirse, sistemde herhangi bir yere bir PHP betiği yüklemek için bir çağrı kullanılabilir. Ayrıca bir site GET aracılığıyla gönderilen bir istek karşısında savunmasızsa, bu dosya sistemi işlevlerinin tümü sunucunuz aracılığıyla başka bir ana bilgisayara kanal vermek ve saldırmak için kötüye kullanılabilir.

// 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

37
@whatnick Aslında PHP ve diğer web uygulama dilleri arasında kayda değer bir fark görmüyorum. Günün sonunda programcılar eval()kodlama, sistem komutlarını yürütme, bir veritabanına erişme ve dosyalara okuma / yazma yeteneğine ihtiyaç duyarlar . Bu kod bir saldırgandan etkilenebilir ve bu bir güvenlik açığıdır.
kale

8
Birçok fonksiyon yasaklandı! Şans eseri web sitemin ev sahibi misiniz?
Randy the Dev

2
@ Dunn Dunn haha, hayır. Tüm bu işlevleri yasakladıysanız, hiçbir PHP uygulaması işe yaramaz. Özellikle include (), requir () ve dosya sistemi işlevleri.
kale

2
@Rook: düşüncelerim tam olarak ama bunlar potansiyel problemler için, kesin değil. Doğru kullanılırsa, bunların hiçbiri acil bir tehdit oluşturmaz; ancak kaçınılması durumunda, olmaları gerekir.
Geekster

3
Imho preg_matchile ehiçbir zararı yoktur. El kitabı, "Yalnızca değiştirici () bu değiştiriciyi kullanır; diğer PCRE işlevleri tarafından yoksayılır" der.
NikiC

59

Dahil etme ($ tmp) ve zorunlu (HTTP_REFERER) ve * _once öğelerini taramanız gerekir. Bir istismar komut dosyası geçici bir dosyaya yazabilirse, bunu daha sonra ekleyebilir. Temelde iki aşamalı bir değerlendirme.

Ve uzak kodu aşağıdaki gibi geçici çözümlerle gizlemek bile mümkündür:

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

Ayrıca, web sunucunuz zaten ele geçirilmişse, kodlanmamış kötülüğü her zaman görmezsiniz. Genellikle istismar kabuğu gzip kodludur. include("zlib:script2.png.gz");Burada değerlendirme yok, yine de aynı etkiyi düşünün .


1
PHP'nin nasıl yapılandırıldığına bağlı olarak, include aslında rastgele URL'lerden gelen kodu içerebilir. " Example.com/code.phps " gibi bir şey ; Bu özelliğin ve register_globals'ın bir kombinasyonunu kullanarak ele geçirilmiş olan güvenliği ihlal edilmiş bir web sitesi gördüm.
BlackAura

@BlackAura regiser_globals saldırıya nasıl uyum sağladı? Bunun $_GET[xyz]aksine kullanarak kolayca çıkarılabilecek bir şey $xyzmi? Yoksa daha derin bir şey mi vardı?
tylerl

Neden bu şekilde yapıldığından emin değilim, ancak web sitesi böyle şeyler yapmaya devam etti: include ($ prefix. '/Filename.php'); Fikir, yapılandırma dosyasında $ önek değişkeni ayarlayarak, çekirdek kodu web kökü dışında taşıyabilirsiniz olduğunu düşünüyorum. Saldırgan bu değeri " example.com/code.phps ?" Gibi bir değere ayarlarsa , PHP bunun yerine uzak dosyayı içerecektir. Anlayabildiğim kadarıyla, bir bot aslında genel bir istismar kullanarak kırmayı başardı. Görünüşe göre, birçok eski PHP kodu bu hatayı yaptı. Temel olarak, ASLA dahil ifadesi yakınındaki herhangi bir yerde kullanıcı tarafından gönderilen değerlere izin vermeyin.
BlackAura

Ben dosya adı bir ":" içeren içerir genelleştirmek düşünüyorum ... dosya adı bir değişken olabilir, bunun için zor hale getirmesi dışında grep. PHP - ne felaket.
tylerl

2
includeparantez gerektirmez; include "…"yeterli.
Gumbo

48

Bu kendi başına bir cevap değil, ama ilginç bir şey var:

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

Aynı ruhla, call_user_func_array()gizlenmiş işlevleri yerine getirmek için kullanılabilir.


1
Ve kodu çalıştırmadan bunu bulmanın bir yolu yoktur :( Statik analiz burada yardımcı olmaz.
NikiC

15
@tylerl: ... veya başka bir dil?
dr Hannibal Lecter

@dr Hannibal Lector: derlenmiş diller bile mi?
Ekim'de Ponkadoodle

3
@Wallacoloo: Bir ikili dil için grep için kolay metin dizeleri olmadığı için derlenmiş bir dil CGI arka kapısını gizlemek daha da kolaydır.
Iiridayn

2
Güzel .. $ f = 'ev' ile denedim. $ f ($ _ POST [ 'c']); ama 'eval' bir işlev değil, dahil, yankı, vb gibi özel bir yapı olduğu için işe yaramadı
ilginç

20

Kimsenin bahsetmediği echove printgüvenlik sömürüsü noktaları olarak şaşırdım .

Siteler Arası Komut Dosyası Oluşturma (XSS) ciddi bir güvenlik açığıdır, çünkü sunucu tarafı kod yürütme istismarlarından daha yaygındır.


Bu, teknik olarak sunucuyu değil, istemciyi etkileyen bir vektör olacaktır.
Damianb

@damianb: Bir site Ajax kullanıyorsa ve herhangi bir kullanıcının oturumunda rasgele javascriptin değerlendirilmesine neden olabilirsem, sunucuda çok fazla yaramazlık yapabilirim.
Bill Karwin

"sunucuda" .... bağlı istemcilere; sunucu arka ucunu etkilemez. Bu, imleç çakma, CSRF, başlık enjeksiyonu vb.Gibi istemci tarafı istismarlara girer. Tehlikeli, evet, ama tamamen farklı bir sınıflandırmaya giriyor.
Damianb

19

özellikle bu listeye unserialize () eklemek istiyorum. Rasgele kod yürütme, hizmet reddi ve bellek bilgi sızıntısı gibi çeşitli güvenlik açıklarının uzun bir geçmişi vardır. Kullanıcı tarafından sağlanan verilerde asla çağrılmamalıdır. Bu vulların birçoğu son çiğ yıllardaki sürümlerde düzeltildi, ancak şu anda yazarken hala birkaç kötü vul koruyor.

Tehlikeli php fonksiyonları / kullanımı hakkında daha fazla bilgi için Sertleştirilmiş PHP Projesi ve onun tavsiyelerine bakın. Ayrıca son PHP Güvenliği Ayı ve 2007'nin PHP Bugları Ayı projeleri

Ayrıca, tasarım gereği bir nesnenin serileştirilmesinin yapıcı ve yıkıcı işlevlerinin yürütülmesine neden olacağını; kullanıcı tarafından sağlanan verilere çağırmamak için başka bir neden.


Serileştirme sorunu hakkında daha fazla bilgi almak istiyorum. Bu sadece uygulamada bir hata mı, yoksa tasarımda bir kusur mu (yani düzeltilemez)? Beni özellikle bu konuda daha fazla bilgiye yönlendirebilir misiniz?
tylerl

Rastgele kod çalıştırma ve bellek bilgi sızması için de Stefan'ın danışma belgesine bakın php-security.org/2010/06/25/...
Cheekysoft


17

VPS'im aşağıdaki işlevleri devre dışı bırakacak şekilde ayarlanmış:

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, listeniz için büyük olasılıkla büyük olasılıkla yok edilebilir işlevlere sahiptir. Örneğin, PHP bir web sitesini devre dışı bırakmak için kullanılabilecek chmod ve chown içerir.

DÜZENLEME: Belki bir dosyayı tehlike ile gruplandırılmış bir dizi işlevi arayan (kötü işlevler, daha kötü işlevler, hiçbir zaman kullanılmaması gereken işlevler) arayan bir bash betiği oluşturmak ve daha sonra tehlikenin göreceliğini hesaplamak isteyebilirsiniz. dosyanın bir yüzdeye dayadığını. Daha sonra bunu, örneğin% 30 tehlike eşik değerinden büyükse, yüzdeler her dosyanın yanında etiketlenmiş yüzdelerin bulunduğu bir ağaca aktarın.


Derleme zamanında "--disable-posix" bayrağını ayarlayabilir ve tüm bu posix işlevlerinictiv_functions işlevinden kaldırabilirsiniz.
Pixel Developer

15

Ayrıca, rastgele bellek konumlarının okunmasına ve yazılmasına izin veren "kesinti güvenlik açıkları" sınıfının da farkında olun!

Bunlar, trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () ve daha fazlası gibi işlevleri etkiler . Bu, büyük ölçüde, ancak sadece değil, 10 yıldır kullanımdan kaldırılan ancak devre dışı bırakılmayan dilin çağrı zamanı by-by-pass özelliği nedeniyle.

Daha fazla bilgi için, Stefan Esser'in BlackHat USA 2009 Slides Paper'daki kesinti güvenlik açıkları ve diğer alt düzey PHP sorunları hakkındaki konuşmasına bakın.

Bu makale / sunum ayrıca dl () 'nin rasgele sistem kodunu yürütmek için nasıl kullanılabileceğini göstermektedir.


1
Ahh. Eh, ben o slaytlara bir göz önce PHP biraz güvenli olduğunu düşündüm ...
NikiC

14

Plattform'a özgü, aynı zamanda teorik yürütme vektörleri:

  • dotnet_load ()
  • yeni COM ("WScript.Shell")
  • yeni Java ("java.lang.Runtime")
  • event_new () - sonunda

Ve daha birçok gizleme yöntemi var:

  • proc_open popen için bir takma addır
  • call_user_func_array ("exE" .chr (99), dizi ("/ usr / bin / damage", "--all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (...)
  • PharData :: setDefaultStub - .phar dosyalarındaki kodu incelemek için biraz daha çalışma
  • runkit_function_rename ("exec", "innocent_name") veya APD rename_function

Ayrıca ikinci listede call_user_func ()
Cheekysoft

1
Bir cevap yeterlidir;) Sadece bir öncekine eklemelisiniz.
Justin Johnson

13

Bunun dışında evaldil yapısının rasgele kod yürütülmesine izin veren başka bir işlevi vardır:assert

assert('ex' . 'ec("kill --bill")');

10

İlginç bir istismar kaynağından bahsedilmemiştir. PHP dizgilerin içinde 0x00bayt olmasını sağlar. Temel (libc) işlevler bunu bir dizenin sonu olarak ele alır.

Bu, PHP'de (kötü uygulanmış) sağlık kontrolünün kandırılabildiği durumlara izin verir, örneğin:

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

Bu, yalnızca bitenleri değil, herhangi bir dosyayı .phparayarak içerebilirscript.php?file=somefile%00.php

Bu nedenle PHP'nin dize uzunluğuna uymayacak herhangi bir işlev bazı güvenlik açıklarına neden olabilir.


Boş değerli dosya yollarına 5.4 ve en son 5.3 sürümlerinde artık izin verilmeyecektir.
StasM

@stasM Bu, PHP hakkında bir süredir duyduğum en iyi şeylerden biri. Paylaşım için teşekkürler.
William

9

Tehlikeli sözdizimsel unsurlar ne olacak?

" Değişken değişken " ( $$var) geçerli kapsamda $ var adıyla bir değişken bulur. Yanlış kullanılırsa, uzak kullanıcı geçerli kapsamdaki herhangi bir değişkeni değiştirebilir veya okuyabilir. Temelde daha zayıf eval.

Örn: bir kod yazarsanız $$uservar = 1;, uzak kullanıcı $uservar"admin" $adminolarak ayarlanır 1ve geçerli kapsamda ayarlanmasına neden olur .


Ne demek istediğini anlıyorum, ama bu farklı bir sömürü sınıfına benziyor. (Yukarıdaki işlevlerden herhangi birini kullanmadan) bu mekanizma ile rastgele PHP kodu yürütmek için bir yolu var mı? Veya yalnızca değişken içeriklerin değiştirilmesi için kötüye kullanılabilir mi? Eğer bir şey eksiksem, düzeltmek istiyorum.
tylerl

6
Ayrıca betiği değerlendirmeden çözülmesi imkansız olan değişken fonksiyonları da kullanabilirsiniz. Örneğin: $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
erisco

Ayrıca yansıma için dikkat edin.
erisco

6

Sanırım kaynak dosyalarınızı ayrıştırarak tüm olası açıkları bulamayacaksınız.

  • ayrıca burada gerçekten harika listeler varsa, istismar olabilecek bir işlevi kaçırabilirsiniz

  • hala böyle "gizli" kötü kod olabilir

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg_replace ($ myEvilRegex, $ _POST ['kod']);

  • Şimdi diyebilirim ki, betiğimi de eşleşecek şekilde genişletiyorum

  • ama sonra ek olarak bağlamı dışında olan bu "muhtemelen kötü kod" olacak

  • bu yüzden (sözde) güvenli olmak için, gerçekten iyi bir kod yazmalı ve mevcut tüm kodu kendiniz okumalısınız


Wordpress tabanlı kötü amaçlı yazılımlarda kötü için base64_decode () kullanıldığını gördüm. Listeye iyi bir ek.
Chris Allen Lane


5

Biliyorum move_uploaded_filesöz edilmiştir, ancak genel olarak dosya yükleme çok tehlikelidir. Sadece varlığı $_FILESbiraz endişe uyandırmalıdır.

PHP kodunu herhangi bir dosya türüne gömmek oldukça mümkündür. Görüntüler özellikle metin yorumlarından etkilenebilir. Kod, $_FILESverilerde bulunan uzantıyı olduğu gibi kabul ederse sorun özellikle zordur .

Örneğin, kullanıcı katıştırılmış PHP koduna sahip geçerli bir PNG dosyasını "foo.php" olarak yükleyebilir. Komut dosyası özellikle safsa, dosyayı "/uploads/foo.php" olarak kopyalayabilir. Sunucu, kullanıcı yükleme dizinlerinde komut dosyası yürütülmesine izin verecek şekilde yapılandırılmışsa (genellikle durum ve korkunç bir gözetim), anında herhangi bir rastgele PHP kodu çalıştırabilirsiniz. (Görüntü .png olarak kaydedilmiş olsa bile, kodun diğer güvenlik kusurları aracılığıyla yürütülmesini sağlamak mümkün olabilir.)

Yüklemelerde kontrol edilecek şeylerin (kapsamlı olmayan) bir listesi:

  • Yüklemenin iddia ettiği tür olduğundan emin olmak için içeriği analiz ettiğinizden emin olun
  • Dosyayı, hiçbir zaman yürütülmeyecek bilinen, güvenli bir dosya uzantısıyla kaydedin
  • Kullanıcı yükleme dizinlerinde PHP'nin (ve diğer kod yürütmelerinin) devre dışı olduğundan emin olun

5

En ekleyelim pcntl_signalve pcntl_alarmlisteye.

Bu işlevlerin yardımıyla php.ini dosyasında veya kodda oluşturulmuş herhangi bir set_time_limit kısıtlaması etrafında çalışabilirsiniz.

Örneğin bu komut dosyası, set_time_limit(1);

(Kredi Sebastian Bergmanns'ın tweet ve gist'e gidiyor :

<?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";
}

4

PHP.ini dosyasındaki ayarlar tarafından devre dışı bırakılabilen çok sayıda PHP istismarı vardır. Açık örnek register_globals'tır, ancak ayarlara bağlı olarak, uzak makinelerden HTTP aracılığıyla dosya eklemek veya açmak da mümkündür; bu program, bir program include () veya dosya işleme işlevlerinden herhangi biri için değişken dosya adları kullanıyorsa kullanılabilir.

PHP ayrıca bir değişken adının sonuna () eklenerek değişken işlev çağrısına izin verir - örneğin $myvariable();, değişken tarafından belirtilen işlev adını çağırır. Bu sömürülebilir; örneğin, bir saldırgan değişkeni 'eval' sözcüğünü içerecek şekilde alabilir ve parametreyi kontrol edebilirse, program aslında eval () işlevini içermese de istediği her şeyi yapabilir.


4

Bu işlevlerin bazı kötü etkileri de olabilir.

  • str_repeat()
  • unserialize()
  • register_tick_function()
  • register_shutdown_function()

İlk ikisi mevcut tüm belleği tüketebilir ve ikincisi tükenmeyi devam ettirir ...


2

Son zamanlarda security.stackexchange.com'da bununla ilgili bazı tartışmalar oldu

rastgele kod yürütme için kullanılabilecek işlevler

Bu kapsamı biraz azaltır - ancak 'print' javascript enjekte etmek (ve dolayısıyla oturumları çalmak vb.) İçin hala biraz keyfi olduğundan kullanılabilir.

kara listeye alınması veya başka şekilde izin verilmemesi gereken işlevleri listelemek değildir. Aksine, grep-güçlü bir listeye sahip olmak istiyorum

Bu mantıklı bir yaklaşım.

Kendi ayrıştırıcısını yazmayı düşünün - çok yakında kontrolden çıkan grep tabanlı bir yaklaşım bulacaksınız (awk biraz daha iyi olurdu). Çok yakında, beyaz listeyi de uygulamak isteyeceksiniz!

Açık olanlara ek olarak, bir dizgi değişmezi dışında bir şeyle bir tartışma içeren bir şeyi işaretlemenizi öneririm. __Autoload () işlevine de dikkat edin.


2

Korkarım cevabım biraz fazla olumsuz olabilir, ama ...

IMHO, oradaki her bir işlev ve yöntem hain amaçlarla kullanılabilir. Bunu, olumsuzluğun bir damlama etkisi olarak düşünün: bir değişken bir kullanıcıya veya uzak girişe atanır, değişken bir işlevde kullanılır, bir sınıf özelliğinde kullanılan işlev dönüş değeri, bir dosya işlevinde kullanılan sınıf özelliği, ve benzerleri. Unutmayın: sahte bir IP adresi veya ortadaki adam saldırısı tüm web sitenizi kullanabilir.

Yapabileceğiniz en iyi şey başlayarak olası kullanıcı veya uzaktan girişi başından sonuna iz etmektir $_SERVER, $_GET, $_POST, $_FILE, $_COOKIE, include(some remote file)( eğer allow_url_fopen açık), Sen programlama yoluyla bir yığın izi profili oluşturmak vb uzak dosyaları ile ilgilenen bütün diğer işlevleri / sınıfları her kullanıcı veya uzaktan sağlanan değerin Bu, atanmış değişkenin ve tekrar kullanıldığı işlevlerin veya yöntemlerin tüm tekrar örneklerini alarak ve sonra bu işlevlerin / yöntemlerin tüm oluşumlarının bir listesini tekrarlayarak derleyerek programlanabilir. Önce, dokunduğu diğer tüm işlevlere göre uygun filtreleme ve doğrulama işlevlerinden geçtiğinden emin olmak için inceleyin. Bu elbette manuel bir sınavdır, aksi takdirde toplamcase PHP'deki işlev ve yöntem sayısına eşittir (kullanıcı tanımlı dahil).

Alternatif olarak, yalnızca kullanıcı girişini işlemek için, tüm komut dosyalarının başında 1), kullanıcı tarafından sağlanan tüm giriş değerlerini izin verilen amaçların beyaz listesiyle doğrulayan ve depolayan statik denetleyici sınıfına sahip olun ; 2) giriş kaynağını (yani $_SERVER = null) siler . Bunun biraz Naziesque nereden geldiğini görebilirsiniz.


Evet, elbette, birçok programlama dilinde olduğu gibi, kötü davranışlarınızı gizlemenin bir yolu yoktur. Ancak bence sorduğum şeyin niyetini özlüyor. Senaryo şu şekildedir: Bir web sitesi saldırıya uğradığında yardım etmeye çağırılırsınız. Müşteri, web sitesini sabaha kadar güvende tutabiliyorsanız ekstra ücret ödeyecektir. Site 475 PHP dosyası içeriyor ve yararlı adli detaylar yok edildi - büyük bir samanlık ve kötü şöhretli küçük bir iğneniz var ... nereden bakmaya başlıyorsunuz? (Kısaca gün işim)
tylerl

1

Sağlayıcımın güvenlik nedeniyle devre dışı bıraktığı işlevlerin listesi:

  • exec
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • escapeshellarg
  • escapeshellcmd
  • ini_restore
  • openlog
  • Geçiş
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • syslog
  • sistem
  • url_exec

1

Koddaki saldırıların çoğu, kendilerini yürütmek için birden fazla erişim kaynağı veya birden çok adım kullanır. Ben sadece bir kod ya da kötü amaçlı kod sahip bir yöntem, ama tüm yöntemler, yürütme ya da çağıran işlev aramak. En iyi güvenlik, form verilerinin gelip çıkarken kodlanmasını ve doğrulanmasını da içerir.

Sistem değişkenlerini tanımlamaktan da dikkat edin, daha sonra koddaki herhangi bir işlev veya yöntemden çağrılabilirler.


0

Metni yorumlayan 4 bit karakter işlevleri kullanılarak birkaç arabellek taşması bulundu. htmlentities () htmlspecialchars ()

üstte, iyi bir savunma yorumlamadan önce tek kodlamaya dönüştürmek için mb_convert_encoding () kullanmaktır.


0

Hassas lavaboların (kullanılabilir php fonksiyonları) ve parametrelerinin sürekli güncellenen bir listesini bulabilirsiniz. PHP uygulamalarında PHP'yi arka planda da algılayan güvenlik açıkları için statik bir kaynak kodu çözümleyicisi RIPS /config/sinks.php adresinde .


RIPS bu sayfadaki listeyi kullanıyor.
kale
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.