ฉันต้องการตรวจสอบว่า 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'];
<?php echo exec('whoami'); ?>
แบบย้อนกลับ แต่ไม่มีผู้บริหาร / ระบบ:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
หากคุณสร้างไฟล์เจ้าของจะเป็นผู้ใช้ PHP
สิ่งนี้อาจถูกเรียกใช้ด้วยฟังก์ชันไฟล์ชั่วคราวเช่นtempnam()
ซึ่งสร้างไฟล์แบบสุ่มในไดเร็กทอรีชั่วคราวและส่งคืนชื่อของไฟล์นั้น หากมีปัญหาเนื่องจากบางอย่างเช่นสิทธิ์open_basedir
หรือเซฟโหมดที่ป้องกันการเขียนไฟล์โดยทั่วไปไดเรกทอรีชั่วคราวจะยังคงได้รับอนุญาต
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
จะสร้างไฟล์ชั่วคราวในไดเร็กทอรี temp บนระบบส่วนใหญ่ จากนั้นคุณสามารถใช้ไฟล์นั้นเพื่อรับผู้ใช้ / กลุ่ม ฉันทิ้งบางส่วนไว้ให้ผู้ใช้คิดออก
รายละเอียดเพิ่มเติมจะเป็นประโยชน์ แต่สมมติว่าเป็นระบบ 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
ทำงานได้ดีขอบคุณ
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 จะถูกปิดใช้งานดังนั้นฉันจึงไม่สามารถทำตามข้างต้นได้และฉันต้องการเปรียบเทียบผลลัพธ์กับการตอบสนองจากการรัน stat ()whoami
ในเชลล์แยกต่างหาก ก็ไม่มีประโยชน์เช่นกัน (ฉันต้องการ uid และ gid ไม่ใช่ชื่อผู้ใช้)
อย่างไรก็ตามฉันพบคำใบ้ที่เป็นประโยชน์ฉันทำได้stat(/proc/self)
และstat(/proc/self/attr)
และดู uid และ gid ของไฟล์
หวังว่าจะช่วยคนอื่น
คุณสามารถใช้คำสั่งเหล่านี้:
<? system('whoami');?>
หรือ
<? passthru('whoami');?>
หรือ
<? print exec('whoami');?>
หรือ
<? print shell_exec('whoami');?>
หรือ
<? print get_current_user();?>
ฉันมักจะใช้
<?php echo get_current_user(); ?>
ฉันจะดีใจถ้ามันช่วยคุณได้
get_current_user() - Gets the name of the owner of the current PHP script
- ไม่ใช่ผู้ใช้ที่เรียกใช้กระบวนการ PHP
$_SERVER["USER"]
$_SERVER["USERNAME"]
echo $_SERVER["USER"];
ใช้งานได้ แต่ให้ชื่อผู้ใช้ที่ล็อกอินปัจจุบันใน SSH
ช้าไปหน่อย แต่แม้ว่าสิ่งต่อไปนี้จะเป็นวิธีแก้ปัญหา แต่ก็สามารถแก้ไขข้อกำหนดได้เนื่องจากใช้งานได้ดี:
<?
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()
ส่งคืนเจ้าของ "สคริปต์ที่กำลังทำงานอยู่" ดังนั้นหากคุณไม่ได้ "เรียก" สคริปต์บนเซิร์ฟเวอร์ไปยังผู้ใช้เว็บเซิร์ฟเวอร์ส่วนใหญ่อาจเป็น "ไม่มีใคร" หรือหากผู้พัฒนา - ผู้ใช้มีอยู่ในระบบปฏิบัติการเดียวกัน แต่จะแสดงชื่อผู้ใช้นั้น
ในการแก้ไขปัญหานี้เราสร้างไฟล์ด้วยกระบวนการที่กำลังทำงานอยู่ในปัจจุบัน หากคุณrequire()
ใส่สิ่งนี้ลงในสคริปต์ที่กำลังรันอยู่มันจะส่งคืนเหมือนกับสคริปต์หลักตามที่กล่าวไว้ ดังนั้นเราจำเป็นต้องเรียกใช้เป็นคำขอแยกต่างหากเพื่อให้มีผล
เพื่อให้สิ่งนี้มีประสิทธิภาพให้พิจารณาเรียกใช้รูปแบบการออกแบบที่รวม "โหมดรันไทม์" ดังนั้นเมื่อเซิร์ฟเวอร์อยู่ใน "โหมดการพัฒนาหรือโหมดทดสอบ" ก็จะมีเพียงฟังก์ชันนี้เท่านั้นที่สามารถเรียกใช้ฟังก์ชันนี้และบันทึกผลลัพธ์ไว้ที่ใดที่หนึ่งในการรวม , - หรือเพียงแค่ข้อความธรรมดาหรือฐานข้อมูลหรืออย่างใดอย่างหนึ่ง
แน่นอนคุณสามารถเปลี่ยนรายละเอียดบางอย่างของโค้ดด้านบนได้ตามที่คุณต้องการเพื่อให้มีไดนามิกมากขึ้น แต่ตรรกะมีดังนี้:
<?php phpinfo(); ?>
บันทึกเป็น info.php และ
เปิด info.php ในเบราว์เซอร์ของคุณ
ctrl + f จากนั้นพิมพ์สิ่งเหล่านี้:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
คุณสามารถเห็นผู้ใช้และกลุ่ม apache กำลังทำงานเป็น
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
ผู้ใช้ที่พิสูจน์ตัวตน