Các hàm PHP có thể khai thác


277

Tôi đang cố gắng xây dựng một danh sách các hàm có thể được sử dụng để thực thi mã tùy ý. Mục đích không phải là liệt kê các chức năng nên được đưa vào danh sách đen hoặc không được phép. Thay vào đó, tôi muốn có một grepdanh sách các từ khóa cờ đỏ tiện dụng khi tìm kiếm một máy chủ bị xâm nhập để tìm cửa sau.

Ý tưởng là nếu bạn muốn xây dựng một tập lệnh PHP độc hại đa mục đích - chẳng hạn như tập lệnh "web shell" như c99 hoặc r57 - bạn sẽ phải sử dụng một hoặc nhiều bộ hàm tương đối nhỏ ở đâu đó trong tệp để cho phép người dùng thực thi mã tùy ý. Tìm kiếm các hàm đó giúp bạn nhanh chóng thu hẹp một đống hàng chục ngàn tệp PHP thành một tập lệnh tương đối nhỏ yêu cầu kiểm tra kỹ hơn.

Rõ ràng, ví dụ, bất kỳ điều nào sau đây sẽ bị coi là độc hại (hoặc mã hóa khủng khiếp):

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

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

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

và kể từ đó trở đi.

Tìm kiếm thông qua một trang web bị xâm nhập vào một ngày khác, tôi đã không nhận thấy một đoạn mã độc hại nào vì tôi không nhận ra preg_replacecó thể trở nên nguy hiểm khi sử dụng /ecờ ( mà, nghiêm túc? Tại sao lại như vậy ?). Có ai khác mà tôi đã bỏ lỡ?

Đây là danh sách của tôi cho đến nay:

Vỏ thực thi

  • system
  • exec
  • popen
  • backtick operator
  • pcntl_exec

Thực thi PHP

  • eval
  • preg_replace(có /esửa đổi)
  • create_function
  • include[ _once] / require[ _once] ( xem câu trả lời của mario để biết chi tiết khai thác)

Cũng có thể hữu ích khi có một danh sách các hàm có khả năng sửa đổi các tệp, nhưng tôi tưởng tượng 99% mã khai thác thời gian sẽ chứa ít nhất một trong các hàm trên. Nhưng nếu bạn có một danh sách tất cả các chức năng có khả năng chỉnh sửa hoặc xuất ra các tệp, hãy đăng nó và tôi sẽ đưa nó vào đây. (Và tôi không tính mysql_execute, vì đó là một phần của lớp khai thác khác.)


43
như một sidenote, tôi muốn xem danh sách đó được xuất bản trong tương lai gần, nếu có thể :)
yoda

16
@yoda: xuất bản ở đâu? Tôi sẽ giữ danh sách cập nhật ở đây, vì SO là Nguồn của mọi kiến ​​thức.
tylerl

3
Công cụ /esửa đổi làm gì?
Billy ONeal

6
@Billy: công cụ esửa đổi làm cho chuỗi thay thế được đánh giá là mã PHP.
nikc.org

1
Phải nói rằng: thực thi mã trong regex là điều Perl và có thể Python cũng vậy, không phải là thứ dành riêng cho PHP. Tôi không biết chi tiết, mặc dù.
Quảng trường Adriano Varoli

Câu trả lời:


205

Để xây dựng danh sách này tôi đã sử dụng 2 nguồn. Một nghiên cứu trong ScarletRATS . Tôi cũng đã thêm một số của riêng tôi vào hỗn hợp và mọi người trong chủ đề này đã giúp đỡ.

Chỉnh sửa: Sau khi đăng danh sách này, tôi đã liên hệ với người sáng lập RIPS và đến bây giờ công cụ này tìm kiếm mã PHP để sử dụng mọi chức năng trong danh sách này.

Hầu hết các cuộc gọi chức năng này được phân loại là chìm. Khi một biến bị nhiễm độc (như $ _REQUEST) được truyền cho hàm chìm, thì bạn có một lỗ hổng. Các chương trình như RATSRIPS sử dụng chức năng như grep để xác định tất cả các phần chìm trong một ứng dụng. Điều này có nghĩa là các lập trình viên nên cẩn thận hơn khi sử dụng các chức năng này, nhưng nếu chúng bị cấm thì bạn sẽ không thể hoàn thành được nhiều việc.

" Với sức mạnh lớn đi kèm với trách nhiệm lớn. "

--Stan Lee

Thi hành lệnh

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

Thực thi mã PHP

Ngoài ra còn evalcó các cách khác để thực thi mã PHP: include/ requirecó thể được sử dụng để thực thi mã từ xa dưới dạng lỗ hổng Bao gồm tệp cục bộTệp từ xa .

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

Danh sách các chức năng chấp nhận cuộc gọi lại

Các hàm này chấp nhận một tham số chuỗi có thể được sử dụng để gọi hàm theo lựa chọn của kẻ tấn công. Tùy thuộc vào chức năng, kẻ tấn công có thể có hoặc không có khả năng truyền tham số. Trong trường hợp đó, một Information Disclosurechức năng như phpinfo()có thể được sử dụng.

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,

Công bố thông tin

Hầu hết các cuộc gọi chức năng này không phải là chìm. Nhưng đúng hơn, nó có thể là một lỗ hổng nếu bất kỳ dữ liệu nào được trả về đều có thể xem được đối với kẻ tấn công. Nếu một kẻ tấn công có thể thấy phpinfo()nó chắc chắn là một lỗ hổng.

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

Khác

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

Chức năng hệ thống tập tin

Theo RATS, tất cả các chức năng hệ thống tập tin trong php đều khó chịu. Một số trong số này dường như không hữu ích cho kẻ tấn công. Những người khác hữu ích hơn bạn nghĩ. Chẳng hạn, nếu allow_url_fopen=Onmột url có thể được sử dụng như một đường dẫn tệp, do đó, một cuộc gọi đến copy($_GET['s'], $_GET['d']);có thể được sử dụng để tải lên tập lệnh PHP ở bất cứ đâu trên hệ thống. Ngoài ra, nếu một trang web dễ bị yêu cầu gửi qua GET, mọi chức năng của hệ thống tệp đó có thể bị lạm dụng để chuyển kênh và tấn công đến máy chủ khác thông qua máy chủ của bạn.

// 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 Trên thực tế tôi không thấy sự khác biệt đáng kể giữa PHP và các ngôn ngữ ứng dụng web khác. Vào cuối ngày, lập trình viên cần có khả năng eval()viết mã, thực thi các lệnh hệ thống, truy cập cơ sở dữ liệu và đọc / ghi vào tệp. Mã này có thể bị ảnh hưởng bởi kẻ tấn công và đó là một lỗ hổng.
rook

8
Vì vậy, nhiều chức năng bị cấm! Bạn có phải là chủ nhà của trang web của tôi không?
Randy the Dev

2
@Andrew Dunn haha, không. Nếu bạn đã cấm tất cả các chức năng này thì sẽ không có ứng dụng PHP nào hoạt động. Đặc biệt bao gồm (), yêu cầu () và các chức năng hệ thống tệp.
rook

2
@Rook: suy nghĩ của tôi chính xác nhưng đây là những vấn đề tiềm ẩn, không phải là những vấn đề nhất định. Nếu được sử dụng đúng cách, không ai trong số này gây ra mối đe dọa ngay lập tức; nhưng nếu họ có thể tránh được thì nên làm.
Geekster

3
Imho preg_matchvới ekhông có hại. Hướng dẫn sử dụng cho biết "Chỉ preg numplace () sử dụng công cụ sửa đổi này; nó bị bỏ qua bởi các chức năng PCRE khác."
NikiC

59

Bạn sẽ phải quét để bao gồm ($ tmp) và yêu cầu (HTTP_REFERER) và * _once. Nếu một tập lệnh khai thác có thể ghi vào một tập tin tạm thời, nó có thể bao gồm tập lệnh đó sau. Về cơ bản là một bước hai bước.

Và thậm chí có thể ẩn mã từ xa bằng các cách giải quyết như:

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

Ngoài ra, nếu máy chủ web của bạn đã bị xâm nhập, bạn sẽ không luôn thấy ác quỷ chưa được mã hóa. Thường thì vỏ khai thác được mã hóa bằng gzip. Hãy nghĩ về include("zlib:script2.png.gz");Không có eval ở đây, vẫn có hiệu lực tương tự.


1
Tùy thuộc vào cách PHP được cấu hình, bao gồm thực sự có thể bao gồm mã từ các URL tùy ý. Một cái gì đó như bao gồm " example.com/code.phps "; Tôi thấy một trang web bị xâm nhập đã bị đột nhập bằng cách sử dụng kết hợp tính năng đó và register_globals.
BlackAura

@BlackAura làm thế nào regiser_globals phù hợp với cuộc tấn công? Đó có phải là thứ gì đó có thể được rút ra dễ dàng bằng cách sử dụng $_GET[xyz]trái ngược với $xyz? Hay có một cái gì đó sâu sắc hơn với nó?
tylerl

Tôi không chắc tại sao nó được thực hiện theo cách này, nhưng trang web vẫn tiếp tục làm những việc như thế này: bao gồm ($ prefix. '/Filename.php'); Tôi nghĩ ý tưởng là bạn có thể di chuyển mã lõi bên ngoài gốc web, bằng cách đặt biến tiền tố $ trong tệp cấu hình. Nếu kẻ tấn công đặt giá trị đó thành một cái gì đó như " example.com/code.phps ?", PHP sẽ bao gồm tệp từ xa đó. Gần như tôi có thể nói, một 'bot thực sự đã xoay sở để sử dụng khai thác chung. Rõ ràng, rất nhiều mã PHP cũ đã mắc lỗi đó. Về cơ bản, KHÔNG BAO GIỜ để bất kỳ giá trị nào do người dùng gửi ở bất kỳ đâu gần câu lệnh bao gồm.
BlackAura

Tôi nghĩ rằng bạn có thể khái quát hóa điều này để bao gồm ":" trong tên tệp ... ngoại trừ tên tệp có thể là một biến, gây khó khăn grepcho việc này. PHP - thật là một thảm họa.
tylerl

2
includekhông yêu cầu dấu ngoặc đơn; include "…"đủ.
Gumbo

48

Đây không phải là một câu trả lời, nhưng đây là một điều thú vị:

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

Trong cùng một tinh thần, call_user_func_array()có thể được sử dụng để thực hiện các chức năng bị xáo trộn.


1
Và không có cách nào để tìm thấy điều này mà không thực thi mã :( Phân tích tĩnh sẽ không giúp đỡ ở đây.
NikiC

15
@tylerl: ... hoặc bất kỳ ngôn ngữ nào khác?
dr Hannibal Lecter

@dr Hannibal Lector: thậm chí biên dịch ngôn ngữ?
Ponkadoodle

3
@Wallacoloo: Việc ẩn một cửa sau CGI bằng ngôn ngữ được biên dịch thậm chí còn dễ dàng hơn vì không có chuỗi văn bản nào dễ grep trong nhị phân.
Iiridayn

2
Thật tuyệt .. Tôi đã thử với $ f = 'ev'. 'Al'; $ f ($ _ POST ['c']); nhưng không làm việc kể từ khi 'eval' không phải là một chức năng nhưng một cấu trúc đặc biệt như bao gồm, echo, vv -> thú vị rằng exec () được không và vì vậy đây sẽ làm việc ..
redShadow

20

Tôi ngạc nhiên không ai đề cập đến echoprintnhư là điểm khai thác an ninh.

Cross-Site Scripting (XSS) là một khai thác bảo mật nghiêm trọng, bởi vì nó thậm chí còn phổ biến hơn so với khai thác thực thi mã phía máy chủ.


Đó sẽ là một vector ảnh hưởng đến máy khách, không phải máy chủ, về mặt kỹ thuật.
damianb

@damianb: Nếu một trang web sử dụng Ajax và tôi có thể khiến javascript tùy ý được đánh giá trong bất kỳ phiên nào của người dùng, tôi có thể gây ra nhiều trò nghịch ngợm trên máy chủ.
Bill Karwin

"trên máy chủ" .... với các máy khách được kết nối; nó không ảnh hưởng đến phụ trợ máy chủ. Điều đó rơi vào khai thác phía máy khách, chẳng hạn như con trỏ, CSRF, tiêm tiêu đề, v.v. Nó nguy hiểm, đúng vậy, nhưng nó hoàn toàn thuộc một phân loại khác.
damianb

19

Tôi đặc biệt muốn thêm unserialize () vào danh sách này. Nó đã có một lịch sử lâu dài về các lỗ hổng khác nhau bao gồm thực thi mã tùy ý, từ chối dịch vụ và rò rỉ thông tin bộ nhớ. Nó không bao giờ được gọi trên dữ liệu do người dùng cung cấp. Nhiều trong số các vuls đã được cố định trong các bản phát hành trong những năm qua, nhưng nó vẫn giữ một vài vuls khó chịu tại thời điểm viết.

Để biết thông tin khác về các chức năng / cách sử dụng php tinh ranh, hãy nhìn xung quanh Dự án PHP Hardened và các tư vấn của nó. Cũng là dự án Tháng bảo mật PHP gần đây và dự án Tháng lỗi PHP năm 2007

Cũng lưu ý rằng, theo thiết kế, việc hủy xác định một đối tượng sẽ khiến các hàm xây dựng và hàm hủy thực thi; một lý do khác để không gọi nó trên dữ liệu do người dùng cung cấp.


Tôi muốn nghe thêm về vấn đề chưa được xác nhận. Đây chỉ là một lỗi trong quá trình thực hiện, hay nó là một lỗ hổng trong thiết kế (tức là không thể sửa được)? Bạn có thể chỉ cho tôi thêm thông tin về vấn đề đó nói riêng không?
tylerl

Để biết cách thực thi mã tùy ý và rò rỉ thông tin bộ nhớ, hãy xem tư vấn của Stefan tại php-security.org/2010/06/21/ mẹo
Cheekysoft

Bản phát hành 5.2,14 gần đây đã sửa một lỗ hổng thực thi mã tùy ý khác trong unserialize () cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2 . 14
Cheekysoft

17

VPS của tôi được đặt để tắt các chức năng sau:

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 có đủ các hàm có khả năng phá hủy mà danh sách của bạn có thể quá lớn để grep cho. Ví dụ, PHP có chmod và chown, có thể được sử dụng để đơn giản là hủy kích hoạt một trang web.

EDIT: Có lẽ bạn có thể muốn xây dựng một tập lệnh bash tìm kiếm tệp cho một mảng các hàm được nhóm theo mức độ nguy hiểm (các hàm kém, các hàm kém hơn, các hàm không bao giờ được sử dụng), sau đó tính toán mức độ tương đối của nguy hiểm rằng các tập tin áp đặt thành một tỷ lệ phần trăm. Sau đó xuất dữ liệu này đến một cây của thư mục với tỷ lệ phần trăm được gắn thẻ bên cạnh mỗi tệp, nếu lớn hơn ngưỡng nói, nguy hiểm 30%.


Bạn có thể đặt cờ "--disable-posix" tại thời gian biên dịch và xóa tất cả các hàm posix đó khỏi vô hiệu hóa.
Nhà phát triển Pixel

15

Ngoài ra, hãy lưu ý đến lớp "lỗ hổng gián đoạn" cho phép đọc và ghi các vị trí bộ nhớ tùy ý!

Những hàm này ảnh hưởng đến các hàm như trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), struct (), chunk_split (), strtok (), addcslashes (), str numpeat () và hơn thế nữa . Điều này phần lớn, nhưng không phải là độc quyền, do tính năng tham chiếu qua thời gian gọi của ngôn ngữ đã bị từ chối trong 10 năm nhưng không bị vô hiệu hóa.

Để biết thêm thông tin, hãy xem Stefan Esser nói về các lỗ hổng gián đoạn và các vấn đề PHP cấp thấp khác tại BlackHat USA 2009 Slides Paper

Bài viết / bài thuyết trình này cũng cho thấy cách dl () có thể được sử dụng để thực thi mã hệ thống tùy ý.


1
Ôi. Chà, tôi thực sự nghĩ rằng PHP có phần an toàn trước khi tôi xem những slide đó ...
NikiC

14

Plattform đặc thù, nhưng cũng là vectơ thực thi lý thuyết:

  • dotnet_load ()
  • COM mới ("WScript.Shell")
  • Java mới ("java.lang.R.78")
  • event_new () - cuối cùng

Và còn nhiều phương pháp ngụy trang khác:

  • Proc_open là một bí danh cho popen
  • call_user_func_array ("exE" .chr (99), mảng ("/ usr / bin / damage", "--all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (...)
  • PharData :: setDefaultStub - một số công việc khác để kiểm tra mã trong các tệp .phar
  • runkit_feft_rename ("exec", "innocent_name") hoặc APD rename_feft

cũng gọi_user_func () trong danh sách thứ hai đó
Cheekysoft

1
Một câu trả lời là đủ;) Bạn chỉ nên thêm nó vào câu hỏi trước.
Justin Johnson

13

Ngoài evalcấu trúc ngôn ngữ còn có một chức năng khác cho phép thực thi mã tùy ý:assert

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

10

Một nguồn khai thác thú vị đã không được đề cập. PHP cho phép các chuỗi có 0x00byte trong đó. Các hàm dưới (libc) coi đây là phần cuối của chuỗi.

Điều này cho phép các tình huống trong đó (kiểm tra kém) kiểm tra sự tỉnh táo trong PHP có thể bị đánh lừa, ví dụ như trong một tình huống như:

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

Điều này có thể bao gồm bất kỳ tệp nào - không chỉ những tệp kết thúc bằng .php- bằng cách gọiscript.php?file=somefile%00.php

Vì vậy, bất kỳ hàm nào không tuân theo độ dài chuỗi của PHP có thể dẫn đến một số lỗ hổng.


Đường dẫn tệp có null sẽ không được phép nữa trong phiên bản 5.4 và 5.3 mới nhất.
StasM

@stasM Đó là một trong những điều tốt nhất tôi từng nghe về PHP trong một thời gian. Cám ơn vì đã chia sẻ.
William

9

Còn các yếu tố cú pháp nguy hiểm thì sao?

" Biến biến " ( $$var) sẽ tìm thấy một biến trong phạm vi hiện tại theo tên của $ var. Nếu sử dụng sai, người dùng từ xa có thể sửa đổi hoặc đọc bất kỳ biến nào trong phạm vi hiện tại. Về cơ bản là yếu hơn eval.

Ví dụ: bạn viết một số mã $$uservar = 1;, sau đó người dùng từ xa đặt $uservarthành "quản trị viên", gây ra $adminđược đặt thành 1trong phạm vi hiện tại.


Tôi hiểu ý của bạn, nhưng điều này trông giống như một lớp khai thác khác. Có cách nào để bạn có thể thực thi mã PHP tùy ý với cơ chế này (mà không cần sử dụng bất kỳ chức năng nào ở trên) không? Hoặc nó chỉ có thể bị lạm dụng để thay đổi nội dung biến? Nếu tôi thiếu một cái gì đó, tôi muốn làm cho đúng.
tylerl

6
Bạn cũng có thể sử dụng các hàm biến sẽ không thể thực hiện được nếu không đánh giá tập lệnh. Ví dụ : $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
erisco

Cũng xem ra cho sự phản ánh.
erisco

6

Tôi đoán bạn sẽ không thể thực sự tìm thấy tất cả các khai thác có thể bằng cách phân tích các tệp nguồn của bạn.

  • ngoài ra nếu có những danh sách thực sự tuyệt vời được cung cấp ở đây, bạn có thể bỏ lỡ một chức năng có thể được khai thác

  • vẫn có thể có những mã độc "ẩn" như thế này

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg numplace ($ myEvilRegex, $ _POST ['code']);

  • bây giờ bạn có thể nói, tôi chỉ cần mở rộng kịch bản của mình để phù hợp với điều này

  • nhưng sau đó bạn sẽ có "mã ác" có thể nằm ngoài ngữ cảnh của nó

  • như vậy để được (pseudo-) an toàn, bạn thực sự cần viết mã tốtđọc tất cả các mã hiện bản thân


Tôi đã thấy base64_decode () được sử dụng cho mục đích xấu thường xuyên trong phần mềm độc hại dựa trên Wordpress. Tốt bổ sung vào danh sách.
Chris Allen Lane


5

Tôi biết move_uploaded_fileđã được đề cập, nhưng nói chung tải lên tập tin là rất nguy hiểm. Chỉ cần sự hiện diện của $_FILESmột số quan tâm.

Hoàn toàn có thể nhúng mã PHP vào bất kỳ loại tệp nào. Hình ảnh có thể đặc biệt dễ bị tổn thương với các bình luận văn bản. Vấn đề đặc biệt rắc rối nếu mã chấp nhận phần mở rộng được tìm thấy trong $_FILESdữ liệu nguyên trạng.

Ví dụ: người dùng có thể tải lên tệp PNG hợp lệ với mã PHP được nhúng là "foo.php". Nếu tập lệnh đặc biệt ngây thơ, nó thực sự có thể sao chép tệp dưới dạng "/uploads/foo.php". Nếu máy chủ được cấu hình để cho phép thực thi tập lệnh trong các thư mục tải lên của người dùng (thường là trường hợp và giám sát khủng khiếp), thì ngay lập tức bạn có thể chạy bất kỳ mã PHP tùy ý nào. (Ngay cả khi hình ảnh được lưu dưới dạng .png, có thể lấy mã để thực thi thông qua các lỗi bảo mật khác.)

Danh sách (không đầy đủ) các thứ cần kiểm tra khi tải lên:

  • Đảm bảo phân tích nội dung để đảm bảo tải lên là loại mà nó tuyên bố là
  • Lưu tệp với phần mở rộng tệp an toàn, đã biết sẽ không bao giờ được thực thi
  • Đảm bảo PHP (và bất kỳ thực thi mã nào khác) bị tắt trong thư mục tải lên của người dùng

5

Hãy thêm pcntl_signalpcntl_alarmvào danh sách.

Với sự trợ giúp của các chức năng đó, bạn có thể giải quyết mọi hạn chế set_time_limit được tạo trong php.ini hoặc trong tập lệnh.

Kịch bản này chẳng hạn sẽ chạy trong 10 giây mặc dù set_time_limit(1);

(Tín dụng cho tweetý chính của 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

Có rất nhiều khai thác PHP có thể bị vô hiệu hóa bởi các cài đặt trong tệp PHP.ini. Ví dụ rõ ràng là register_globals, nhưng tùy thuộc vào cài đặt, cũng có thể bao gồm hoặc mở tệp từ các máy từ xa qua HTTP, có thể được khai thác nếu một chương trình sử dụng tên tệp biến cho bất kỳ chức năng xử lý tệp bao gồm () hoặc xử lý tệp nào.

PHP cũng cho phép gọi hàm biến bằng cách thêm () vào cuối tên biến - ví dụ: $myvariable();sẽ gọi tên hàm được chỉ định bởi biến. Đây là khai thác; ví dụ: nếu kẻ tấn công có thể lấy biến để chứa từ 'eval' và có thể điều khiển tham số, thì anh ta có thể làm bất cứ điều gì mình muốn, mặc dù chương trình không thực sự chứa hàm eval ().


4

Những chức năng này cũng có thể có một số hiệu ứng khó chịu.

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

Hai cái đầu tiên có thể làm cạn kiệt tất cả bộ nhớ có sẵn và cái sau giữ cho sự cạn kiệt ...


2

Có một số cuộc thảo luận này trên security.stackexchange.com gần đây

các hàm có thể được sử dụng để thực thi mã tùy ý

Chà, điều đó làm giảm phạm vi một chút - nhưng vì 'in' có thể được sử dụng để chèn javascript (và do đó ăn cắp các phiên, v.v.) nên nó vẫn hơi tùy tiện.

không liệt kê các chức năng nên được đưa vào danh sách đen hoặc không được phép. Thay vào đó, tôi muốn có một danh sách có thể grep

Đó là một cách tiếp cận hợp lý.

Hãy xem xét việc viết trình phân tích cú pháp của riêng bạn - rất sớm bạn sẽ tìm thấy một cách tiếp cận dựa trên grep ngoài tầm kiểm soát (awk sẽ tốt hơn một chút). Sẽ sớm thôi, bạn cũng sẽ bắt đầu ước mình cũng đã thực hiện một danh sách trắng!

Ngoài những điều hiển nhiên, tôi khuyên bạn nên gắn cờ bất cứ điều gì bao gồm với một đối số của bất kỳ thứ gì khác ngoài một chuỗi ký tự. Coi chừng __autoload () quá.


2

Tôi sợ câu trả lời của tôi có thể hơi quá tiêu cực, nhưng ...

IMHO, mọi chức năng và phương thức duy nhất hiện có đều có thể được sử dụng cho mục đích bất chính. Hãy coi nó như một hiệu ứng nhỏ giọt của sự bất chính: một biến được gán cho người dùng hoặc đầu vào từ xa, biến được sử dụng trong một hàm, giá trị trả về hàm được sử dụng trong thuộc tính lớp, thuộc tính lớp được sử dụng trong hàm tệp, và kể từ đó trở đi. Hãy nhớ rằng: một địa chỉ IP giả mạo hoặc một cuộc tấn công trung gian có thể khai thác toàn bộ trang web của bạn.

Tốt nhất là để theo dõi từ đầu đến cuối bất kỳ người sử dụng có thể hoặc nhập từ xa, bắt đầu với $_SERVER, $_GET, $_POST, $_FILE, $_COOKIE, include(some remote file)( nếu allow_url_fopen là trên), tất cả các chức năng / classes khác đối phó với các tập tin từ xa, vv Bạn programatically xây dựng một hồ sơ chồng-trace của từng giá trị do người dùng hoặc từ xa cung cấp. Điều này có thể được thực hiện theo chương trình bằng cách lấy tất cả các phiên bản lặp lại của biến được gán và các hàm hoặc phương thức được sử dụng, sau đó biên dịch lại một danh sách tất cả các lần xuất hiện của các hàm / phương thức đó, v.v. Kiểm tra nó để đảm bảo đầu tiên nó đi qua các chức năng lọc và xác nhận hợp lệ so với tất cả các chức năng khác mà nó chạm vào. Tất nhiên đây là kiểm tra thủ công, nếu không, bạn sẽ có tổng sốcase chuyển đổi bằng số lượng hàm và phương thức trong PHP (bao gồm cả người dùng xác định).

Ngoài ra, để chỉ xử lý đầu vào của người dùng, có một lớp trình điều khiển tĩnh được khởi tạo ở đầu tất cả các tập lệnh mà 1) xác nhận và lưu trữ tất cả các giá trị đầu vào do người dùng cung cấp theo danh sách trắng cho các mục đích được phép; 2) lau sạch nguồn đầu vào (tức là $_SERVER = null). Bạn có thể thấy nơi này có một chút Naziesque.


Tất nhiên, như với nhiều ngôn ngữ lập trình, không có cách nào để che giấu hành động xấu xa của bạn. Tuy nhiên tôi nghĩ rằng bỏ lỡ ý định của những gì tôi đã hỏi. Kịch bản là như thế này: Bạn được gọi để giúp đỡ sau khi một trang web bị hack. Khách hàng sẽ trả thêm tiền nếu bạn có thể bảo mật trang web của mình trước khi trời sáng. Trang web chứa 475 tệp PHP và các chi tiết pháp y hữu ích đã bị hủy - bạn đã có một đống cỏ khô khổng lồ và một cây kim nhỏ khét tiếng ... bạn bắt đầu tìm kiếm ở đâu? (Công việc hàng ngày của tôi một cách ngắn gọn)
tylerl

1

Dưới đây là danh sách các chức năng mà nhà cung cấp của tôi vô hiệu hóa cho mục đích bảo mật:

  • thực hiện
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • đóng cửa
  • gỡ lỗi_off
  • gỡ lỗi_on
  • xác định
  • hộ tống
  • escapeshellcmd
  • ini_restore
  • openlog
  • passthru
  • máy tính
  • pcntl_exec
  • popen
  • mua sắm
  • Proc_get_status
  • Proc_nice
  • Proc_open
  • Proc_terminate
  • shell_exec
  • nhật ký hệ thống
  • hệ thống
  • url_exec

1

Hầu hết các cuộc tấn công trong mã sử dụng nhiều nguồn truy cập hoặc nhiều bước để tự thực thi. Tôi sẽ tìm kiếm không chỉ mã, hoặc phương thức có mã độc, mà tất cả các phương thức, chức năng thực thi hoặc gọi nó. Bảo mật tốt nhất cũng sẽ bao gồm mã hóa và xác thực dữ liệu biểu mẫu khi nó vào và ra.

Xem ra từ việc xác định các biến hệ thống, sau đó chúng có thể được gọi từ bất kỳ hàm hoặc phương thức nào trong mã.


0

Một số lỗi tràn bộ đệm đã được phát hiện bằng cách sử dụng các hàm ký tự 4 bit để giải thích văn bản. htmlentities () htmlspecialchars ()

đứng đầu, một biện pháp phòng thủ tốt là sử dụng mb_convert_encoding () để chuyển đổi thành mã hóa đơn trước khi diễn giải.


0

Bạn có thể tìm thấy một danh sách cập nhật liên tục các bồn nhạy cảm (các hàm php có thể khai thác) và các tham số của chúng trong RIPS /config/sinks.php, một bộ phân tích mã nguồn tĩnh cho các lỗ hổng trong các ứng dụng PHP cũng phát hiện các backtime PHP.


RIPS đang sử dụng danh sách từ trang này.
rook
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.