วิธีตรวจสอบว่า php ของผู้ใช้ใช้งานเป็นอย่างไร?


116

ฉันต้องการตรวจสอบว่า php ทำงานโดยไม่มีใคร ฉันต้องทำอย่างไร

มีชื่ออื่นสำหรับ "ไม่มีใคร" หรือไม่? "อาปาเช่"? คนอื่น ๆ ?


คุณหมายความว่าอย่างไรกับคำถาม "มีชื่ออื่น" หรือไม่ Sysadmins สามารถสร้างผู้ใช้ด้วยชื่อใดก็ได้ที่ต้องการ
ÁlvaroGonzález

ชื่อเริ่มต้นอื่น ๆ สำหรับสิ่งใดก็ตามที่อาจถือว่าเป็นเซิร์ฟเวอร์ apache ไม่มีใคร www-data ฯลฯ ..
Wesley

1
หากฉันจำได้อย่างถูกต้องผู้ใช้ระบบมักจะมี UID ขนาดเล็ก (ต่ำกว่า 1024?) นั่นอาจเป็นเบาะแสที่ดีกว่าสำหรับสิ่งที่คุณพยายามทำให้สำเร็จ
ÁlvaroGonzález


9
get_current_user () ส่งคืนเจ้าของสคริปต์ปัจจุบันไม่ใช่ php ของผู้ใช้กำลังทำงานอยู่
Dima L.

คำตอบ:


85

ถ้ามีคุณสามารถตรวจสอบบัญชีผู้ใช้ในปัจจุบันมีแล้วได้รับชื่อผู้ใช้ด้วยposix_geteuid posix_getpwuid

$username = posix_getpwuid(posix_geteuid())['name'];

อย่างไรก็ตามหากคุณกำลังทำงานในเซฟโหมด (ซึ่งมักเป็นกรณีปิดการใช้งาน exec) ก็ไม่น่าเป็นไปได้ที่กระบวนการ PHP ของคุณจะทำงานภายใต้อะไรก็ตามนอกจากค่าเริ่มต้นwww-dataหรือapacheบัญชี


10
มีความคิดเห็นในget_current_user()manpageที่แสดงแนวทางนี้ สำหรับ PHP 5.4 สามารถย่อให้สั้นลงได้:print posix_getpwuid(posix_geteuid())['name'];
Palec

211

<?php echo exec('whoami'); ?>


1
ไม่สามารถใช้ exec หรือ system หรือฟังก์ชัน passthru ดังกล่าวได้จริงๆ
Wesley

เป็นเพียงสิ่งที่ฉันต้องการ get_current_user () ไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน
dgig

5
อาจเป็นประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่งคุณจะได้รับผู้ใช้ที่รันคำสั่งไม่ใช่ผู้ใช้ PHP
Bram Vanroy

@BramVanroy แล้วคุณควรเรียกใช้มันที่ไหน? = |
Andrew

@BramVanroy - ฉันอยากเข้าใจความคิดเห็นของคุณ แต่ฉันไม่เข้าใจ ถ้าคุณเรียกใช้จาก cli คุณไม่ใช่ใครเป็นเจ้าของกระบวนการ php ปัจจุบัน? ผู้ใช้ PHP ในกรณีนี้จะเป็นใครนอกจากคุณ?
billynoah

72

แบบย้อนกลับ แต่ไม่มีผู้บริหาร / ระบบ:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

หากคุณสร้างไฟล์เจ้าของจะเป็นผู้ใช้ PHP

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


2
โซลูชันข้ามแพลตฟอร์มที่ชาญฉลาดมาก Boh!
Matt Fletcher

3
Nice: โซลูชันเดียวที่ไม่ได้รับสิทธิพิเศษที่นี่เพื่อค้นหากลุ่มที่ PHP กำลังทำงานอยู่
tanius

2
แฮ็คที่คุ้มค่าสมควรได้รับตำแหน่งที่สูงกว่า
อับราฮัมฟิลิป

1
@RavinderPayal เว้นแต่คุณจะใช้ฟังก์ชัน tempnam เหมือนที่ฉันแนะนำ เกือบจะรับประกันได้ว่าผู้ใช้สามารถเขียนลงในไดเร็กทอรีชั่วคราวได้ไม่ว่าจะเป็นใครก็ตาม หากไม่สามารถเขียนลงในไดเร็กทอรีชั่วคราวคุณสามารถให้สิทธิ์โฟลเดอร์ 777 ชั่วคราวและหากเปิดใช้งานให้ปิดการใช้งาน Selinux สำหรับพา ธ นั้น
Jonathan Kuhn

1
@RavinderPayal มีฟังก์ชันเพิ่มเติมในการส่งคืนเส้นทางชั่วคราว ดังนั้น$temp_file = tempnam(sys_get_temp_dir(), 'TMP');จะสร้างไฟล์ชั่วคราวในไดเร็กทอรี temp บนระบบส่วนใหญ่ จากนั้นคุณสามารถใช้ไฟล์นั้นเพื่อรับผู้ใช้ / กลุ่ม ฉันทิ้งบางส่วนไว้ให้ผู้ใช้คิดออก
Jonathan Kuhn

20

รายละเอียดเพิ่มเติมจะเป็นประโยชน์ แต่สมมติว่าเป็นระบบ linux และสมมติว่า php ทำงานภายใต้ apache มันจะทำงานตามที่ผู้ใช้ apache เคยรัน

วิธีง่ายๆในการตรวจสอบ (อีกครั้งโดยสมมติว่ามีสภาพแวดล้อมเหมือนยูนิกซ์) คือการสร้างไฟล์ php ด้วย

<?php
    print shell_exec( 'whoami' );
?>

ซึ่งจะให้คุณแก่ผู้ใช้

สำหรับอินสแตนซ์ AWS ของฉันฉันได้รับapacheผลลัพธ์เมื่อเรียกใช้สคริปต์นี้


16

คุณสามารถลองใช้ backticks ดังนี้:

echo `whoami`;

7
เป็นเพียงคำถามที่ซ้ำกันข้างต้น
volter9

2
อาจเป็นประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่งคุณจะได้รับผู้ใช้ที่รันคำสั่งไม่ใช่ผู้ใช้ PHP
Bram Vanroy

13

ฉันจะใช้:

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_

1
grep "APACHE_RUN_" /etc/apache2/envvarsทำงานได้ดีขอบคุณ
Tarik

11

exec('whoami') จะทำสิ่งนี้

<?php
echo exec('whoami');
?>

ไม่สามารถใช้ exec หรือ system หรือฟังก์ชัน passthru ดังกล่าวได้จริงๆ
Wesley

@ เวสลีย์: นั่นเป็นไปไม่ได้
กำเนิด

2
อาจเป็นประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่งคุณจะได้รับผู้ใช้ที่รันคำสั่งไม่ใช่ผู้ใช้ PHP
Bram Vanroy


1

เพิ่มไฟล์ info.php ไปยังไดเร็กทอรีต่อไปนี้ - ไดเร็กทอรี http / apache เริ่มต้นของคุณ - โดยปกติ / var / www / html

โดยมีเนื้อหาดังต่อไปนี้

<?php                                                                           
phpinfo();                                                                    
?>  

จากนั้น httpd / apache เริ่มต้นใหม่ไปที่ไดเรกทอรี html เริ่มต้นของคุณ http://enter.server.here/info.php

จะส่งสายเลือด php ทั้งหมด!


3
และตัวแปร / ค่าใดในผลลัพธ์นั้นที่เรากำลังมองหา?
Andrew

ฉันแน่ใจว่าคุณพบสิ่งนี้แล้ว แต่ค้นหา "ผู้ใช้" ในหน้านั้น?
CRTLBREAK

0

ในการตั้งค่าของฉันฉันต้องการตรวจสอบว่ากระบวนการปัจจุบันมีสิทธิ์ในการสร้างโฟลเดอร์โฟลเดอร์ย่อยและไฟล์หรือไม่ก่อนที่ฉันจะเริ่มดำเนินการและแนะนำวิธีแก้ไขหากดูเหมือนว่าฉันทำไม่ได้ ฉันต้องการเรียกใช้stat(<file>)สิ่งต่างๆเพื่อให้แน่ใจว่าสิทธิ์ตรงกับสิ่งเหล่านั้นของกระบวนการทำงาน (ฉันใช้ php-fpm ดังนั้นจึงแตกต่างกันไปขึ้นอยู่กับพูล)
โซลูชันที่ใช้ posix ที่ Mario ให้ไว้ข้างต้นดูเหมือนจะสมบูรณ์แบบ แต่ดูเหมือนว่าส่วนขยาย posix จะถูกปิดใช้งานดังนั้นฉันจึงไม่สามารถทำตามข้างต้นได้และฉันต้องการเปรียบเทียบผลลัพธ์กับการตอบสนองจากการรัน stat ()whoamiในเชลล์แยกต่างหาก ก็ไม่มีประโยชน์เช่นกัน (ฉันต้องการ uid และ gid ไม่ใช่ชื่อผู้ใช้)

อย่างไรก็ตามฉันพบคำใบ้ที่เป็นประโยชน์ฉันทำได้stat(/proc/self)และstat(/proc/self/attr)และดู uid และ gid ของไฟล์

หวังว่าจะช่วยคนอื่น


0

คุณสามารถใช้คำสั่งเหล่านี้:

<? system('whoami');?>

หรือ

<? passthru('whoami');?>

หรือ

<? print exec('whoami');?>

หรือ

<? print shell_exec('whoami');?>

หรือ

<? print get_current_user();?>

get_current_user () ไม่ส่งคืนผู้ใช้ปัจจุบัน ส่งคืนเจ้าของสคริปต์ที่ฟังก์ชันถูกเรียก
andsens

-1

ฉันมักจะใช้

<?php echo get_current_user(); ?>

ฉันจะดีใจถ้ามันช่วยคุณได้


สิ่งนี้ได้รับการกล่าวถึงแล้วในความคิดเห็นภายใต้คำถามและมีส่วนเกี่ยวข้องกับผู้ใช้เพียงเล็กน้อยที่สคริปต์กำลังทำงานอยู่
Palec

get_current_user() - Gets the name of the owner of the current PHP script- ไม่ใช่ผู้ใช้ที่เรียกใช้กระบวนการ PHP
Francisco Zarabozo


-1

ข้อเสนอ

ช้าไปหน่อย แต่แม้ว่าสิ่งต่อไปนี้จะเป็นวิธีแก้ปัญหา แต่ก็สามารถแก้ไขข้อกำหนดได้เนื่องจากใช้งานได้ดี:

<?
    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()ใส่สิ่งนี้ลงในสคริปต์ที่กำลังรันอยู่มันจะส่งคืนเหมือนกับสคริปต์หลักตามที่กล่าวไว้ ดังนั้นเราจำเป็นต้องเรียกใช้เป็นคำขอแยกต่างหากเพื่อให้มีผล

กระบวนการไหล

เพื่อให้สิ่งนี้มีประสิทธิภาพให้พิจารณาเรียกใช้รูปแบบการออกแบบที่รวม "โหมดรันไทม์" ดังนั้นเมื่อเซิร์ฟเวอร์อยู่ใน "โหมดการพัฒนาหรือโหมดทดสอบ" ก็จะมีเพียงฟังก์ชันนี้เท่านั้นที่สามารถเรียกใช้ฟังก์ชันนี้และบันทึกผลลัพธ์ไว้ที่ใดที่หนึ่งในการรวม , - หรือเพียงแค่ข้อความธรรมดาหรือฐานข้อมูลหรืออย่างใดอย่างหนึ่ง

แน่นอนคุณสามารถเปลี่ยนรายละเอียดบางอย่างของโค้ดด้านบนได้ตามที่คุณต้องการเพื่อให้มีไดนามิกมากขึ้น แต่ตรรกะมีดังนี้:

  • กำหนดการอ้างอิงเฉพาะเพื่อ จำกัด การรบกวนกับผู้ใช้รายอื่น
  • กำหนดโลคัลไฟล์พา ธ สำหรับเขียนไฟล์ชั่วคราว
  • กำหนด url / path สาธารณะเพื่อเรียกใช้ไฟล์นี้ในกระบวนการของตนเอง
  • เขียนไฟล์ php ชั่วคราวที่ส่งออกชื่อเจ้าของสคริปต์
  • รับผลลัพธ์ของสคริปต์นี้โดยการร้องขอไป
  • ลบไฟล์ตามที่ไม่ต้องการอีกต่อไป - หรือปล่อยไว้หากคุณต้องการ
  • ส่งคืนผลลัพธ์ของคำขอเป็นค่าส่งกลับของฟังก์ชัน

-1
<?php phpinfo(); ?>

บันทึกเป็น info.php และ

เปิด info.php ในเบราว์เซอร์ของคุณ

ctrl + f จากนั้นพิมพ์สิ่งเหล่านี้:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

คุณสามารถเห็นผู้ใช้และกลุ่ม apache กำลังทำงานเป็น


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