Fungsi PHP yang dapat dieksploitasi


277

Saya mencoba membuat daftar fungsi yang dapat digunakan untuk eksekusi kode arbitrer. Tujuannya bukan untuk membuat daftar fungsi yang harus dimasukkan daftar hitam atau tidak diizinkan. Sebaliknya, saya ingin memiliki grepdaftar kata kunci bendera merah yang berguna ketika mencari server yang dikompromikan sebagai pintu belakang.

Idenya adalah bahwa jika Anda ingin membuat skrip PHP berbahaya multi-guna - seperti skrip "shell web" seperti c99 atau r57 - Anda harus menggunakan satu atau lebih dari sekumpulan fungsi yang relatif kecil suatu tempat di file untuk memungkinkan pengguna untuk mengeksekusi kode arbitrer. Mencari fungsi-fungsi itu membantu Anda lebih cepat mempersempit tumpukan jerami puluhan ribu file PHP ke set script yang relatif kecil yang memerlukan pemeriksaan lebih dekat.

Jelas, misalnya, salah satu dari yang berikut ini akan dianggap berbahaya (atau pengkodean yang mengerikan):

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

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

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

Dan seterusnya.

Mencari melalui situs web yang dikompromikan beberapa hari yang lalu, saya tidak melihat sepotong kode berbahaya karena saya tidak menyadari preg_replacebisa menjadi berbahaya dengan menggunakan /ebendera ( yang, serius? Mengapa itu ada di sana ?). Apakah ada orang lain yang saya lewatkan?

Inilah daftar saya sejauh ini:

Shell Jalankan

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

Eksekusi PHP

  • eval
  • preg_replace(dengan /epengubah)
  • create_function
  • include[ _once] / require[ _once] ( lihat jawaban mario untuk detail exploit)

Mungkin juga berguna untuk memiliki daftar fungsi yang mampu memodifikasi file, tetapi saya membayangkan 99% dari waktu kode eksploitasi akan mengandung setidaknya satu dari fungsi di atas. Tetapi jika Anda memiliki daftar semua fungsi yang mampu mengedit atau menghasilkan file, posting dan saya akan memasukkannya di sini. (Dan aku tidak menghitung mysql_execute, karena itu bagian dari kelas eksploitasi lain.)


43
sebagai sidenote, saya ingin melihat daftar itu diterbitkan dalam waktu dekat, jika mungkin :)
yoda

16
@yoda: dipublikasikan dimana? Saya akan terus memperbarui daftar di sini, karena SO adalah Sumber dari Semua Pengetahuan.
tylerl

3
Apa yang dilakukan /epengubah?
Billy ONeal

6
@Billy: epengubah membuat string pengganti untuk dievaluasi sebagai kode PHP.
nikc.org

1
Harus dikatakan: mengeksekusi kode di regex adalah sesuatu yang Perl dan mungkin juga Python, bukan sesuatu yang eksklusif untuk PHP. Saya tidak tahu detailnya.
Adriano Varoli Piazza

Jawaban:


205

Untuk membangun daftar ini saya menggunakan 2 sumber. Sebuah Studi Dalam Scarlet dan RATS . Saya juga menambahkan beberapa milik saya ke dalam campuran dan orang-orang di utas ini telah membantu.

Sunting: Setelah memposting daftar ini saya menghubungi pendiri RIPS dan sampai sekarang alat ini mencari kode PHP untuk penggunaan setiap fungsi dalam daftar ini.

Sebagian besar panggilan fungsi ini diklasifikasikan sebagai Sinks. Ketika variabel tercemar (seperti $ _REQUEST) diteruskan ke fungsi wastafel, maka Anda memiliki kerentanan. Program seperti RATS dan RIPS menggunakan fungsionalitas seperti grep untuk mengidentifikasi semua sink dalam suatu aplikasi. Ini berarti bahwa programmer harus lebih berhati-hati ketika menggunakan fungsi-fungsi ini, tetapi jika mereka di mana semua dilarang maka Anda tidak akan bisa menyelesaikan banyak hal.

" Dengan kekuatan besar datang tanggung jawab besar. "

--Stan Lee

Eksekusi Perintah

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

Eksekusi Kode PHP

Terlepas dari evalada cara lain untuk mengeksekusi kode PHP: include/ requiredapat digunakan untuk eksekusi kode jauh dalam bentuk Include File Lokal dan Remote File Include kerentanan.

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

Daftar fungsi yang menerima panggilan balik

Fungsi-fungsi ini menerima parameter string yang dapat digunakan untuk memanggil fungsi pilihan penyerang. Bergantung pada fungsi penyerang mungkin atau mungkin tidak memiliki kemampuan untuk melewati parameter. Dalam hal ini Information Disclosurefungsi seperti phpinfo()bisa digunakan.

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,

Keterbukaan Informasi

Sebagian besar panggilan fungsi ini tidak tenggelam. Tetapi mungkin ini adalah kerentanan jika salah satu data yang dikembalikan dapat dilihat oleh penyerang. Jika seorang penyerang bisa melihatnya phpinfo()pasti merupakan kerentanan.

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

Lain

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

Fungsi Sistem File

Menurut RATS, semua fungsi sistem file di php tidak baik. Beberapa di antaranya tampaknya tidak terlalu berguna bagi penyerang. Yang lain lebih berguna daripada yang Anda kira. Misalnya jika allow_url_fopen=Onkemudian url dapat digunakan sebagai jalur file, jadi panggilan untuk copy($_GET['s'], $_GET['d']);dapat digunakan untuk mengunggah skrip PHP di mana saja pada sistem. Juga jika sebuah situs rentan terhadap permintaan pengiriman via GET, semua orang dari fungsi sistem file tersebut dapat disalahgunakan untuk menyalurkan dan menyerang ke host lain melalui server Anda.

// 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 Sebenarnya saya tidak melihat perbedaan yang berarti antara PHP dan bahasa aplikasi web lainnya. Pada akhirnya programmer membutuhkan kemampuan eval()kode, untuk mengeksekusi perintah sistem, mengakses database, dan membaca / menulis ke file. Kode ini dapat dipengaruhi oleh penyerang, dan itu adalah kerentanan.
benteng

8
Banyak sekali fungsi yang diblokir! Apakah Anda host situs web saya?
Randy the Dev

2
@Andrew Dunn haha, tidak. Jika Anda melarang semua fungsi ini maka tidak ada aplikasi PHP yang akan berfungsi. Terutama meliputi (), membutuhkan (), dan fungsi sistem file.
benteng

2
@Ook: Pikiranku persis tapi ini untuk masalah potensial, bukan yang pasti. Jika digunakan dengan benar, tidak satu pun dari ini menimbulkan ancaman langsung; tetapi jika mereka dapat dihindari mereka harus.
Geekster

3
Aku preg_matchdengan etidak ada salahnya. Manual mengatakan "Hanya preg_replace () menggunakan pengubah ini; itu diabaikan oleh fungsi PCRE lainnya."
NikiC

59

Anda harus memindai untuk menyertakan ($ tmp) dan meminta (HTTP_REFERER) dan * _cece juga. Jika skrip exploit dapat menulis ke file sementara, bisa saja menyertakannya nanti. Pada dasarnya eval dua langkah.

Dan bahkan mungkin untuk menyembunyikan kode jarak jauh dengan solusi seperti:

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

Juga, jika server web Anda telah disusupi, Anda tidak akan selalu melihat kejahatan yang tidak ter-enkripsi. Seringkali shell exploit dikodekan dengan gzip. Pikirkan include("zlib:script2.png.gz");No eval di sini, efeknya masih sama.


1
Bergantung pada bagaimana PHP dikonfigurasikan, sertakan sebenarnya dapat memasukkan kode dari URL sewenang-wenang. Sesuatu seperti menyertakan " example.com/code.phps "; Saya melihat situs web yang dikompromikan yang telah dipecah menjadi menggunakan kombinasi fitur itu dan register_globals.
BlackAura

@BlackAura bagaimana regiser_globals cocok dengan serangan itu? Apakah itu sesuatu yang bisa ditarik dengan mudah dengan menggunakan $_GET[xyz]sebagai lawan $xyz? Atau ada sesuatu yang lebih dalam darinya?
tylerl

Saya tidak yakin mengapa hal itu dilakukan dengan cara ini, tetapi situs web terus melakukan hal-hal seperti ini: include ($ prefix. '/Filename.php'); Saya pikir idenya adalah bahwa Anda dapat memindahkan kode inti di luar web root, dengan mengatur variabel $ prefix di file konfigurasi. Jika penyerang menetapkan nilai itu ke sesuatu seperti " example.com/code.phps ?", PHP akan menyertakan file jarak jauh itu. Sedekat yang saya tahu, bot sebenarnya berhasil menembus eksploitasi generik. Rupanya, banyak kode PHP lama melakukan kesalahan itu. Pada dasarnya, JANGAN PERNAH membiarkan nilai yang dikirimkan pengguna mendekati pernyataan sertakan.
BlackAura

Saya pikir Anda dapat menggeneralisasi ini untuk memasukkan yang mengandung ":" dalam nama file ... kecuali bahwa nama file bisa menjadi variabel, membuatnya sulit grepuntuk. PHP - bencana.
tylerl

2
includetidak membutuhkan tanda kurung; include "…"cukup.
Gumbo

48

Ini bukan jawaban semata, tetapi ada sesuatu yang menarik:

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

Dengan semangat yang sama, call_user_func_array()dapat digunakan untuk menjalankan fungsi yang dikaburkan.


1
Dan tidak ada cara untuk menemukan ini tanpa mengeksekusi kode :( Analisis statis tidak akan membantu di sini.
NikiC

15
@tylerl: ... atau bahasa lainnya?
dr Hannibal Lecter

@dr Hannibal Lector: bahkan bahasa yang dikompilasi?
Ponkadoodle

3
@ Wallalloloo: Lebih mudah untuk menyembunyikan backdoor bahasa CGI yang dikompilasi karena tidak ada string teks yang mudah untuk dipahami dalam biner.
Iiridayn

2
Bagus .. Saya mencoba dengan $ f = 'ev'. 'Al'; $ f ($ _ POST ['c']); tetapi tidak bekerja karena 'eval' bukan fungsi tetapi konstruksi khusus seperti include, gema, dll -> menarik bahwa exec () tidak dan jadi ini akan bekerja ..
redShadow

20

Saya terkejut tidak ada yang menyebutkan echodan printsebagai titik eksploitasi keamanan.

Cross-Site Scripting (XSS) adalah eksploitasi keamanan serius, karena ini bahkan lebih umum daripada eksploitasi eksekusi kode server-side.


Itu akan menjadi vektor yang mempengaruhi klien, bukan server, secara teknis.
damianb

@damianb: Jika sebuah situs menggunakan Ajax, dan saya dapat menyebabkan javascript sewenang-wenang dievaluasi dalam sesi pengguna mana pun, saya dapat menyebabkan banyak kerusakan di server.
Bill Karwin

"on the server" .... ke klien yang terhubung; itu tidak mempengaruhi backend server. Itu termasuk dalam eksploitasi sisi klien, seperti cursorjacking, CSRF, injeksi header, dan sebagainya. Ini berbahaya, ya, tetapi seluruhnya berada di bawah klasifikasi yang berbeda.
damianb

19

Saya khususnya ingin menambahkan unserialize () ke daftar ini. Telah memiliki sejarah panjang berbagai kerentanan termasuk eksekusi kode arbitrer, penolakan layanan dan kebocoran informasi memori. Seharusnya tidak pernah dipanggil pada data yang diberikan pengguna. Banyak dari vul ini telah diperbaiki dalam rilis selama beberapa tahun terakhir, tetapi masih mempertahankan beberapa vul yang jahat pada saat penulisan ini.

Untuk informasi lain tentang fungsi / penggunaan php yang cerdik, lihat di sekitar Proyek PHP Hardened dan nasihatnya. Juga Bulan baru-baru ini Keamanan PHP dan Bulan 2007 proyek PHP Bugs

Perhatikan juga bahwa, dengan desain, membatalkan pengunaan objek akan menyebabkan fungsi konstruktor dan destruktor dijalankan; alasan lain untuk tidak menyebutnya pada data yang diberikan pengguna.


Saya tertarik untuk mendengar lebih banyak tentang masalah unserialize. Apakah ini hanya bug dalam implementasi, atau itu cacat dalam desain (yaitu tidak dapat diperbaiki)? Bisakah Anda mengarahkan saya ke informasi lebih lanjut tentang masalah itu secara khusus?
tylerl

Untuk eksekusi kode dan informasi memori kebocoran sewenang-wenang melihat penasehat Stefan di php-security.org/2010/06/25/...
Cheekysoft

Rilis 5.2.14 baru-baru ini memperbaiki kerentanan eksekusi kode arbitrer lain di unserialize () cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2. 14
Cheekysoft

17

VPS saya diatur untuk menonaktifkan fungsi-fungsi berikut:

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 memiliki cukup banyak fungsi yang berpotensi dirusak sehingga daftar Anda mungkin terlalu besar untuk dipahami. Misalnya, PHP memiliki chmod dan chown, yang dapat digunakan untuk menonaktifkan situs web.

EDIT: Mungkin Anda mungkin ingin membangun skrip bash yang mencari file untuk berbagai fungsi yang dikelompokkan berdasarkan bahaya (fungsi yang buruk, fungsi yang lebih buruk, fungsi yang seharusnya tidak pernah digunakan), dan kemudian menghitung relativitas bahaya. bahwa file memberlakukan persentase. Kemudian output ini ke pohon direktori dengan persentase ditandai di sebelah setiap file, jika lebih besar dari ambang mengatakan, 30% bahaya.


Anda dapat mengatur flag "--disable-posix" pada waktu kompilasi dan menghapus semua fungsi posix tersebut dari disable_functions.
Pengembang Pixel

15

Perhatikan juga kelas "kerentanan gangguan" yang memungkinkan lokasi memori sewenang-wenang dibaca dan ditulis!

Ini mempengaruhi fungsi seperti trim (), rtrim (), ltrim (), meledak (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () dan banyak lagi . Ini sebagian besar, tetapi tidak secara eksklusif, karena fitur referensi panggilan-waktu lewat bahasa yang sudah tidak digunakan lagi selama 10 tahun tetapi tidak dinonaktifkan.

Untuk info lebih lanjut, lihat pembicaraan Stefan Esser tentang kerentanan gangguan dan masalah PHP tingkat rendah lainnya di BlackHat USA 2009 Slides Paper

Makalah / presentasi ini juga menunjukkan bagaimana dl () dapat digunakan untuk mengeksekusi kode sistem arbitrer.


1
Aduh. Yah, saya benar-benar berpikir bahwa PHP agak aman sebelum saya melihat slide-slide itu ...
NikiC

14

Plattform-spesifik, tetapi juga vektor eksekutif teoritis:

  • dotnet_load ()
  • COM baru ("WScript.Shell")
  • Java baru ("java.lang.Runtime")
  • event_new () - pada akhirnya

Dan ada banyak lagi metode penyamaran:

  • proc_open adalah alias untuk popen
  • call_user_func_array ("exE" .chr (99), array ("/ usr / bin / damage", "--all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (...)
  • PharData :: setDefaultStub - beberapa pekerjaan lagi untuk memeriksa kode dalam file .phar
  • runkit_function_rename ("exec", "innocent_name") atau APD rename_function

juga call_user_func () dalam daftar kedua
Cheekysoft

1
Satu jawaban sudah cukup;) Anda harus menambahkannya ke yang sebelumnya.
Justin Johnson

13

Terlepas dari evalkonstruksi bahasa, ada fungsi lain yang memungkinkan eksekusi kode arbitrer:assert

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

10

Salah satu sumber eksploitasi menarik belum disebutkan. PHP memungkinkan string memiliki 0x00byte di dalamnya. Fungsi yang mendasari (libc) memperlakukan ini sebagai akhir dari string.

Hal ini memungkinkan untuk situasi di mana (pemeriksaan buruk) pemeriksaan kewarasan dalam PHP dapat dibodohi, misalnya dalam situasi seperti:

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

Ini mungkin termasuk file apa saja - tidak hanya yang berakhiran .php- dengan meneleponscript.php?file=somefile%00.php

Jadi fungsi apa pun yang tidak mematuhi panjang string PHP dapat menyebabkan beberapa kerentanan.


Jalur file dengan nol tidak akan diizinkan lagi dalam versi 5.4 dan 5.3 terbaru.
StasM

@stasM Itu adalah salah satu hal terbaik yang pernah saya dengar tentang PHP. Terima kasih telah berbagi.
William

9

Bagaimana dengan elemen sintaksis yang berbahaya?

" Variabel variabel " ( $$var) akan menemukan variabel dalam lingkup saat ini dengan nama $ var. Jika digunakan salah, pengguna jarak jauh dapat memodifikasi atau membaca variabel apa pun dalam lingkup saat ini. Pada dasarnya lebih lemah eval.

Mis: Anda menulis beberapa kode $$uservar = 1;, kemudian pengguna jarak jauh diatur $uservarke "admin", menyebabkan $admindiatur ke 1dalam lingkup saat ini.


Saya mengerti maksud Anda, tetapi ini terlihat seperti kelas eksploitasi yang berbeda. Apakah ada cara Anda dapat mengeksekusi kode PHP sewenang-wenang dengan mekanisme ini (tanpa menggunakan salah satu fungsi di atas)? Atau bisakah itu hanya disalahgunakan untuk mengubah konten variabel? Jika saya melewatkan sesuatu, saya ingin memperbaikinya.
tylerl

6
Anda juga dapat menggunakan fungsi variabel yang tidak mungkin dilakukan tanpa mengevaluasi skrip. Sebagai contoh: $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
erisco

Juga perhatikan refleksi.
erisco

6

Saya kira Anda tidak akan dapat benar-benar menemukan semua kemungkinan eksploitasi dengan mem-parsing file sumber Anda.

  • juga jika ada daftar hebat yang disediakan di sini, Anda dapat kehilangan fungsi yang dapat dieksploitasi

  • masih ada kode jahat "tersembunyi" seperti ini

$ myEvilRegex = base64_decode ('Ly4qL2U =');

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

  • Anda sekarang dapat mengatakan, saya cukup memperluas skrip saya untuk mencocokkan ini

  • tapi kemudian Anda akan memiliki "kode jahat" yang mungkin ada di luar konteksnya

  • sehingga menjadi (pseudo) mengamankan, Anda benar-benar harus menulis kode yang baik dan membaca semua kode yang ada pada diri sendiri


Saya telah melihat base64_decode () sering digunakan untuk kejahatan di malware berbasis Wordpress. Tambahan yang bagus untuk daftar.
Chris Allen Lane


5

Saya tahu move_uploaded_filetelah disebutkan, tetapi mengunggah file secara umum sangat berbahaya. Kehadiran saja $_FILESharus menimbulkan kekhawatiran.

Sangat mungkin untuk menanamkan kode PHP ke dalam semua jenis file. Gambar bisa sangat rentan dengan komentar teks. Masalahnya sangat menyusahkan jika kode menerima ekstensi yang ditemukan dalam $_FILESdata apa adanya.

Misalnya, pengguna dapat mengunggah file PNG yang valid dengan kode PHP yang disematkan sebagai "foo.php". Jika skripnya sangat naif, skrip tersebut dapat menyalin file sebagai "/uploads/foo.php". Jika server dikonfigurasikan untuk memungkinkan eksekusi skrip di direktori unggahan pengguna (sering kali terjadi, dan pengawasan yang mengerikan), maka Anda dapat langsung menjalankan kode PHP sewenang-wenang. (Bahkan jika gambar disimpan sebagai .png, kode mungkin dapat dieksekusi melalui kelemahan keamanan lainnya.)

Daftar hal-hal (tidak lengkap) untuk memeriksa unggahan:

  • Pastikan untuk menganalisis konten untuk memastikan unggahan adalah jenis yang diklaimnya
  • Simpan file dengan ekstensi file yang dikenal dan aman yang tidak akan pernah dieksekusi
  • Pastikan PHP (dan eksekusi kode lainnya) dinonaktifkan di direktori unggahan pengguna

5

Mari menambahkan pcntl_signaldan pcntl_alarmke daftar.

Dengan bantuan fungsi-fungsi tersebut, Anda dapat mengatasi batasan set_time_limit yang dibuat di php.ini atau dalam skrip.

Script ini misalnya akan berjalan selama 10 detik set_time_limit(1);

(Kredit jatuh ke tweet dan inti Sebastian Bergmanns :

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

Ada banyak eksploitasi PHP yang dapat dinonaktifkan oleh pengaturan di file PHP.ini. Contoh yang jelas adalah register_globals, tetapi tergantung pada pengaturan, dimungkinkan juga untuk memasukkan atau membuka file dari mesin jarak jauh melalui HTTP, yang dapat dieksploitasi jika suatu program menggunakan nama file variabel untuk salah satu di antaranya () atau fungsi penanganan file.

PHP juga memungkinkan pemanggilan fungsi variabel dengan menambahkan () ke akhir nama variabel - misalnya $myvariable();akan memanggil nama fungsi yang ditentukan oleh variabel. Ini bisa dieksploitasi; misalnya jika seorang penyerang dapat membuat variabel berisi kata 'eval', dan dapat mengontrol parameter, maka ia dapat melakukan apa saja yang dia inginkan, walaupun program tersebut sebenarnya tidak mengandung fungsi eval ().


4

Fungsi-fungsi ini juga dapat memiliki beberapa efek buruk.

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

Dua yang pertama dapat menghabiskan semua memori yang tersedia dan yang terakhir menjaga kelelahan terjadi ...


2

Ada beberapa diskusi tentang ini di security.stackexchange.com baru-baru ini

fungsi yang dapat digunakan untuk eksekusi kode arbitrer

Yah itu mengurangi ruang lingkup sedikit - tetapi karena 'cetak' dapat digunakan untuk menyuntikkan javascript (dan karena itu mencuri sesi dll) masih agak sewenang-wenang.

tidak mencantumkan fungsi yang harus dimasukkan daftar hitam atau tidak diizinkan. Sebaliknya, saya ingin memiliki daftar grep-mampu

Itu pendekatan yang masuk akal.

Pertimbangkan untuk menulis parser Anda sendiri - segera Anda akan menemukan pendekatan berbasis grep keluar dari kontrol (awk akan sedikit lebih baik). Sebentar lagi Anda juga akan mulai berharap Anda akan menerapkan daftar putih juga!

Selain yang sudah jelas, saya sarankan untuk menandai apa pun yang termasuk dengan argumen apa pun selain string literal. Watch out for __autoload () juga.


2

Saya khawatir jawaban saya mungkin agak terlalu negatif, tapi ...

IMHO, setiap fungsi dan metode di luar sana dapat digunakan untuk tujuan jahat. Anggap saja sebagai efek trickle-down nefariousness: variabel ditugaskan untuk pengguna atau input jarak jauh, variabel digunakan dalam suatu fungsi, nilai pengembalian fungsi yang digunakan dalam properti kelas, properti kelas yang digunakan dalam fungsi file, Dan seterusnya. Ingat: alamat IP palsu atau serangan orang di tengah dapat mengeksploitasi seluruh situs web Anda.

Anda bertaruh terbaik adalah untuk jejak dari awal sampai akhir setiap pengguna mungkin atau masukan jarak jauh, dimulai dengan $_SERVER, $_GET, $_POST, $_FILE, $_COOKIE, include(some remote file)( jika allow_url_fopen aktif), semua fungsi lain / kelas menangani file jarak jauh, dll Anda programatik membangun profil tumpukan-jejak dari setiap nilai yang disediakan pengguna atau jarak jauh. Ini dapat dilakukan secara programatik dengan mendapatkan semua instance berulang dari variabel yang ditugaskan dan fungsi atau metode yang digunakan, kemudian secara rekompilasi menyusun daftar semua kemunculan fungsi / metode tersebut, dan seterusnya. Periksalah untuk memastikannya terlebih dahulu melalui fungsi pemfilteran dan validasi yang benar relatif terhadap semua fungsi lain yang disentuhnya. Ini tentu saja ujian manual, jika tidak Anda akan memiliki jumlah totalcase switch sama dengan jumlah fungsi dan metode dalam PHP (termasuk yang ditentukan pengguna).

Sebagai alternatif untuk hanya menangani input pengguna, mintalah kelas pengontrol statis diinisialisasi pada awal semua skrip yang 1) memvalidasi dan menyimpan semua nilai input yang disediakan pengguna terhadap daftar putih tujuan yang diizinkan; 2) menghapus sumber input (yaitu $_SERVER = null). Anda bisa melihat dari mana Naziesque ini menjadi sedikit.


Ya tentu saja, karena dengan banyak bahasa pemrograman, tidak ada akhir dari cara untuk menyembunyikan perbuatan jahat Anda. Namun saya pikir itu merindukan maksud dari apa yang saya tanyakan. Skenarionya kira-kira seperti ini: Anda dipanggil untuk membantu setelah situs web diretas. Klien akan membayar ekstra jika Anda dapat mengamankan situs webnya sebelum pagi. Situs ini berisi 475 file PHP, dan rincian forensik yang berguna telah dihancurkan - Anda memiliki tumpukan jerami besar dan jarum yang sangat kecil ... di mana Anda mulai mencari? (Pekerjaan saya singkatnya)
tylerl

1

Berikut adalah daftar fungsi yang dinonaktifkan oleh penyedia saya untuk tujuan keamanan:

  • eksekutif
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • escapeshellarg
  • escapeshellcmd
  • ini_restore
  • openlog
  • passthru
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • syslog
  • sistem
  • url_exec

1

Sebagian besar serangan dalam kode menggunakan beberapa sumber akses, atau beberapa langkah untuk mengeksekusi sendiri. Saya akan mencari tidak hanya kode, atau metode yang memiliki kode berbahaya, tetapi semua metode, berfungsi menjalankan atau memanggilnya. Keamanan terbaik juga akan mencakup pengodean dan validasi data formulir saat masuk dan keluar.

Perhatikan juga dari mendefinisikan variabel sistem, mereka kemudian dapat dipanggil dari fungsi atau metode apa pun dalam kode.


0

Beberapa buffer overflows ditemukan menggunakan fungsi karakter 4bit yang menafsirkan teks. htmlentities () htmlspecialchars ()

berada di atas, pertahanan yang baik adalah dengan menggunakan mb_convert_encoding () untuk mengkonversi ke pengkodean tunggal sebelum interpretasi.


0

Anda dapat menemukan daftar sink yang terus diperbarui (fungsi php yang dapat dieksploitasi) dan parameternya di RIPS /config/sinks.php, penganalisa kode sumber statis untuk kerentanan dalam aplikasi PHP yang juga mendeteksi backdoors PHP.


RIPS menggunakan daftar dari halaman ini.
Benteng
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.