ฉันต้องตรวจสอบว่า php ทำงานโดยไม่มีใครอยู่หรือไม่ ฉันจะทำอย่างไร?
มีชื่ออื่นสำหรับ "ไม่มีใคร" หรือไม่? “อาปาเช่”? มีคนอื่นอีกไหม?
ฉันต้องตรวจสอบว่า php ทำงานโดยไม่มีใครอยู่หรือไม่ ฉันจะทำอย่างไร?
มีชื่ออื่นสำหรับ "ไม่มีใคร" หรือไม่? “อาปาเช่”? มีคนอื่นอีกไหม?
หากมี คุณสามารถตรวจสอบบัญชีผู้ใช้ปัจจุบันด้วย posix_geteuid
จากนั้นรับชื่อผู้ใช้ด้วย posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
อย่างไรก็ตาม หากคุณกำลังทำงานในเซฟโหมด (ซึ่งมักเกิดขึ้นเมื่อปิดใช้งาน exec) ก็ไม่น่าเป็นไปได้ที่กระบวนการ PHP ของคุณจะทำงานภายใต้สิ่งใดๆ ยกเว้นบัญชีเริ่มต้น www-data
หรือ apache
get_current_user()
manpage ที่แสดงสิ่งนี้ เข้าใกล้. ใน PHP 5.4 สามารถย่อให้เหลือดังนี้: print posix_getpwuid(posix_geteuid())['name'];
- person Palec; 09.08.2015
เป็นแบบย้อนกลับ แต่ไม่มี exec/system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
หากคุณสร้างไฟล์ เจ้าของจะเป็นผู้ใช้ PHP
นอกจากนี้ยังสามารถเรียกใช้ฟังก์ชันไฟล์ชั่วคราวใดๆ เช่น tempnam()
ซึ่งสร้างไฟล์สุ่มในไฟล์ชั่วคราว ไดเร็กทอรีและส่งคืนชื่อของไฟล์นั้น หากมีปัญหาเนื่องจากบางอย่าง เช่น การอนุญาต open_basedir
หรือเซฟโหมดที่ทำให้ไม่สามารถเขียนไฟล์ได้ โดยทั่วไปแล้ว ไดเร็กทอรีชั่วคราวจะยังคงได้รับอนุญาตอยู่
php user
ที่มีหรือไม่ และในการให้สิทธิ์ในการเขียน คุณจะต้องทราบชื่อผู้ใช้ ซึ่งในทางปฏิบัติจะเป็นไปได้สำหรับโปรแกรมเมอร์ที่ลืม php user
หลังจากกำหนดสิทธิ์ในการเขียนแล้วเท่านั้น
- person Ravinder Payal; 23.04.2017
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
จะสร้างไฟล์ชั่วคราวในไดเร็กทอรีชั่วคราวบนระบบส่วนใหญ่ จากนั้นคุณสามารถใช้ไฟล์นั้นเพื่อรับผู้ใช้/กลุ่ม ฉันทิ้งบางส่วนไว้ให้กับผู้ใช้เพื่อหาคำตอบ
- person Jonathan Kuhn; 24.04.2017
รายละเอียดเพิ่มเติมจะมีประโยชน์ แต่สมมติว่าเป็นระบบ linux และสมมติว่า php ทำงานภายใต้ apache มันจะทำงานเหมือนกับที่ apache ของผู้ใช้เคยทำงาน
วิธีง่ายๆ ในการตรวจสอบ (อีกครั้งโดยสมมติว่ามีระบบปฏิบัติการยูนิกซ์เช่นสภาพแวดล้อม) คือการสร้างไฟล์ php ด้วย:
<?php
print shell_exec( 'whoami' );
?>
ซึ่งจะให้ผู้ใช้แก่คุณ
สำหรับอินสแตนซ์ AWS ของฉัน ฉันได้รับ apache
เป็นเอาต์พุตเมื่อฉันเรียกใช้สคริปต์นี้
คุณสามารถลองใช้ backticks เช่นนี้:
echo `whoami`;
ฉันจะใช้:
lsof -i
lsof -i | less
lsof -i | grep :http
สิ่งเหล่านี้ คุณสามารถพิมพ์ em ในบรรทัดคำสั่ง ssh ของคุณแล้วคุณจะเห็นว่าผู้ใช้รายใดกำลังฟังบริการใด
คุณสามารถไปตรวจสอบไฟล์นี้ได้:
more /etc/apache2/envvars
และมองหาบรรทัดเหล่านี้:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
เพื่อกรองข้อมูลไฟล์ envvars คุณสามารถใช้ grep:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
ทำงานได้ดี ขอบคุณ
- person Tarik; 26.10.2018
exec('whoami')
จะทำสิ่งนี้
<?php
echo exec('whoami');
?>
คุณสามารถรันได้โดยตรงจากเชลล์:
php -r "echo exec('whoami');"
เพิ่มไฟล์ info.php ลงในไดเร็กทอรีต่อไปนี้ - ไดเร็กทอรี http/apache เริ่มต้นของคุณ - ปกติ /var/www/html
โดยมีเนื้อหาดังต่อไปนี้
<?php
phpinfo();
?>
จากนั้น httpd/apache รีสตาร์ทไปที่ไดเร็กทอรี html เริ่มต้นของคุณ http://enter.server.here/info.php
จะส่งสายเลือด php ทั้งหมด!
ในการตั้งค่าของฉัน ฉันต้องการตรวจสอบว่ากระบวนการปัจจุบันมีสิทธิ์ในการสร้างโฟลเดอร์ โฟลเดอร์ย่อย และไฟล์หรือไม่ ก่อนที่จะเริ่มกระบวนการ และแนะนำวิธีแก้ปัญหาหากดูเหมือนว่าฉันทำไม่ได้ ฉันต้องการเรียกใช้ stat(<file>)
กับสิ่งต่าง ๆ เพื่อให้แน่ใจว่าการอนุญาตนั้นตรงกับกระบวนการที่ทำงานอยู่ (ฉันใช้ php-fpm ดังนั้นมันจึงแตกต่างกันไปขึ้นอยู่กับพูล)
อย่างไรก็ตามโซลูชันที่ใช้ posix ที่ Mario ให้ไว้ข้างต้นนั้นดูสมบูรณ์แบบ ดูเหมือนว่าส่วนขยาย posix คือ --disabled ดังนั้นฉันจึงไม่สามารถทำข้างต้นได้ และเนื่องจากฉันต้องการเปรียบเทียบผลลัพธ์กับการตอบสนองจากการรัน stat() การรัน whoami
ในเชลล์แยกต่างหากก็ไม่มีประโยชน์เช่นกัน (ฉันต้องการ uid และ gid ไม่ใช่ชื่อผู้ใช้)
อย่างไรก็ตาม ฉันพบคำแนะนำที่เป็นประโยชน์ ฉันสามารถ stat(/proc/self)
และ stat(/proc/self/attr)
และดู uid และ gid ของไฟล์ได้
หวังว่าจะช่วยคนอื่นได้
ฉันมักจะใช้
<?php echo get_current_user(); ?>
ฉันจะดีใจถ้ามันช่วยคุณ
get_current_user() - Gets the name of the owner of the current PHP script
- ไม่ใช่ ผู้ใช้ที่เรียกใช้กระบวนการ PHP
- person Francisco Zarabozo; 04.02.2017
ช้าไปหน่อย แต่ถึงแม้สิ่งต่อไปนี้จะเป็นวิธีแก้ปัญหา แต่ก็แก้ไขข้อกำหนดได้เนื่องจากทำงานได้ดี:
<?
function get_sys_usr()
{
$unique_name = uniqid(); // not-so-unique id
$native_path = "./temp/$unique_name.php";
$public_path = "http://example.com/temp/$unique_name.php";
$php_content = "<? echo get_current_user(); ?>";
$process_usr = "apache"; // fall-back
if (is_readable("./temp") && is_writable("./temp"))
{
file_put_contents($native_path,$php_content);
$process_usr = trim(file_get_contents($public_path));
unlink($native_path);
}
return $process_usr;
}
echo get_sys_usr(); // www-data
?>
การเน้นโค้ดด้านบนไม่ถูกต้อง โปรดคัดลอกและวางในโปรแกรมแก้ไขที่คุณชื่นชอบและดูเป็นโค้ด PHP หรือบันทึกและทดสอบด้วยตัวเอง
ดังที่คุณคงทราบแล้วว่า get_current_user()
ส่งคืนเจ้าของ "สคริปต์ที่กำลังทำงานอยู่ในปัจจุบัน" - ดังนั้นหากคุณไม่ได้ "chown" สคริปต์บนเซิร์ฟเวอร์ให้กับผู้ใช้เว็บเซิร์ฟเวอร์ สคริปต์นั้นอาจจะเป็น "ไม่มีใคร" หรือหากนักพัฒนา -user มีอยู่ในระบบปฏิบัติการเดียวกัน แต่จะแสดงชื่อผู้ใช้นั้นแทน
เพื่อแก้ไขปัญหานี้ เราสร้างไฟล์ที่มีกระบวนการทำงานอยู่ในปัจจุบัน หากคุณเพียงแค่ require()
สิ่งนี้ลงในสคริปต์ที่รันอยู่ในปัจจุบัน มันจะส่งคืนเหมือนกับสคริปต์หลักดังที่กล่าวไว้ ดังนั้นเราจึงต้องเรียกใช้เป็นคำขอแยกต่างหากจึงจะมีผล
เพื่อให้สิ่งนี้มีประสิทธิภาพ ให้พิจารณาเรียกใช้รูปแบบการออกแบบที่รวม "โหมดรันไทม์" ดังนั้นเมื่อเซิร์ฟเวอร์อยู่ใน "โหมดการพัฒนาหรือโหมดทดสอบ" จะมีเพียงเซิร์ฟเวอร์เท่านั้นที่สามารถเรียกใช้ฟังก์ชันนี้และบันทึกเอาต์พุตไว้ที่ใดที่หนึ่งในการรวม , -หรือเพียงข้อความธรรมดาหรือฐานข้อมูลหรืออย่างใดอย่างหนึ่ง
แน่นอนคุณสามารถเปลี่ยนรายละเอียดบางอย่างของโค้ดด้านบนได้ตามที่คุณต้องการเพื่อทำให้โค้ดมีความไดนามิกมากขึ้น แต่ตรรกะจะเป็นดังนี้:
<?php phpinfo(); ?>
บันทึกเป็น info.php และ
เปิด info.php ในเบราว์เซอร์ของคุณ
ctrl+f จากนั้นพิมพ์สิ่งใดสิ่งหนึ่งต่อไปนี้:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
คุณสามารถเห็นผู้ใช้และกลุ่ม apache กำลังทำงานอยู่
คุณสามารถใช้คำสั่งเหล่านี้:
<? system('whoami');?>
or
<? passthru('whoami');?>
or
<? print exec('whoami');?>
or
<? print shell_exec('whoami');?>
โปรดทราบว่า get_current_user()
ส่งคืนชื่อของเจ้าของสคริปต์ PHP ปัจจุบัน !
$user = $_SERVER['REMOTE_USER'];
ผู้ใช้ที่ได้รับการรับรองความถูกต้อง
echo $_SERVER["USER"];
ใช้งานได้ แต่ให้ชื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันใน SSH
- person Tarik; 26.10.2018