吃瓜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 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.

所以说内部的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
吃瓜CTF(m0leCTF2020)里的一个Chall,日常签到观光...
首先映入眼帘的是主页,有一个小星星图片
注册->登录,然后我们来到了核心功能:
这里可以看到上传文件,还给了一个
template,打开看看:Xml...上传试试:
发送呵呵哒星~

生成了一张图片
我们来访问一下
![Uploading 截屏2020-05-27 下午1.24.27.png…]()
于是成了夜空中最闪耀的星~
既然可以
![Uploading 截屏2020-05-27 下午1.35.36.png…]()
heheda,那么就可以解析xml文件啰,开始尝试XXE:heheda进化->&heheda;
这里就构造了xml实体攻击, 实体,我的理解是描述字符的字符。类比html中的实体,如
<p>he heda</p>,html解析器会将其解析成<p>he heda</p>,同样的,在xml中,除了字符实体,我们还 还可以自己定义实体解析内容。xml解析器遇到实体引用,就去DTD中找实体定义(我猜是这样的哈哈哈哈哈)。读到内容:
但是目录翻了个遍,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中描述了。所以说内部的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