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 grep
daftar 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_replace
bisa menjadi berbahaya dengan menggunakan /e
bendera ( 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/e
pengubah)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.)
/e
pengubah?e
pengubah membuat string pengganti untuk dievaluasi sebagai kode PHP.Jawaban:
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
Eksekusi Kode PHP
Terlepas dari
eval
ada cara lain untuk mengeksekusi kode PHP:include
/require
dapat digunakan untuk eksekusi kode jauh dalam bentuk Include File Lokal dan Remote File Include kerentanan.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 Disclosure
fungsi sepertiphpinfo()
bisa digunakan.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.Lain
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=On
kemudian url dapat digunakan sebagai jalur file, jadi panggilan untukcopy($_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.sumber
eval()
kode, untuk mengeksekusi perintah sistem, mengakses database, dan membaca / menulis ke file. Kode ini dapat dipengaruhi oleh penyerang, dan itu adalah kerentanan.preg_match
dengane
tidak ada salahnya. Manual mengatakan "Hanya preg_replace () menggunakan pengubah ini; itu diabaikan oleh fungsi PCRE lainnya."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:
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.sumber
$_GET[xyz]
sebagai lawan$xyz
? Atau ada sesuatu yang lebih dalam darinya?grep
untuk. PHP - bencana.include
tidak membutuhkan tanda kurung;include "…"
cukup.Ini bukan jawaban semata, tetapi ada sesuatu yang menarik:
Dengan semangat yang sama,
call_user_func_array()
dapat digunakan untuk menjalankan fungsi yang dikaburkan.sumber
Saya terkejut tidak ada yang menyebutkan
echo
danprint
sebagai titik eksploitasi keamanan.Cross-Site Scripting (XSS) adalah eksploitasi keamanan serius, karena ini bahkan lebih umum daripada eksploitasi eksekusi kode server-side.
sumber
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.
sumber
VPS saya diatur untuk menonaktifkan fungsi-fungsi berikut:
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.
sumber
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.
sumber
Plattform-spesifik, tetapi juga vektor eksekutif teoritis:
Dan ada banyak lagi metode penyamaran:
sumber
Terlepas dari
eval
konstruksi bahasa, ada fungsi lain yang memungkinkan eksekusi kode arbitrer:assert
sumber
Salah satu sumber eksploitasi menarik belum disebutkan. PHP memungkinkan string memiliki
0x00
byte 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:
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.
sumber
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 lemaheval
.Mis: Anda menulis beberapa kode
$$uservar = 1;
, kemudian pengguna jarak jauh diatur$uservar
ke "admin", menyebabkan$admin
diatur ke1
dalam lingkup saat ini.sumber
$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.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
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
sumber
Operator Backtick Backtick pada manual php
sumber
Saya tahu
move_uploaded_file
telah disebutkan, tetapi mengunggah file secara umum sangat berbahaya. Kehadiran saja$_FILES
harus 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
$_FILES
data 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:
sumber
Mari menambahkan
pcntl_signal
danpcntl_alarm
ke 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 :
sumber
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 ().sumber
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 ...
sumber
Ada beberapa diskusi tentang ini di security.stackexchange.com baru-baru ini
Yah itu mengurangi ruang lingkup sedikit - tetapi karena 'cetak' dapat digunakan untuk menyuntikkan javascript (dan karena itu mencuri sesi dll) masih agak sewenang-wenang.
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.
sumber
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)
( jikaallow_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.sumber
Berikut adalah daftar fungsi yang dinonaktifkan oleh penyedia saya untuk tujuan keamanan:
sumber
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.
sumber
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.
sumber
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.
sumber