공격 가능한 PHP 함수
임의 코드 실행에 사용할 수 있는 함수의 목록을 작성하려고 합니다.목적은 블랙리스트에 포함되거나 허용되지 않는 기능을 나열하는 것이 아닙니다.'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다grep- 손상된 서버에서 백랩을 검색할 때 편리한 red-param 키워드의 목록을 사용할 수 있습니다.
c99나 r57과 같은 "web shell" 스크립트와 같은 다목적 악성 PHP 스크립트를 구축하려면 사용자가 임의의 코드를 실행할 수 있도록 파일 내 어딘가에 비교적 작은 함수 세트를 하나 이상 사용해야 합니다.이러한 기능을 검색하면 수만 개의 PHP 파일이 쌓여 있는 건초 더미를 비교적 작은 스크립트 세트로 더 빨리 좁힐 수 있습니다.
예를 들어, 다음의 어느쪽인가를 악의가 있는(또는 불량한 코딩) 것으로 간주하는 것이 명백합니다.
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
기타 등등.
얼마 전 손상된 웹 사이트를 검색했을 때 악성코드는 전혀 눈치채지 못했습니다.preg_replace 할 수 있다/eflag(어느쪽, 정말?) 그게 왜 거기 있지?)제가 놓친 다른 것들이 있나요?
지금까지의 제 리스트는 다음과 같습니다.
셸 Execute
systemexecpopenbacktick operatorpcntl_exec
PHP 실행
evalpreg_replace함께)/e를 지정합니다.create_functioninclude_once/ > /require_once] (공격에 대한 자세한 내용은 mario의 답변을 참조하십시오.)
파일을 수정할 수 있는 함수 목록이 있으면 편리할 수 있지만, 이용 코드의 99%는 적어도 위의 함수 중 하나를 포함할 것으로 예상됩니다.수 있는 이치노mysql_execute이는 다른 종류의 악용의 일부이기 때문입니다.)
이 목록을 작성하기 위해 저는 두 가지 소스를 사용했습니다.주홍빛과 쥐의 연구나는 또한 내 자신의 일부를 믹스에 추가했고 이 스레드에 있는 사람들이 도움을 주었다.
편집: 이 목록을 게시한 후 RIPS의 설립자에게 연락했습니다.현재 이 도구는 이 목록 내의 모든 함수의 사용을 위해 PHP 코드를 검색합니다.
이러한 함수 호출의 대부분은 싱크로 분류됩니다.오염된 변수($_REQUEST 등)가 싱크 함수에 전달되면 취약성이 있습니다.RATS 나 RIPS 등의 프로그램에서는 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 코드 실행 방법은 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 스크립트를 시스템 어디에나 업로드 할 수 있습니다., 에 대해서 , 이러한 이 있습니다.
// 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) 및 *_도 한 번 스캔해야 합니다.부정 이용 스크립트가 임시 파일에 쓸 수 있는 경우 나중에 이를 포함할 수 있습니다.기본적으로 2단계 평가입니다.
또, 다음과 같은 회피책으로 리모트 코드를 숨길 수도 있습니다.
include("data:text/plain;base64,$_GET[code]");
또한 웹 서버가 이미 손상되었다면 인코딩되지 않은 악의가 항상 나타나는 것은 아닙니다.gzip을 사용하다include("zlib:script2.png.gz");기기평 、 없없,,,, 、 ,,은야야야 。
이것은 그 자체로는 답이 아닙니다만, 여기 흥미로운 것이 있습니다.
$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");
정신으로 in은 in in in in incall_user_func_array()를 사용하여 난독화된 함수를 실행할 수 있습니다.
도 말을 않았다니echo ★★★★★★★★★★★★★★★★★」print보안 악용 지점입니다.
XSS(Cross-Site Scripting)는 서버 측 코드 실행 공격보다 훨씬 더 일반적이기 때문에 심각한 보안 공격입니다.
특히 이 목록에 unserialize()를 추가하고 싶습니다.이는 임의 코드 실행, 서비스 거부, 메모리 정보 유출 등 다양한 취약성의 오랜 역사를 가지고 있습니다.사용자가 제공한 데이터에서는 호출할 수 없습니다.이 불경들 중 많은 것들이 지난 이슬을 맞으면서도 여전히 몇 개의 더러운 불경들을 남겨두고 있다.
didgy php 함수/사용방법에 대한 다른 정보는 Hardened PHP Project와 그 권고사항을 참조하십시오.또한 최근 PHP 보안의 달과 2007년 PHP Bugs의 달 프로젝트도 있습니다.
또, 설계상 오브젝트의 시리얼화를 해제하면 컨스트럭터 및 디스트럭터 함수가 실행된다는 점에 주의해 주세요.또, 유저가 제공한 데이터에 대해서 오브젝트를 호출하지 않는 것도 하나의 이유입니다.
My 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(), bread(), strchr(), strstr(), substr(), chunk_split(), strtok(), addcslash(), str_repeat() 등의 함수에 영향을 줍니다.이는 10년 동안 사용되지 않았지만 비활성화되지 않은 언어의 통화 시간 패스 바이 레퍼런스 기능에 의한 것이 대부분입니다.
자세한 내용은 BlackHat USA 2009 Slides Paper에서 Stefan Esser의 인터럽트 취약성 및 기타 하위 수준의 PHP 문제에 대한 강연을 참조하십시오.
이 문서/프레젠테이션에서는 dl()을 사용하여 임의의 시스템 코드를 실행하는 방법도 보여 줍니다.
Plattform 고유하지만 이론적인 exec 벡터:
- dotnet_load()
- 새로운 COM("WScript")셸')
- 새로운 Java("java.lang")실행시)
- event_new() - 최종적으로는
그리고 더 많은 위장 방법이 있다.
- proc_open은 popen의 에일리어스입니다
- call_user_func_array("exE".chr(99), 어레이("/usr/bin/damage", "--all");
- file_put_bin/cgi-bin/nextinvocation.cgi") & chmod(...)
- PharData::setDefaultStub: .phar 파일의 코드를 검사하기 위한 추가 작업
- runkit_function_rename("exec", "innocent_name") 또는 APD rename_function
★★★★★★★★★★★★★★★★★★★외evallanguage constructure에는 임의의 코드 실행을 허용하는 또 다른 함수가 있습니다.
assert('ex' . 'ec("kill --bill")');
흥미로운 악용의 한 가지 출처는 언급되지 않았습니다.에 PHP를 사용할 수 .0x00이치노기본(libc) 함수는 이것을 문자열의 끝으로 취급합니다.
이를 통해 다음과 같은 상황에서 PHP의 건전성 검사가 잘못 구현될 수 있습니다.
/// note: proof of principle code, don't use
$include = $_GET['file'];
if ( preg_match("/\\.php$/",$include) ) include($include);
될 수 ..php - -로 -script.php?file=somefile%00.php
따라서 PHP의 문자열 길이를 따르지 않는 함수는 몇 가지 취약성을 초래할 수 있습니다.
위험한 통사적 요소는?
"변수 변수" ($$var에서 $var라는 으로 변수를 는 현재 스코프에서 $var라는 이름으로 변수를 검색합니다.잘못 사용된 경우 원격 사용자는 현재 범위 내의 변수를 수정하거나 읽을 수 있습니다.으로는 약하다eval.
: 코드 쓰세요.$$uservar = 1; 리모트 가 설정해 주세요.$uservar하여 "admin", "admin"을 발생시킵니다.$admin로 1현재 범위 내에서.
소스 파일을 구문 분석한다고 해서 가능한 모든 악용 방법을 찾을 수 있는 것은 아닐 것입니다.
또한 여기에 정말 훌륭한 목록이 제공된다면 악용될 수 있는 기능을 놓칠 수 있습니다.
아직도 이런 '숨겨진' 악순환이 있을 수 있어
$myEvilRegex = base64_decode('Ly4qL2U=');
preg_replace($myEvilRegex, $_POST['code']);
이제 이렇게 말할 수 있겠죠. 저는 단순히 제 대본을 여기에 맞춰 확장했을 뿐입니다.
하지만 당신은 그 문맥을 벗어난 "악의 코드"를 갖게 될 것이다.
따라서 (안전)보안을 위해 좋은 코드를 작성하고 기존의 모든 코드를 직접 읽어야 합니다.
php 매뉴얼의 Backtick 연산자 Backtick
는 알고 있다move_uploaded_file이미 언급되어 있습니다만, 일반적으로 파일 업로드는 매우 위험합니다. just of of of of of of of of of of의 존재감$_FILES려를를불불불불겁겁겁
모든 종류의 파일에 PHP 코드를 삽입할 수 있습니다.이미지는 텍스트 설명에 특히 취약할 수 있습니다.는 특히 가 '내선번호'에 경우 .$_FILESdata가 활성화 되어 .
예를 들어, 사용자는 "foo.php"로 PHP 코드가 내장된 유효한 PNG 파일을 업로드할 수 있습니다.스크립트가 특히 단순할 경우 실제로 "/uploads/foo.php"로 파일을 복사할 수 있습니다.서버가 사용자 업로드 디렉토리에서 스크립트 실행을 허용하도록 구성되어 있는 경우(대부분의 경우, 그리고 심각한 실수), 임의의 PHP 코드를 즉시 실행할 수 있습니다(이미지가 .png로 저장되더라도 다른 보안 결함을 통해 코드를 실행할 수 있습니다).
업로드 시 확인해야 할 사항 목록:
- 콘텐츠를 분석하여 업로드가 주장하는 유형인지 확인하십시오.
- 실행하지 않을 것으로 알려진 안전한 파일 확장자로 파일을 저장합니다.
- 사용자 업로드 디렉토리에서 PHP(및 기타 코드 실행)가 비활성화되어 있는지 확인합니다.
추합 let let let let let let let 더하자pcntl_signal ★★★★★★★★★★★★★★★★★」pcntl_alarm목록으로 이동합니다.
이러한 함수의 도움을 받아 php.ini 또는 스크립트로 작성된 set_time_limit 제한을 회피할 수 있습니다.
, 이 됩니다.set_time_limit(1);
<?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";
}
PHP.ini 파일의 설정에 따라 비활성화할 수 있는 PHP 악용 로드가 있습니다.명백한 예는 register_globals이지만 설정에 따라서는 HTTP를 통해 리모트머신으로부터의 파일을 포함하거나 열 수도 있습니다.이러한 파일은 프로그램이 include() 또는 파일 처리 함수 중 하나에 변수 파일 이름을 사용하는 경우에 악용될 수 있습니다.
PHP는 에 ()를추가하여 예: "PHP").$myvariable();는 변수에 의해 지정된 함수 이름을 호출합니다.예를 들어 공격자가 변수에 'eval'이라는 단어를 포함할 수 있고 매개 변수를 제어할 수 있다면 프로그램에 실제로 eval() 함수가 포함되어 있지 않더라도 원하는 모든 작업을 수행할 수 있습니다.
이러한 기능에는, 좋지 않은 영향도 있습니다.
str_repeat()unserialize()register_tick_function()register_shutdown_function()
앞의 두 개는 사용 가능한 모든 메모리를 소진하고, 뒤의 두 개는 계속 소진될 수 있습니다.
최근 security.stackexchange.com에서 이에 대한 논의가 있었습니다.
임의의 코드 실행에 사용할 수 있는 함수
범위를 조금 줄였지만, javascript를 주입(따라서 세션을 훔치는 등)하는 데 '프린트'를 사용할 수 있기 때문에 여전히 다소 자의적이다.
블랙리스트에 올리거나 허가되지 않는 기능을 나열하는 것이 아닙니다.대신, 나는 GREPable 리스트를 갖고 싶다.
그것은 현명한 접근이다.
파서를 직접 쓰는 것을 고려해 보세요.조만간 GREP 기반의 접근방식이 제어 불능이 될 것입니다(아크가 조금 더 나을 것입니다).당신도 곧 화이트리스트를 도입하고 싶다고 생각하게 될 것입니다.
명백한 것 외에, 문자열 리터럴 이외의 인수를 포함하는 모든 것에 플래그를 붙이는 것을 추천합니다.__autoload()도 주의해 주세요.
제 답변이 너무 부정적일 수도 있지만...
IMHO, 모든 기능과 방법은 악의에 찬 용도로 사용될 수 있습니다.사용자 또는 원격 입력에 변수가 할당되고 함수에 변수가 사용되며 클래스 속성에 사용되는 함수 반환 값, 파일 함수에 사용되는 클래스 속성 등에 대한 네파리티의 트리클 다운 효과라고 생각하십시오.IP 주소가 위조되거나 중간자 공격이 발생하면 웹 사이트 전체가 악용될 수 있습니다.
리모트 입력은 부터 끝까지 .처음부터 까지 추적해 주세요.$_SERVER,$_GET,$_POST,$_FILE,$_COOKIE,include(some remote file)(만일 경우) allow_url_fopen하는 기타 , 또는 기능/모듈, 또는 기능/모듈이 켜져 있습니다.사용자가 지정한 값 또는 리모트로 지정한 값의 스택트레이스 프로파일을 프로그래밍 방식으로 작성합니다.이는 할당된 변수의 모든 반복 인스턴스 및 변수에서 사용되는 함수 또는 메서드를 가져온 다음 해당 함수/메서드의 모든 발생 목록을 반복적으로 컴파일하는 방식으로 프로그램적으로 수행할 수 있습니다.먼저 터치하는 다른 모든 기능에 대해 적절한 필터링 및 검증 기능을 수행하는지 확인합니다.으로 하는입니다. 입니다.이치casePHP의 기능 및 메서드 수와 동일한 스위치(사용자 정의 포함)입니다.
또는 사용자 입력만 처리하는 경우에는 모든 스크립트의 선두에서 스태틱컨트롤러 클래스를 초기화하여 1)사용자가 제공한 모든 입력값을 허용목적의 화이트리스트와 대조하여 검증 및 저장한다.2) 입력원(즉,$_SERVER = null나제스크
다음은 보안상의 이유로 프로바이더가 비활성화한 기능의 목록입니다.
- 이그제큐티브
- dl
- show_source
- apache_주의
- apache_setenv
- 클로즈 로그
- 디버거_오프
- 디버거_on
- define_filename_filename
- 이스케이블러
- 이스셸cmd
- ini_restore
- 오픈 로그
- 패스스루
- 손실하다
- pcntl_exec
- 팝업
- proc_close
- proc_get_status
- proc_nice
- proc_open
- proc_module
- 셸_exec
- syslog
- 시스템.
- url_exec
코드 내 대부분의 공격은 여러 액세스소스 또는 여러 단계를 사용하여 자체적으로 실행됩니다.악성코드가 있는 코드나 메서드뿐만 아니라 모든 메서드, 함수를 실행하거나 호출하는 방법을 검색합니다.최상의 보안에는 폼 데이터가 들어오고 나갈 때 인코딩 및 검증도 포함됩니다.
시스템 변수를 정의하는 것도 주의해 주세요.이러한 변수는 나중에 코드의 함수 또는 메서드에서 호출할 수 있습니다.
텍스트를 해석하는 4비트 문자 함수를 사용하여 몇 가지 버퍼 오버플로우가 발견되었습니다.htmlentity() htmlspecialchars()
mb_syslog_syslog()를 사용하여 해석 전에 단일 인코딩으로 변환하는 것이 좋습니다.
PHP 백도어를 검출하는 PHP 어플리케이션의 취약성에 대한 정적 소스 코드 분석기 RIPS /config/sinks.php에서 지속적으로 갱신되는 중요한 싱크(사용 가능한 php 함수) 및 파라미터 목록을 찾을 수 있습니다.
언급URL : https://stackoverflow.com/questions/3115559/exploitable-php-functions
'programing' 카테고리의 다른 글
| 오류 해석 오류: 구문 오류, 예기치 않은 T_STRING, T_CONSTANT_ENCEPHED_STRING이 필요합니다. (0) | 2023.02.07 |
|---|---|
| 문자열을 카본으로 변환 (0) | 2023.02.03 |
| @staticmethod와 @classmethod의 차이점 (0) | 2023.02.03 |
| OPTIMISE TABLE을 실행하여 테이블 조각 모음으로 퍼포먼스 향상 (0) | 2023.02.03 |
| JavaScript:사용자 브라우저가 Chrome인지 확인하는 방법 (0) | 2023.02.03 |