이 목록을 작성하기 위해 두 가지 소스를 사용했습니다. 스칼렛 과 RATS에 관한 연구 . 나는 또한 내 자신의 일부를 믹스에 추가 했으며이 스레드의 사람들이 도움을주었습니다.
편집 : 이 목록을 게시 한 후 나는 RIPS 의 설립자에게 연락했으며 현재이 도구는이 목록의 모든 기능을 사용하기 위해 PHP 코드를 검색합니다.
이러한 함수 호출의 대부분은 싱크로 분류됩니다. 오염 된 변수 (예 : $ _REQUEST)가 싱크 함수로 전달되면 취약점이있는 것입니다. 같은 프로그램 RATS 와 입술은 응용 프로그램에서 모든 싱크를 식별하는 기능과 같은 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
파일 시스템 함수
RATS에 따르면 PHP의 모든 파일 시스템 함수 는 불쾌합니다. 이 중 일부는 공격자에게 유용하지 않은 것 같습니다. 다른 것들은 생각보다 유용합니다. 예를 들어 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