点开网站:
抓包,修改属性:
返回了这么一串:
由于是$name==md5()
,由弱类型比较和md5想到了md5碰撞,由于PHP的弱比较造成它会将oe开头的md5(字符)解析成科学计数法(数字),于是我们开始爆破。
值得注意的是,我们要将引号也包括进去,因为在json编码中,"0"
为字符串,0
为数字。
爆破完成,看到了
知道了文件名和位置之后,加上提示的xxe,接下来就是重头戏了。
在参考了大佬的文章之后,我对XXE有了一点了解,这里我们使用的是最简单的一种。
关键在这里,我们看到,实体被当作了一个变量来调用,我对<user>&xxe;</user>
的xxe
的理解是,它相当于函数的调用,而上面<!ELEMENT xxe "test">
相当于函数的定义。于是,我们可以改变“函数”内容来实现对于文件的操作。
这里,我们不再是xxe
替换成test
,而是将file:///c:/test.dtd
当作系统命令执行,以此来读取系统中的文件。
在这题里,我只要把这里的file协议替换一下就行了,这里,我们使用php伪协议来读取文件内容。
将base64解码就是flag。
第一次认识了XXE,对json也有了一些了解,学到很多新知识。