[FireshellCTF2020]web wp
buu重拳出击!这个比赛的题目都还挺有意思的,做完之后觉得学到了些什么
有一个是一分题之前做过了,这次的两个不是一分,不过因为其相似性还是很有意思
URL TO PDF
就一个功能点,给url返回这个url内容的PDF,稍微试了一下,功能并不是很完整,很多内容加载不出来就进行了截图。然后测了一下能不能直接ssrf之类的,协议貌似写死了http(s),所以直接file不行的,支持重定向,但是重定向也不能改协议到file啊。计划1不通
那么进行经典ssrf扫端口,但是我觉得不告诉你内网端口硬扫的题目也挺坑的(应该不会有人出这么脑瘫的东西),试了几个常用端口无果之后开始想其他办法
突然觉得应该看看他使用的库是什么,以及他的后端语言是什么,所以让他访问了一下我的requestsbin,UA里面果然写了其使用的库:WeasyPrint
,后端是python,找到这个库之后搜索ssrf很容易就能找到这篇文章,提到当你使用<link>
标签时,他会把标签指向的内容给下下来返回在PDF内
这里文章的作者同样提到,WeasyPrint使用了自己定义的一套HTML标签,使得无法在其上执行js
MY EXPENSE REPORT RESULTED IN A SERVER-SIDE REQUEST FORGERY (SSRF) ON LYFT
we discovered references to <link> inside of several files including pdf.py. This allowed us to attach the content of any webpage or local file to our PDF by using <link rel=attachment href=”file:///root/secret.txt”>.
然后再抄一个解析脚本就能成功提取文件内容了
ScreenShooter
这个题和上一题的UI几乎一致,而功能点变为了把给的网页内容渲染为一张图片,攻击原理可能与上一题类似,那么依葫芦画瓢的先看一眼UAMozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1
除了那一句PhantomJS/2.1.1以外,一切看起来都很熟悉,那就查一下这个不熟悉的东西,能直接查到好几个CVE。。。不过CVE的描述还是过于粗糙,找到了这么一篇文章,提到了如何通过一个XMLHttprequest来读取本地文件
PhantomJS常被用来写bot,既然是bot,那就能解析页面上的js,可以考虑写一轮javascript
Escalating XSS in PhantomJS Image Rendering to SSRF/Local-File Read
文章中因为是XSS,而作者需要使用document.write来使得在执行图片渲染前写入内容,使bot解析js,而这里我们是可以直接控制页面的,所以就可以少一步套娃。
直接通过XHR发起一个file协议的请求即可完成本地文件读取
这个PhantomJS在iframe等内容的处理上是很正确的不允许了加载本地文件的,看来写东西的时候要考虑到方方面面
consideration
其实感觉考虑和学到的东西不止是这点题目。类似于这种爬虫类型的功能,在访问页面时能直接得到的只有HTML而已,而要以PDF或者图片的形式对内容进行展示,就比如需要解析页面内的HTML,加载一些外部图片,或是解析CSS样式,此时就需要对页面上的各种标签进行解析。
bot一般都是基于浏览器内核实现的,浏览器在出于安全考虑时,是绝对禁止加载本地文件的,只有使用input等方法并且用户自行选择文件时,才能加载本地文件。而这里反复突破了这一限制,其原因也值得思考
WeasyPrint并没有实现浏览器内核,毕竟其功能并不是一个完整的bot,因此其自建了一套HTML解析方式,并阻止了执行script标签,但其又自己支持了一种link标签,能读取文件作为附件,似乎是一个合理的功能,但漏掉了本地过滤,导致了ssrf
PhantomJS应该是自己实现了浏览器内核的,但是估计是写的并不是很好,在XHR请求的处理上没有严格的检查,导致能通过一个file协议读取到本地文件并进行操作,不过由于其18年就停止开发了,远古时期存在的老洞倒也可以理解。
很有意思的一点是这个CVE的编号是CVE-2019-17221
,但是上面那篇文章的发布日期是17年。。。这个大哥是不是强到发现了一个洞都懒得交的地步了?