
PoC لـ CVE-2025-22131
إثبات مفهوم (PoC) لـ CVE-2025-22131
PhpSpreadsheet هي مكتبة مكتوبة بلغة PHP خالصة وتوفر مجموعة من الفئات (classes) تتيح لك قراءة وكتابة تنسيقات ملفات جداول بيانات متنوعة مثل Excel و LibreOffice Calc.
الإصدار <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 من phpspreadsheet متأثر بثغرة حيث لا يتم تعقيم أسماء الأوراق بشكل صحيح، مما يؤدي إلى XSS.
أنشئ ملف xlsx بسيطًا يحتوي على أكثر من ورقة واحدة واحفظه.
فك ضغط الملف، وحدّث اسم الورقة يدويًا إلى حمولة XSS
أعد ضغط الملف مرة أخرى
ارفع ملف xlsx إلى الخادم المتأثر
استخرج ملف تعريف الارتباط الخاص بالضحية إلى عنوان URL المعطى
ملاحظة: استخدمت الحمولة لاستخراج ملف تعريف الارتباط الخاص بالضحية؛ إذا كان المطلوب شيئًا آخر، حدّث ملف xl/workbook.xml وفقًا لذلك.
/**
* Generate sheet tabs.
*/
public function generateNavigation(): string
{
// Fetch sheets
$sheets = [];
if ($this->sheetIndex === null) {
$sheets = $this->spreadsheet->getAllSheets();
} else {
$sheets[] = $this->spreadsheet->getSheet($this->sheetIndex);
}
// Construct HTML
$html = '';
// Only if there are more than 1 sheets
if (count($sheets) > 1) {
// Loop all sheets
$sheetId = 0;
$html .= '<ul class="navigation">' . PHP_EOL;
foreach ($sheets as $sheet) {
$html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL;
++$sheetId;
}
$html .= '</ul>' . PHP_EOL;
}
return $html;
}
هنا، لا يتم ترميز $sheet->getTitle() بشكل صحيح باستخدام htmlspecialchars()، ولهذا السبب يمكن للمهاجم حقن HTML.
لاحظ أن هذا الجزء من الكود يعمل فقط عندما يكون هناك أكثر من ورقة واحدة، لذلك من الضروري أن يكون لديك ملف xlsx يحتوي على أكثر من ورقة.
في الإثبات (PoC)، يتم استخدام وسم صورة (image tag) لاستخراج ملفات تعريف الارتباط الخاصة بالضحية إلى عنوان URL الخاص بالمهاجم.