CDATA section is merely an alternative syntax for expressing character data; there is no semantic difference between character data in a CDATA section and character data in standard syntax where, for example, "<" and "&" are represented by "<" and "&", respectively.
所以说<![CDATA[...]]>内部的context不会被解析(正好在此拿来读源码)。
要拼接一个CDATA,我们应该这样,但是XML说明不允许在内部实体的声明中(&all;)中包含外部实体。( it is not permitted by the XML specification to include external entities in combination with internal entities.) [参考]。
吃瓜CTF(m0leCTF2020)里的一个Chall,日常签到观光...
首先映入眼帘的是主页,有一个小星星图片
注册->登录,然后我们来到了核心功能:
这里可以看到上传文件,还给了一个
template
,打开看看:Xml...上传试试:
发送呵呵哒星~
生成了一张图片
我们来访问一下 ![Uploading 截屏2020-05-27 下午1.24.27.png…]()
于是成了夜空中最闪耀的星~
既然可以
heheda
,那么就可以解析xml文件啰,开始尝试XXE: heheda进化->&heheda; ![Uploading 截屏2020-05-27 下午1.35.36.png…]()这里就构造了xml实体攻击, 实体,我的理解是描述字符的字符。类比html中的实体,如
<p>he heda</p>
,html解析器会将其解析成<p>he heda</p>
,同样的,在xml中,除了字符实体,我们还 还可以自己定义实体解析内容。xml解析器遇到实体引用,就去DTD中找实体定义(我猜是这样的哈哈哈哈哈)。读到内容:
![Uploading 截屏2020-05-27 下午1.38.40.png…]()
但是目录翻了个遍,flag呢? 。。。
看来需要读php源码了, 但是问题是以上方法不能读php源码,不能正确生成图片。为啥? 由于PHP是一门标签语言,php文件包含的一些characters(e.g <, >) 导致xml不能正常解析。 需要绕过这一点。 首先我尝试了PHP Protocol Wrappers:
php://filter/read=convert.base64-encode/resource=file:///index.php
,似乎不太好使。另一种为了规避xml解析,使用CDATA手段https://en.wikipedia.org/wiki/CDATA#CDATA_sections_in_XML。可以看到这个wiki中描述了。所以说<![CDATA[...]]>内部的context不会被解析(正好在此拿来读源码)。
要拼接一个CDATA,我们应该这样,但是XML说明不允许在内部实体的声明中(&all;)中包含外部实体。( it is not permitted by the XML specification to include external entities in combination with internal entities.) [参考]。
这里引入了
Parameter Entities
参数实体:参数实体,用%号定义,使用在DTD中时首先被解析。因此上图中先将
%paramEntity;
解析,再来解析&genEntity;
。xml文件:
dtd文件:
首先倒入%data;这个参数实体的内容, 加载内容然后用%start;%file;%end;这三个参数实体所声明的内容拼接成一个CDATA,即参数实体%all;的内容。然后在参数实体%all;的解析中,生成了内部实体&fileContents;的声明。
然后...还没完是一个jwt伪造,越权成admin,第一次遇到...
然后...sqlite注入...
后面题目关了我就没复现...参考:https://github.com/nreusch/writeups/blob/master/m0lecon_2020/skygenerator.md