
CVE-2025-22131용 PoC
CVE-2025-22131에 대한 PoC
PhpSpreadsheet는 순수 PHP로 작성된 라이브러리로, Excel 및 LibreOffice Calc와 같은 다양한 스프레드시트 파일 형식을 읽고 쓸 수 있는 클래스 모음을 제공합니다.
phpspreadsheet 버전 <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 은 시트 이름이 제대로 삭제(sanitize)되지 않아 XSS로 이어지는 취약점의 영향을 받습니다.
시트가 2개 이상인 간단한 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을 주입할 수 있습니다.
이 코드는 시트가 2개 이상일 때만 실행되므로 시트가 2개 이상인 xlsx 파일이 필요합니다.
PoC에서는 이미지 태그를 사용하여 피해자의 쿠키를 공격자의 URL로 탈취합니다.