exploitable的PHP函数

问题:

我试图建立一个可以用于任意代码执行的函数列表。目的不是列出应被列入黑名单或不允许的功能。相反,在搜索受感染服务器的后门时,我希望在grep列表中包含red-flag个关键字。
这个想法是,如果你想构建一个多用途的恶意PHP脚本 – 比如像c99或r57这样的“web shell”脚本 – 你将不得不使用一个或者多个相对较小的一组函数在文件某处为了让用户执行任意代码。搜索这些函数可以帮助您更快地将数以万计的PHP文件的大堆缩小到需要进一步检查的相对较小的脚本集。
很明显,例如,以下任何一种都被认为是恶意的(或可怕的编码):

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

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

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

等等。
有一天,我搜索了一个被攻破的网站,但是我没有注意到一个恶意代码,因为我不知道使用/e标志(which, seriously? Why is that even there?)会使preg_replace变得危险。还有其他的我错过了吗?
这是我的列表到目前为止:
外壳执行

  •  system
  •  exec
  •  popen
  •  backtick operator
  •  pcntl_exec

PHP执行

  •  eval
  •  preg_replace(带有/e修饰符)
  •  create_function
  •  include [_once] / require [_once](see mario’s answer获取详细信息)

有一个能够修改文件的函数列表也许是有用的,但我想99%的时间利用代码将至少包含上述功能之一。但是如果你有一个能够编辑或输出文件的所有功能的列表,发布它,我会在这里包括它。 (而且我不包括mysql_execute,因为这是另一类漏洞利用的一部分。)

回答:

为了建立这个清单,我使用了2个来源。 A Study In ScarletRATS。我也添加了一些我自己的组合,并在这个线程的人已经帮助。
编辑:发布此列表后,我联系了RIPS的创始人,截至目前,此工具搜索PHP代码以使用此列表中的每个函数。
这些函数调用大部分被分类为宿。当一个受污染的变量(如$ _REQUEST)被传递给一个接收函数时,那么你就有一个漏洞。像RATSRIPS这样的程序使用类似于grep的功能来识别应用程序中的所有接收器。这意味着程序员在使用这些函数的时候应该格外小心,但是如果它们全部被禁止的话,那么你就不能完成任务了。

– 李静

命令执行

class=”lang-none prettyprint-override”>

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代码执行

除了eval外,还有其他一些执行PHP代码的方法:include require可以以Local File IncludeRemote File Include漏洞的形式用于远程代码执行。

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

接受回调的函数列表

这些函数接受一个字符串参数,可以用来调用攻击者选择的函数。攻击者可能或可能不具备传递参数的功能,具体取决于功能。在这种情况下,可以使用像phpinfo()这样的Information Disclosure函数。

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,

信息披露

大多数这些函数调用不是汇。但是,如果返回的任何数据可以被攻击者查看,这可能就是一个漏洞。如果攻击者可以看到phpinfo(),那肯定是一个漏洞。

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

其他

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

文件系统功能

根据RATS在PHP中所有filesystem functions是讨厌的。其中有些对攻击者来说似乎不是很有用。其他人比你想象的更有用。例如,如果allow_url_fopen=On,则可以使用url作为文件路径,因此可以使用copy($_GET['s'], $_GET['d']);调用来在系统上的任何位置上载PHP脚本。
另外,如果一个站点容易受到通过GET发送的请求,那么这些文件系统的所有功能都可能被滥用,从而通过您的服务器对其他主机进行通道攻击。

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

Code问答: http://codewenda.com/topics/php/
Stackoverflow: Exploitable PHP functions

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

23 + = 30