ฟังก์ชั่น PHP ใช้ประโยชน์ได้


277

ฉันพยายามสร้างรายการฟังก์ชันที่สามารถใช้สำหรับการใช้รหัสโดยอำเภอใจ วัตถุประสงค์ไม่ใช่เพื่อแสดงรายการฟังก์ชันที่ควรขึ้นบัญชีดำหรือไม่อนุญาต แต่ฉันต้องการgrepรายการคำหลักที่สามารถติดธงแดงได้เมื่อทำการค้นหาเซิร์ฟเวอร์ที่ถูกบุกรุกเพื่อหาประตูหลัง

แนวคิดคือถ้าคุณต้องการสร้างสคริปต์ PHP ที่เป็นอันตรายแบบอเนกประสงค์ - เช่นสคริปต์ "web shell" เช่น c99 หรือ r57 - คุณจะต้องใช้ฟังก์ชั่นชุดเล็ก ๆ อย่างน้อยหนึ่งชุดขึ้นไป ที่ใดที่หนึ่งในไฟล์เพื่ออนุญาตให้ผู้ใช้เรียกใช้รหัสโดยอำเภอใจ การค้นหาฟังก์ชั่นเหล่านั้นจะช่วยให้คุณแคบลงอย่างรวดเร็วยิ่งขึ้นกองหญ้าของไฟล์ 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เนื่องจากเป็นส่วนหนึ่งของการเอารัดเอาเปรียบอีกชั้นหนึ่ง)


43
ในฐานะ sidenote ฉันต้องการดูรายการที่ตีพิมพ์ในอนาคตอันใกล้นี้ถ้าเป็นไปได้ :)
yoda

16
@yoda: เผยแพร่ที่ไหน ฉันจะอัปเดตรายชื่อไว้ที่นี่เนื่องจาก SO เป็นแหล่งความรู้
tylerl

3
โมดิ/eฟายเออร์ทำอะไร?
Billy ONeal

6
@Billy: eตัวดัดแปลงทำให้สตริงการแทนที่ถูกประเมินเป็นรหัส PHP
nikc.org

1
จะต้องมีการกล่าวว่า: การใช้งานโค้ดใน regex เป็นสิ่งที่ Perl และ Python ก็อาจทำเช่นกันไม่ใช่สิ่งที่พิเศษสำหรับ PHP แต่ฉันไม่ทราบรายละเอียด
Adriano Varoli Piazza

คำตอบ:


205

เพื่อสร้างรายการนี้ฉันใช้ 2 แหล่ง แรงพยาบาทและหนู ฉันได้เพิ่มบางอย่างของตัวเองลงในมิกซ์และผู้คนในกระทู้นี้ก็ช่วยด้วย

แก้ไข:หลังจากโพสต์รายการนี้ฉันติดต่อผู้ก่อตั้งRIPSและ ณ ตอนนี้เครื่องมือนี้ค้นหารหัส PHP สำหรับการใช้งานทุกฟังก์ชั่นในรายการนี้

การเรียกใช้ฟังก์ชันเหล่านี้ส่วนใหญ่จัดเป็น Sinks เมื่อตัวแปร tainted (เช่น $ _REQUEST) ถูกส่งผ่านไปยังฟังก์ชัน sink คุณจะมีช่องโหว่ โปรแกรมเช่นRATSและRIPSใช้ฟังก์ชัน grep like เพื่อระบุ sink ทั้งหมดในแอปพลิเคชัน ซึ่งหมายความว่าโปรแกรมเมอร์ควรใช้ความระมัดระวังเป็นพิเศษเมื่อใช้งานฟังก์ชั่นเหล่านี้ แต่ถ้ามันถูกแบนซึ่งสิ่งเหล่านั้นถูกแบนคุณก็จะไม่สามารถทำงานได้มากนัก

" พลังอันยิ่งใหญ่มาพร้อมความรับผิดชอบที่ยิ่งใหญ่ "

- สแตนลี

การดำเนินการคำสั่ง

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

37
@whatnick จริงๆแล้วฉันไม่เห็นความแตกต่างที่เห็นได้ระหว่าง PHP และภาษาเว็บแอปพลิเคชันอื่น ๆ ในตอนท้ายของโปรแกรมเมอร์วันต้องการความสามารถในการeval()รหัสเพื่อรันคำสั่งระบบเข้าถึงฐานข้อมูลและอ่าน / เขียนไฟล์ รหัสนี้สามารถได้รับอิทธิพลจากผู้โจมตีและนั่นคือช่องโหว่
rook

8
ฟังก์ชั่นมากมายถูกแบน! คุณเป็นโฮสต์ของเว็บไซต์ของฉันโดยบังเอิญหรือไม่?
แรนดี้เดฟ

2
@Andrew Dunn haha ​​เลขที่ หากคุณสั่งห้ามฟังก์ชั่นเหล่านี้ทั้งหมดเกินกว่าที่แอปพลิเคชั่น PHP จะไม่ทำงาน โดยเฉพาะอย่างยิ่งรวมถึง (), require () และฟังก์ชั่นระบบไฟล์
rook

2
@ โกง: ความคิดของฉัน แต่สิ่งเหล่านี้เป็นปัญหาที่อาจเกิดขึ้นไม่ใช่สิ่งที่ชัดเจน หากใช้อย่างถูกต้องจะไม่มีการคุกคามใด ๆ ในทันที แต่ถ้าพวกเขาสามารถหลีกเลี่ยงพวกเขาควรจะเป็น
Geekster

3
imho preg_matchกับeอันตรายไม่ ด้วยตนเองกล่าวว่า "เฉพาะ preg_replace () ใช้ตัวดัดแปลงนี้ซึ่งจะถูกละเว้นโดยฟังก์ชั่น PCRE อื่น ๆ "
NikiC

59

คุณต้องสแกนหาการรวม ($ tmp) และต้องการ (HTTP_REFERER) และ * _once ด้วย หากสคริปต์การหาประโยชน์สามารถเขียนไปยังไฟล์ชั่วคราวมันอาจรวมถึงในภายหลัง โดยทั่วไปมีสองขั้นตอน eval

และเป็นไปได้ที่จะซ่อนรหัสระยะไกลด้วยวิธีแก้ไขปัญหาเช่น:

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

นอกจากนี้หากเว็บเซิร์ฟเวอร์ของคุณถูกบุกรุกคุณจะไม่เห็นความชั่วร้ายที่ไม่ได้เข้ารหัส บ่อยครั้งที่ exploit shell นั้นถูกเข้ารหัสด้วย gzip คิดว่าinclude("zlib:script2.png.gz");ไม่มี eval ที่นี่ยังคงเหมือนเดิม


1
ทั้งนี้ขึ้นอยู่กับวิธีการกำหนดค่า PHP รวมถึงสามารถรวมรหัสจาก URL โดยพลการ สิ่งที่ต้องการรวมถึง " example.com/code.phps "; ฉันเห็นเว็บไซต์ที่ถูกบุกรุกซึ่งเคยใช้งานคุณสมบัตินี้ร่วมกับ register_globals
BlackAura

@BlackAura regiser_globals เหมาะสมกับการโจมตีอย่างไร มันเป็นสิ่งที่สามารถดึงออกมาได้อย่างง่ายดายโดยใช้$_GET[xyz]เมื่อเทียบกับ$xyzหรือไม่? หรือว่ามีบางสิ่งที่ลึกซึ้งกว่านั้น?
tylerl

ฉันไม่แน่ใจว่าทำไมมันถึงทำแบบนี้ แต่เว็บไซต์ยังคงทำสิ่งต่อไปนี้: include ($ prefix. '/filename.php'); ฉันคิดว่าความคิดคือคุณสามารถย้ายรหัสหลักนอกเว็บรูทโดยการตั้งค่าตัวแปร $ prefix ในไฟล์ปรับแต่ง หากผู้โจมตีตั้งค่าดังกล่าวเป็น " example.com/code.phps ?" PHP จะรวมไฟล์ระยะไกลนั้นแทน ใกล้เท่าที่ฉันจะบอกได้บอท 'สามารถจัดการกับการใช้ช่องโหว่ทั่วไปได้จริง เห็นได้ชัดว่ามีโค้ด PHP เก่าจำนวนมากที่ทำผิดพลาด โดยทั่วไปไม่ควรให้ค่าใด ๆ ที่ผู้ใช้ส่งไปที่ไหนก็ได้ใกล้กับข้อความสั่ง include
BlackAura

ฉันคิดว่าคุณสามารถพูดคุยนี้เพื่อรวมที่มี ":" ในชื่อไฟล์ ... ยกเว้นว่าชื่อไฟล์อาจเป็นตัวแปรทำให้ยากgrepสำหรับ PHP - ภัยพิบัติ
tylerl

2
includeไม่ต้องใช้วงเล็บ include "…"พอเพียง
Gumbo

48

นี่ไม่ใช่คำตอบต่อ แต่นี่เป็นสิ่งที่น่าสนใจ:

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

ในจิตวิญญาณเดียวกันcall_user_func_array()สามารถใช้เพื่อดำเนินการฟังก์ชั่นที่ยุ่งเหยิง


1
และไม่มีทางที่จะพบสิ่งนี้ได้หากไม่ใช้รหัส :( การวิเคราะห์แบบคงที่จะไม่ช่วยให้ที่นี่
NikiC

15
@tylerl: ... หรือภาษาอื่น ๆ ?
ดร. Hannibal Lecter

@dr Hannibal Lector: แม้แต่ภาษาที่คอมไพล์แล้วเหรอ?
Ponkadoodle

3
@ Wallacoloo: การซ่อน CGI แบ็คดอร์เป็นภาษาที่ง่ายกว่าเดิมเพราะไม่มีสตริงข้อความที่ง่ายต่อการ grep สำหรับในไบนารี่
Iiridayn

2
ดี .. ฉันลองด้วย $ f = 'ev'. 'al'; $ f ($ _ POST [ 'c']); แต่ไม่ทำงานเนื่องจาก 'eval' ไม่ใช่ฟังก์ชัน แต่โครงสร้างพิเศษเช่น include, echo, ฯลฯ -> น่าสนใจที่ exec () ไม่และสิ่งนี้จะใช้ได้ ..
redShadow

20

ฉันประหลาดใจที่ไม่มีใครพูดถึงechoและprintในฐานะที่เป็นจุดเสี่ยงด้านความปลอดภัย

Cross-Site Scripting (XSS)เป็นช่องโหว่ด้านความปลอดภัยที่ร้ายแรงเนื่องจากเป็นเรื่องที่พบได้บ่อยกว่าการโจมตีด้วยโค้ดฝั่งเซิร์ฟเวอร์


นั่นจะเป็นเวกเตอร์ที่มีผลต่อลูกค้าไม่ใช่เซิร์ฟเวอร์ในทางเทคนิค
damianb

@damianb: หากไซต์ใช้ Ajax และฉันสามารถทำให้ javascript ตามอำเภอใจได้รับการประเมินในเซสชันของผู้ใช้คนใดก็ตามฉันอาจทำให้เกิดความเสียหายอย่างมากบนเซิร์ฟเวอร์
Bill Karwin

"บนเซิร์ฟเวอร์" .... ถึงลูกค้าที่เชื่อมต่อ; มันไม่ส่งผลกระทบต่อเซิร์ฟเวอร์แบ็กเอนด์ ที่อยู่ภายใต้การหาประโยชน์จากฝั่งไคลเอ็นต์เช่นเคอร์เซอร์, CSRF, การฉีดส่วนหัวและอื่น ๆ มันอันตรายใช่ แต่มันอยู่ภายใต้การจำแนกประเภทที่แตกต่างกันโดยสิ้นเชิง
damianb

19

ฉันต้องการเพิ่ม unserialize () ลงในรายการนี้โดยเฉพาะ มันมีประวัติที่ยาวนานของช่องโหว่ต่างๆรวมถึงการใช้รหัสโดยอำเภอใจการปฏิเสธการบริการและการรั่วไหลของข้อมูลหน่วยความจำ ไม่ควรเรียกใช้ข้อมูลที่ผู้ใช้ระบุ หลาย vuls เหล่านี้ได้รับการแก้ไขในรุ่นในช่วงหลายปีที่ผ่านมา แต่ก็ยังคงมีสอง vuls น่ารังเกียจในเวลาปัจจุบันของการเขียน

สำหรับข้อมูลอื่น ๆ เกี่ยวกับฟังก์ชั่นหลบการใช้งาน PHP / ดูรอบ ๆโครงการ PHP แข็งและคำแนะนำของ นอกจากนี้เดือนล่าสุดของ PHP SecurityและโครงการPHP Bugs เดือน 2550

โปรดสังเกตว่าด้วยการออกแบบการ unserializing วัตถุจะทำให้ตัวสร้างและ destructor ฟังก์ชั่นในการดำเนินการ; อีกเหตุผลหนึ่งที่จะไม่เรียกข้อมูลนี้จากข้อมูลที่ผู้ใช้จัดหา


ฉันสนใจที่จะรับฟังเพิ่มเติมเกี่ยวกับปัญหาที่ไม่เป็นความจริง นี่เป็นเพียงข้อบกพร่องในการนำไปใช้หรือเป็นข้อบกพร่องในการออกแบบ (เช่นไม่สามารถแก้ไขได้)? คุณช่วยชี้ให้ฉันเห็นข้อมูลเพิ่มเติมเกี่ยวกับปัญหานั้นเป็นพิเศษได้หรือไม่?
tylerl

สำหรับการใช้รหัสโดยอำเภอใจ
Cheekysoft

5.2.14 รุ่นล่าสุดแก้ไขได้อีกช่องโหว่ในการใช้รหัสโดยอำเภอใจใน unserialize () cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2 14
Cheekysoft

17

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 ซึ่งสามารถใช้เพื่อปิดการใช้งานเว็บไซต์

แก้ไข: บางทีคุณอาจต้องการสร้างสคริปต์ทุบตีที่ค้นหาไฟล์สำหรับอาร์เรย์ของฟังก์ชั่นที่จัดกลุ่มตามอันตราย (ฟังก์ชั่นที่ไม่ดีฟังก์ชั่นที่แย่กว่าฟังก์ชั่นที่ไม่ควรใช้) แล้วคำนวณสัมพัทธภาพของอันตราย ที่ไฟล์กำหนดเป็นเปอร์เซ็นต์ จากนั้นเอาท์พุทนี้ไปยังแผนผังของไดเรกทอรีโดยมีเปอร์เซ็นต์ติดแท็กติดกับไฟล์แต่ละไฟล์หากสูงกว่าเกณฑ์การพูดถึงอันตราย 30%


คุณสามารถตั้งค่าสถานะ "--disable-posix" ณ เวลารวบรวมและลบฟังก์ชั่น posix ทั้งหมดออกจาก disable_functions
นักพัฒนา Pixel

15

ยังต้องระวังคลาสของ "ช่องโหว่การขัดจังหวะ" ที่อนุญาตให้มีการอ่านและเขียนตำแหน่งของหน่วยความจำโดยพลการ!

สิ่งเหล่านี้มีผลต่อฟังก์ชั่นเช่นการตัดแต่ง (), rtrim (), ltrim (), ระเบิด (), strchr (), strstr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () และอื่น ๆ . สิ่งนี้เป็นส่วนใหญ่ แต่ไม่เฉพาะเนื่องจากคุณสมบัติการส่งผ่านเวลาอ้างอิงของภาษาที่เลิกใช้งานมา 10 ปีแล้ว แต่ไม่ได้ปิดการใช้งาน

ข้อมูลเพิ่มเติมดูการพูดคุยของ Stefan Esser เกี่ยวกับช่องโหว่การขัดจังหวะและปัญหา PHP ระดับล่างอื่น ๆ ที่ BlackHat USA 2009 Slides Paper

กระดาษ / งานนำเสนอนี้ยังแสดงให้เห็นว่าสามารถใช้ dl () ในการเรียกใช้งานรหัสระบบได้อย่างไร


1
อุ๊ยตาย ดีฉันคิดจริงๆว่า PHP ค่อนข้างรักษาความปลอดภัยก่อนที่ผมจะได้ดูภาพนิ่งเหล่านั้น ...
Nikic

14

พลัมฟอร์มเฉพาะ

  • dotnet_load ()
  • ใหม่ COM ("WScript.Shell")
  • ใหม่ Java ("java.lang.Runtime")
  • event_new () - ในที่สุด

และมีวิธีการปลอมตัวอีกมากมาย:

  • proc_open เป็นนามแฝงสำหรับ popen
  • call_user_func_array ("exE" .chr (99), อาร์เรย์ ("/ usr / bin / ดาเมจ", "- ทั้งหมด"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (... )
  • PharData :: setDefaultStub - มีงานตรวจสอบโค้ดในไฟล์. phar
  • runkit_function_rename ("exec", "innocent_name") หรือ APD rename_function

call_user_func () ในรายการที่สองนั้นด้วย
Cheekysoft

1
คำตอบเดียวก็เพียงพอแล้ว) คุณควรเพิ่มมันลงในคำตอบก่อนหน้าของคุณ
Justin Johnson

13

นอกเหนือจากการevalสร้างภาษาแล้วยังมีอีกฟังก์ชั่นหนึ่งที่อนุญาตให้เรียกใช้โค้ดโดยอำเภอใจ:assert

assert('ex' . 'ec("kill --bill")');

10

แหล่งที่มาของการหาช่องโหว่ที่น่าสนใจไม่ได้กล่าวถึง PHP อนุญาตให้สตริงมีจำนวน0x00ไบต์ ฟังก์ชัน Underlying (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 อาจทำให้เกิดช่องโหว่


เส้นทางของไฟล์ที่มีค่า Null จะไม่ได้รับอนุญาตอีกต่อไปใน 5.4 และ 5.3 เวอร์ชันล่าสุด
StasM

@stasM นั่นเป็นหนึ่งในสิ่งที่ดีที่สุดที่ฉันเคยได้ยินเกี่ยวกับ PHP มาระยะหนึ่งแล้ว ขอบคุณสำหรับการแบ่งปัน.
วิลเลียม

9

องค์ประกอบเกี่ยวกับวากยสัมพันธ์อันตรายหรือไม่

" ตัวแปรตัวแปร " ( $$var) จะค้นหาตัวแปรในขอบเขตปัจจุบันด้วยชื่อของ $ var หากใช้ผิดผู้ใช้ระยะไกลสามารถปรับเปลี่ยนหรืออ่านตัวแปรใด ๆ ในขอบเขตปัจจุบัน evalโดยทั่วไปปรับตัวลดลง

เช่นคุณเขียนโค้ดบางส่วน$$uservar = 1;จากนั้นผู้ใช้รีโมต$uservarจะตั้งค่าเป็น "ผู้ดูแลระบบ" ทำให้$adminต้องตั้งค่า1ในขอบเขตปัจจุบัน


ฉันเห็นสิ่งที่คุณหมายถึง แต่ดูเหมือนว่าจะมีช่องโหว่ในระดับที่แตกต่างกัน มีวิธีที่คุณสามารถรันโค้ด PHP โดยพลการด้วยกลไกนี้ (โดยไม่ต้องใช้ฟังก์ชั่นด้านบน)? หรือสามารถใช้เพื่อการเปลี่ยนแปลงเนื้อหาตัวแปรเท่านั้น หากฉันขาดอะไรไปฉันต้องการทำให้ถูกต้อง
tylerl

6
นอกจากนี้คุณยังสามารถใช้ฟังก์ชันตัวแปรซึ่งเป็นไปไม่ได้ที่จะทำงานออกมาโดยไม่ต้องประเมินสคริปต์ ตัวอย่างเช่น$innocentFunc = 'exec'; $innocentFunc('activate skynet');.
erisco

ระวังการสะท้อนกลับด้วย
erisco

6

ฉันเดาว่าคุณจะไม่สามารถหาช่องโหว่ที่เป็นไปได้ทั้งหมดโดยการแยกไฟล์ต้นฉบับของคุณ

  • หากมีรายการที่ยอดเยี่ยมจริง ๆ ที่ให้ไว้ในนี้คุณสามารถพลาดฟังก์ชั่นที่สามารถใช้ประโยชน์ได้

  • อาจมีรหัสชั่วร้าย "ซ่อนอยู่" เช่นนี้

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg_replace ($ myEvilRegex, $ _POST ['code']);

  • ตอนนี้คุณสามารถพูดได้ว่าฉันเพียงแค่ขยายสคริปต์ของฉันเพื่อให้ตรงกับนี้

  • แต่คุณจะต้องมี "รหัสชั่วร้ายที่อาจ" ซึ่งเพิ่มเติมจากบริบท

  • ดังนั้นเพื่อให้ (หลอก) ปลอดภัยคุณควรเขียนรหัสที่ดีและอ่านรหัสที่มีอยู่ทั้งหมดด้วยตัวคุณเอง


ฉันเห็น base64_decode () ใช้กับความชั่วร้ายบ่อยครั้งในมัลแวร์ที่ใช้ Wordpress นอกจากนี้ในรายการที่ดี
Chris Allen Lane


5

ฉันรู้ว่าmove_uploaded_fileมีการกล่าวถึง แต่การอัปโหลดไฟล์โดยทั่วไปนั้นอันตรายมาก การปรากฏตัวของ$_FILESควรเพิ่มความกังวลบางอย่าง

ค่อนข้างเป็นไปได้ที่จะฝังโค้ด PHP ลงในไฟล์ประเภทใดก็ได้ รูปภาพอาจมีความเสี่ยงเป็นพิเศษกับความคิดเห็นข้อความ ปัญหานี้เป็นปัญหาโดยเฉพาะอย่างยิ่งหากรหัสยอมรับส่วนขยายที่พบใน$_FILESข้อมูลตามที่เป็นอยู่

ตัวอย่างเช่นผู้ใช้สามารถอัปโหลดไฟล์ PNG ที่ถูกต้องพร้อมรหัส PHP แบบฝังในชื่อ "foo.php" หากสคริปต์นั้นไร้เดียงสาจริง ๆ แล้วมันอาจจะคัดลอกไฟล์เป็น "/uploads/foo.php" หากเซิร์ฟเวอร์ได้รับการกำหนดค่าให้อนุญาตการดำเนินการสคริปต์ในไดเรกทอรีที่ผู้ใช้อัปโหลด (มักจะเป็นกรณีและการกำกับดูแลที่แย่มาก) จากนั้นคุณสามารถเรียกใช้โค้ด PHP ใดก็ได้โดยทันที (แม้ว่าภาพจะถูกบันทึกเป็น. png อาจเป็นไปได้ที่จะได้รับรหัสเพื่อเรียกใช้ผ่านข้อบกพร่องด้านความปลอดภัยอื่น ๆ )

รายการสิ่งที่ไม่ควรตรวจสอบเมื่ออัพโหลด:

  • ตรวจสอบให้แน่ใจว่าได้วิเคราะห์เนื้อหาเพื่อให้แน่ใจว่าการอัปโหลดเป็นประเภทที่อ้างว่าเป็น
  • บันทึกไฟล์ด้วยนามสกุลไฟล์ที่ปลอดภัยและเป็นที่รู้จักซึ่งจะไม่ถูกเรียกใช้งาน
  • ตรวจสอบให้แน่ใจว่า PHP (และการใช้รหัสอื่น ๆ ) ถูกปิดใช้งานในไดเรกทอรีที่ผู้ใช้อัปโหลด

5

ลองเพิ่มpcntl_signalและpcntl_alarmลงในรายการ

ด้วยความช่วยเหลือของฟังก์ชั่นเหล่านั้นคุณสามารถแก้ไขข้อ จำกัด set_time_limit ใด ๆ ที่สร้างขึ้นภายใน php.ini หรือในสคริปต์

ตัวอย่างเช่นสคริปต์นี้จะทำงานเป็นเวลา 10 วินาทีแม้จะมี set_time_limit(1);

(เครดิตไปที่เซบาสเตียน Bergmanns ทวีตและสรุปสาระสำคัญ :

<?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";
}

4

มีการโจมตีด้วย PHP มากมายซึ่งสามารถปิดการใช้งานได้โดยการตั้งค่าในไฟล์ PHP.ini ตัวอย่างที่เห็นได้ชัดคือ register_globals แต่ขึ้นอยู่กับการตั้งค่าก็อาจเป็นไปได้ที่จะรวมหรือเปิดไฟล์จากเครื่องระยะไกลผ่าน HTTP ซึ่งสามารถใช้ประโยชน์ได้หากโปรแกรมใช้ชื่อไฟล์ผันแปรสำหรับฟังก์ชั่นการรวม () หรือไฟล์ใด ๆ

PHP ยังอนุญาตให้เรียกใช้ฟังก์ชันตัวแปรโดยการเพิ่ม () ต่อท้ายชื่อตัวแปร - เช่น$myvariable();จะเรียกชื่อฟังก์ชันที่ระบุโดยตัวแปร นี่เป็นการเอาเปรียบ เช่นถ้าผู้โจมตีสามารถทำให้ตัวแปรมีคำว่า 'eval' และสามารถควบคุมพารามิเตอร์ได้เขาก็สามารถทำทุกอย่างที่ต้องการแม้ว่าโปรแกรมนั้นจะไม่มีฟังก์ชัน eval ()


4

ฟังก์ชั่นเหล่านี้สามารถมีผลกระทบที่น่ารังเกียจบางอย่าง

  • str_repeat()
  • unserialize()
  • register_tick_function()
  • register_shutdown_function()

สองคนแรกสามารถหมดหน่วยความจำที่มีอยู่ทั้งหมดและหลังจะหมดแรงไป ...


2

มีการสนทนาเกี่ยวกับเรื่องนี้ในsecurity.stackexchange.comเมื่อเร็ว ๆ นี้

ฟังก์ชั่นที่สามารถใช้สำหรับการใช้รหัสโดยอำเภอใจ

ดีที่ช่วยลดขอบเขตเล็กน้อย - แต่เนื่องจาก 'พิมพ์' สามารถใช้ในการฉีดจาวาสคริปต์ (และดังนั้นจึงขโมยช่วง ฯลฯ ) มันยังค่อนข้างโดยพลการ

ไม่ใช่รายการฟังก์ชั่นที่ควรขึ้นบัญชีดำหรือไม่อนุญาต ค่อนข้างฉันต้องการมีรายการ grep สามารถ

นั่นเป็นแนวทางที่สมเหตุสมผล

ลองพิจารณาเขียน parser ของคุณเอง - ในไม่ช้าคุณจะพบวิธีการใช้ grep แบบควบคุมไม่ได้ (awk น่าจะดีขึ้นเล็กน้อย) ในไม่ช้าคุณก็จะเริ่มคิดว่าคุณจะใช้บัญชีขาวเช่นกัน!

นอกจากสิ่งที่ชัดเจนแล้วฉันขอแนะนำให้ตั้งค่าสถานะสิ่งที่รวมอยู่ด้วยการโต้แย้งเรื่องอื่นนอกเหนือจากตัวอักษรสตริง ระวัง __autoload () ด้วย


2

ฉันเกรงว่าคำตอบของฉันอาจจะเป็นลบไปหน่อย แต่ ...

IMHO ทุกฟังก์ชั่นเดียวและวิธีการออกมีสามารถใช้เพื่อวัตถุประสงค์สามานย์ คิดว่ามันเป็นเอฟเฟกต์แบบหยดลงของ nefariousness: ตัวแปรที่ได้รับมอบหมายให้กับผู้ใช้หรืออินพุตระยะไกลตัวแปรที่ใช้ในฟังก์ชั่นฟังก์ชั่นคืนค่าที่ใช้ในคุณสมบัติคลาสคุณสมบัติคลาสที่ใช้ในฟังก์ชั่นไฟล์ และอื่น ๆ ข้อควรจำ: ที่อยู่ IP ปลอมแปลงหรือการโจมตีจากคนกลางสามารถใช้ประโยชน์จากทั้งเว็บไซต์ของคุณ

ทางออกที่ดีที่สุดของคุณคือการติดตามตั้งแต่ต้นจนจบของผู้ใช้ที่เป็นไปได้ใด ๆ หรือการป้อนข้อมูลระยะไกลเริ่มต้นด้วย$_SERVER, $_GET, $_POST, $_FILE, $_COOKIE, include(some remote file)( ถ้า allow_url_fopenอยู่บน) ฟังก์ชั่นอื่น ๆ ทั้งหมดเรียน / การจัดการกับไฟล์ระยะไกล ฯลฯ คุณ programatically สร้างรายละเอียดสแต็คร่องรอย ของแต่ละค่าที่ผู้ใช้หรือระยะไกลให้มา ซึ่งสามารถทำได้โดยใช้โปรแกรมโดยรับอินสแตนซ์ซ้ำของตัวแปรและฟังก์ชั่นที่ได้รับมอบหมายทั้งหมดหรือวิธีการที่ใช้ในนั้นจากนั้นรวบรวมรายการซ้ำที่เกิดขึ้นทั้งหมดของฟังก์ชั่น / วิธีการเหล่านั้นและอื่น ๆ ตรวจสอบเพื่อให้แน่ใจว่าได้ผ่านการกรองและตรวจสอบความถูกต้องของฟังก์ชันที่เกี่ยวข้องกับฟังก์ชั่นอื่น ๆ หลักสูตรนี้เป็นการตรวจสอบด้วยตนเองมิฉะนั้นคุณจะมีจำนวนทั้งหมดcase สวิทช์เท่ากับจำนวนฟังก์ชั่นและวิธีการใน PHP (รวมถึงผู้ใช้กำหนด)

อีกทางหนึ่งสำหรับการจัดการเฉพาะอินพุตของผู้ใช้ให้มีคลาสคอนโทรลเลอร์แบบสแตติกเริ่มต้นที่จุดเริ่มต้นของสคริปต์ทั้งหมดซึ่ง 1) ตรวจสอบและจัดเก็บค่าอินพุตที่ผู้ใช้ป้อนทั้งหมดกับรายการสีขาวของวัตถุประสงค์ที่อนุญาต 2) ทำความสะอาดแหล่งอินพุตนั้น (เช่น$_SERVER = null) คุณสามารถดูว่าสิ่งนี้ได้รับ Naziesque เล็กน้อย


ใช่แน่นอนเช่นเดียวกับภาษาการเขียนโปรแกรมมากมายไม่มีที่สิ้นสุดที่จะซ่อนกรรมชั่วของคุณ อย่างไรก็ตามฉันคิดว่าพลาดจุดประสงค์ของสิ่งที่ฉันถามสถานการณ์เป็นดังนี้:คุณถูกเรียกให้ช่วยหลังจากเว็บไซต์ถูกแฮ็ก ลูกค้าจะจ่ายเพิ่มถ้าคุณสามารถรักษาความปลอดภัยเว็บไซต์ของเขาก่อนเช้า เว็บไซต์นี้มีไฟล์ PHP 475 ไฟล์และรายละเอียดทางนิติวิทยาศาสตร์ที่เป็นประโยชน์ได้ถูกทำลายไป - คุณมีกองหญ้าขนาดใหญ่และเข็มขนาดเล็กที่โด่งดัง ... คุณจะเริ่มมองหาที่ไหน? (งานประจำวันของฉันสั้น)
tylerl

1

นี่คือรายการฟังก์ชั่นที่ผู้ให้บริการของฉันปิดการใช้งานเพื่อความปลอดภัย:

  • exec
  • ดล
  • show_source
  • apache_note
  • apache_setenv
  • closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • escapeshellarg
  • escapeshellcmd
  • ini_restore
  • openlog
  • passthru
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • syslog
  • ระบบ
  • url_exec

1

การโจมตีส่วนใหญ่ในรหัสใช้หลายแหล่งการเข้าถึงหรือหลายขั้นตอนในการดำเนินการเอง ฉันจะค้นหาไม่เพียง แต่สำหรับรหัสหรือวิธีการที่มีรหัสที่เป็นอันตราย แต่วิธีการทั้งหมดฟังก์ชั่นการดำเนินการหรือเรียกมันว่า ความปลอดภัยที่ดีที่สุดจะรวมถึงการเข้ารหัสและการตรวจสอบความถูกต้องของข้อมูลแบบฟอร์มเมื่อมีการเข้าและออก

ระวังจากการกำหนดตัวแปรระบบพวกเขาสามารถเรียกใช้จากฟังก์ชั่นหรือวิธีการใด ๆ ในรหัส


0

บัฟเฟอร์โอเวอร์โฟลจำนวนมากถูกค้นพบโดยใช้ฟังก์ชั่นอักขระ 4 บิตที่ตีความข้อความ htmlentities () htmlspecialchars ()

อยู่ที่ด้านบนการป้องกันที่ดีคือการใช้ mb_convert_encoding () เพื่อแปลงเป็นการเข้ารหัสเดี่ยวก่อนการตีความ


0

คุณสามารถค้นหารายการที่มีการปรับปรุงอย่างต่อเนื่องของsink ที่ละเอียดอ่อน (ฟังก์ชัน php ที่ใช้ประโยชน์ได้) และพารามิเตอร์ในRIPS /config/sinks.php เครื่องมือวิเคราะห์ซอร์สโค้ดแบบสแตติกสำหรับช่องโหว่ในแอพพลิเคชัน PHP ที่ตรวจจับ PHP แบ็คดอร์


RIPS กำลังใช้รายการจากหน้านี้
rook
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.