为了账号安全,请及时绑定邮箱和手机立即绑定

可利用PHP函数

/ 猿问

可利用PHP函数

慕容森 2019-07-01 10:56:41

可利用PHP函数

我试图构建一个可用于任意代码执行的函数列表。其目的不是列出应该列入黑名单或其他不允许的函数。相反,我想要一个grep-可供选择的清单红旗关键词汉迪搜索妥协服务器的后门。

这个想法是,如果你想要构建一个多用途的恶意PHP脚本-比如C99或R57之类的“web shell”脚本-你必须在文件中使用一个或多个相对较小的函数集,以便允许用户执行任意代码。搜索这些函数可以帮助您更快地将数以万计的PHP文件缩小为一组相对较小的脚本,这些脚本需要更仔细的检查。

例如,以下任何一项显然都被认为是恶意的(或糟糕的编码):

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

等等。

前几天我在一个被破坏的网站上搜索,我没有注意到一段恶意代码,因为我没有意识到preg_replace如果使用/e旗(哪个,真的吗?为什么那甚至在那里??)还有其他我错过的吗?

到目前为止,这是我的清单:

外壳执行

  • system

  • exec

  • popen

  • backtick operator

  • pcntl_exec

PHP执行

  • eval

  • preg_replace

    (与

    /e

    改性剂)
  • create_function

  • include[_once] / require[_once] (见马里奥的回答

    (关于利用细节)

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


查看完整描述

3 回答

?
收到一只叮咚

要构建这个列表,我使用了两个源。“红”研究大鼠..我也添加了一些我自己的混合,在这个线程上的人已经帮助解决了。

编辑:在发布这份名单后,我联系了裂片到目前为止,该工具在PHP代码中搜索该列表中每个函数的使用情况。

这些函数调用大多被归类为Sinks。当一个受污染的变量(如$_Request)被传递给接收器函数时,您就有了一个漏洞。像这样的程序大鼠裂片使用grep类功能标识应用程序中的所有接收器。这意味着程序员在使用这些函数时应该格外小心,但是如果他们都禁止使用这些函数,那么您就无法完成很多工作。

"伟大的权力带来了巨大的责任。"

-斯坦·李

命令执行

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的形式用于远程代码执行。本地文件包括远程文件包括弱点。

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

接受回调的函数列表

这些函数接受一个字符串参数,该参数可用于调用攻击者选择的函数。根据函数的不同,攻击者可能具有传递参数的能力,也可能没有传递参数的能力。在这种情况下Information Disclosure功能类phpinfo()可以被利用。

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

文件系统功能

根据老鼠的说法文件系统功能在php中是很恶心的。其中一些对攻击者来说似乎不太有用。其他的比你想象的更有用。例如,如果allow_url_fopen=On然后,url可以用作文件路径,因此调用copy($_GET['s'], $_GET['d']);可用于上传系统上任何地方的PHP脚本。此外,如果一个站点容易受到通过GET发送的请求的攻击,那么所有这些文件系统功能都可能被滥用,通过您的服务器传送和攻击到另一个主机。

// open filesystem handlerfopen
tmpfile
bzopen
gzopenSplFileObject->__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 filesystemfile_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


查看完整回答
反对 回复 2019-07-01
?
慕莱坞7535251

您还必须扫描是否包含($tmp)和要求(HTTP_Referer)和*_一次性。如果一个利用漏洞的脚本可以写入一个临时文件,它可以在稍后包含它。基本上是两步评估。

甚至还可以使用以下解决方案隐藏远程代码:

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

此外,如果您的Web服务器已经被破坏,您将不会总是看到未编码的邪恶。开发外壳通常是gzip编码的。想想include("zlib:script2.png.gz");这里没有评估,效果还是一样。


查看完整回答
反对 回复 2019-07-01
?
炎炎设计

这本身并不是一个答案,但这里有一些有趣的东西:

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

本着同样的精神,call_user_func_array()可用于执行模糊函数。


查看完整回答
反对 回复 2019-07-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信