[BSidesCF 2019]SVGMagic(xxe)
SVG是一种用XML定义的语言,SVG图形是可交互的和动态的,可以在SVG文件中嵌入动画元素或通过脚本来定义动画。
也就是说SVG是个XML,我们就能想到xxe
详解:https://www.freebuf.com/vuls/175451.html
我们知道,XML被设计用于传输和存储数据,然后这个漏洞就是利用了,应用程序在解析XML输入时,没有禁止外部实体的加载。
就拿下面的这个来说
SVG是一种用XML定义的语言,SVG图形是可交互的和动态的,可以在SVG文件中嵌入动画元素或通过脚本来定义动画。
也就是说SVG是个XML,我们就能想到xxe
详解:https://www.freebuf.com/vuls/175451.html
我们知道,XML被设计用于传输和存储数据,然后这个漏洞就是利用了,应用程序在解析XML输入时,没有禁止外部实体的加载。
就拿下面的这个来说
我们审计代码
1 | <?php |
一般来说,我们要绕过if语句的md5和sh1是用数组绕过的,但由于还要eval传递的值,所以我们就不能用数组绕过
所以,我们考虑php中的内置类,也就是原生类
首先我们进行目录扫描,发现www.zip
可以下载到源码
1 | <?php |
通过审计代码,我们发现关键点一步是求出私钥,由于生成公钥使用的是mt_seed,即伪随机函数,我们只要通过公钥获取到种子值就能得到私钥
我们使用php_mt_seed这个脚本
我们先处理公钥数据成脚本需要的数据格式
我们进行代码审计
1 | <?php |
代码对comm1和comm2进行正则匹配,再执行命令
我们需要做的就是绕过正则匹配和执行想要的命令
打开页面,进行代码审计
1 | <?php |
我们要了解什么是require_once
require_once
表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
由于 require_once 包含的软链接层数较多时 once 的 hash 匹配会直接失效造成重复包含。