[php] 악용 가능한 PHP 함수

임의 코드 실행에 사용할 수있는 함수 목록을 작성하려고합니다. 블랙리스트에 있거나 허용되지 않는 기능을 나열하는 것이 목적이 아닙니다. 오히려 백도어를 위해 손상된 서버를 검색 할 때 유용한 빨간색 플래그 키워드 grep목록을 만들고 싶습니다 .

아이디어는 c99 또는 r57과 같은 “웹 쉘”스크립트와 같은 다목적 악성 PHP 스크립트를 빌드하려면 상대적으로 작은 기능 세트 중 하나 이상을 사용해야한다는 것입니다 사용자가 임의의 코드를 실행할 수 있도록 파일의 어딘가에 있습니다. 이러한 기능을 검색하면 수만 가지의 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다른 클래스의 악용의 일부이기 때문에 나는 계산하지 않습니다 .)



답변

이 목록을 작성하기 위해 두 가지 소스를 사용했습니다. 스칼렛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 코드 실행

그렇다에서 evalPHP 코드를 실행할 수있는 다른 방법이 있습니다 : 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=OnURL을 파일 경로 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


답변

include ($ tmp) 및 require (HTTP_REFERER) 및 * _once를 스캔해야합니다. 익스플로잇 스크립트가 임시 파일에 쓸 수 있으면 나중에이를 포함 할 수 있습니다. 기본적으로 2 단계 평가입니다.

다음과 같은 해결 방법으로 원격 코드를 숨길 수도 있습니다.

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

또한 웹 서버가 이미 손상된 경우 항상 인코딩되지 않은 악을 볼 수는 없습니다. 익스플로잇 셸은 종종 gzip으로 인코딩됩니다. include("zlib:script2.png.gz");여기서도 평가가 없다고 생각 하십시오. 여전히 동일한 효과입니다.


답변

이것은 그 자체로 답은 아니지만 흥미로운 점이 있습니다.

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

같은 방식으로 call_user_func_array()난독 처리 된 기능을 실행하는 데 사용할 수 있습니다.


답변

나는 아무도 언급했다 놀라게하지거야 echoprint보안 착취의 점으로.

XSS (Cross-Site Scripting) 는 서버 측 코드 실행 익스플로잇보다 훨씬 일반적이기 때문에 심각한 보안 익스플로잇입니다.


답변

특히이 목록에 unserialize ()를 추가하고 싶습니다. 임의 코드 실행, 서비스 거부 및 메모리 정보 유출을 포함하여 다양한 취약점의 오랜 역사를 가지고 있습니다. 사용자 제공 데이터에서 호출해서는 안됩니다. 이 vul들 중 다수는 지난 이슬에 걸쳐 릴리스에서 수정되었지만, 현재 글을 쓰는 시점에서 여전히 끔찍한 vulcans 몇 개를 유지합니다.

dodgy PHP 함수 / 사용법에 대한 다른 정보는 강화 된 PHP 프로젝트 와 그 조언을 살펴보십시오 . 최근 의 PHP 보안 월 및 2007 PHP월 버그 프로젝트

또한 의도적으로 객체를 직렬화 해제하면 생성자 및 소멸자 함수가 실행됩니다. 사용자가 제공 한 데이터를 호출하지 않는 또 다른 이유.


답변

내 VPS가 다음 기능을 비활성화하도록 설정되어 있습니다.

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에는 잠재적으로 파괴 가능한 함수가 충분하므로 목록이 너무 커서 grep하기가 어려울 수 있습니다. 예를 들어, PHP에는 chmod와 chown이 있으며 이는 단순히 웹 사이트를 비활성화하는 데 사용될 수 있습니다.

편집 : 아마도 위험으로 분류 된 기능 배열 (악한 기능, 더 나쁜 기능, 절대 사용해서는 안되는 기능)으로 파일을 검색 한 다음 bash 스크립트를 작성하여 위험의 상대성 계산을 원할 수 있습니다 파일이 백분율로 부과됩니다. 그런 다음이 값을 30 % 위험 임계 값보다 큰 경우 각 파일 옆에 태그가 지정된 백분율로 디렉토리 트리에 출력하십시오.


답변

또한 임의의 메모리 위치를 읽고 쓸 수있는 “중단 취약성”클래스를 알고 있어야합니다!

이들은 trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () 등의 함수에 영향을줍니다. . 이는 10 년 동안 사용되지 않지만 비활성화되지 않은 언어의 호출 시간 기준 통과 기능으로 인한 것이지만 대부분은 아닙니다.

자세한 내용은 BlackHat USA 2009 슬라이드 용지 에서 중단 취약점 및 기타 하위 수준 PHP 문제에 대한 Stefan Esser의 이야기를 참조하십시오.

이 백서 / 표현은 dl ()을 사용하여 임의의 시스템 코드를 실행하는 방법도 보여줍니다.