PHP, opcache'nin çağrılması için dosyayı açabilmeli; o yoksa, o ... yüklenemez
Let en look ayrıntılı olarak, biz oynayabilir ne hileler görmek için:
if (!file_handle->filename || !ZCG(enabled) || !accel_startup_ok) {
/* The Accelerator is disabled, act as if without the Accelerator */
return accelerator_orig_compile_file(file_handle, type);
#ifdef HAVE_OPCACHE_FILE_CACHE
} else if (ZCG(accel_directives).file_cache_only) {
return file_cache_compile_file(file_handle, type);
#endif
} else if ((!ZCG(counted) && !ZCSG(accelerator_enabled)) ||
(ZCSG(restart_in_progress) && accel_restart_is_active())) {
#ifdef HAVE_OPCACHE_FILE_CACHE
if (ZCG(accel_directives).file_cache) {
return file_cache_compile_file(file_handle, type);
}
#endif
return accelerator_orig_compile_file(file_handle, type);
}
Biz dosya önbelleği etkin olduğu görebiliriz Paylaşılan bellek önbelleğinin önceliğini alır.
Sonra, file_cache_compile_file bakmak istiyorum:
- block signals
- protect shared memory
- zend_file_cache_script_load
Şimdi zend_file_cache_script_load bakmak:
- verify magic "OPCACHE"
- verify system id
- optionally validate timestamp
- perform read of cached file
- verify checksum
open
read header (layout) Yani elimizdeki ilk sorun olduğunu system id i benzersiz değil, ancak aşağıdaki unsurlardan oluşur:
sizeof(char)
sizeof(int)
:
- PHP sürümü
- Zend Uzatma tanımlayıcının
- İkili tanımlayıcı inşa aşağıdakileri içerir
sizeof(long)
sizeof(size_t)
sizeof(zend_long)
ZEND_MM_ALIGNMENT
- (git den, yayınlanmamış) PHP bir dev sürümünü kullanılmıyorsa: ikili
ikili
___TIME___
derleme zamanı
___DATE__
derleme tarihi
PHP sürümü ve tanımlayıcı inşa şu sürümleri arasında değiştirebilir veya olabilir en azından çünkü gereklidir oluşturur: opcodes
iç yapılarının
talimatlar VM dizisi düzeni için
- ayrılmaz tanımlayıcıları Bekler (mevcut bir kontrol yapısının detayları fe değişebilir.Mimari boyutunu etkileyebilir: Önceki olanları keşfedilmiş olabilir çünkü foreach) opcache tarafından gerçekleştirilen
- optimizasyonlar (Endianess ve mimarisi ile zval değişiklikleri en az düzeni nedeniyle ikili tanımlayıcı gereklidir
) güvensiz olduğu Bazı temel derleyici türlerinin (uzun, size_t vb.) yanı sıra bu türlerin üst ve alt sınırları, endianess yapıdaki üyelerin sırasını ve temel derleyici türlerinin ikili sunumunu etkileyebilir. ziyade çaba mevcut sistemi tanımlamak için harcanan
Not etse bile, zaman damgaları opcache.validate_timestamps=0
doğrulama dosya önbellek girişi yükleme sağlayacak devre dışı bırakılması
... sen düşünmek için ara vermelidir dosya sistemindeki geçerli dosya boş.
Başlıkta bulunan sağlama toplamı yalnızca dosyanın (başlıktan sonra gelen) komut dosyasının bölümünü doğrulamak içindir, sistem tanımlayıcısının veya sağlama toplamının bulunduğu üstbilgiyi içermez (ve yapamaz). yazılı.
Bu nedenle, önbelleğe alınmış dosyanın header sistem tanımlayıcısını, hedef makine tanımlayıcısına karşılık gelecek şekilde değiştirerek, başka bir makineden önbelleğe alınmış bir dosyayı yüklemek için PHP'yi kandırabilirsiniz.
Belki de, ancak yazılımınızı dağıtmanın bir yöntemi olarak kesinlikle değil.
Dosya önbelleği bu amaç için uygun değildir, farklı mimarilerden veya önbelleklerden yükleme önbellekleri PHP'yi kilitler.
İlginç. Bence yapabilir. http://gosecure.net/2016/04/27/binary-webshell-through-opcache-in-php-7/ –
İy'i denediniz mi? – RiggsFolly
7'de yeni değil, 5. sıradaydı. Önemli bir soru niçin istiyorsun? –