XNUCA_2020_oooooooldjs题解.md
文章首发于安全客
题目描述
npm audit
may miss something, be careful of the version oflodash
. There is prototype pollution inexpress-validator
, limited but powerful。
npm audit发现lodash有原型链污染漏洞
1 | # Run npm update lodash --depth 2 to resolve 1 vulnerability |
在https://snyk.io/test/npm/express-validator/2.21.0中查看lodash中出现原型链污染的地方,依次下断点
传入json数据:{"233":123}
发现:
调用了存在原型链污染的set方法,且[233]不为object的键值,在这里可以触发原型链污染
一波测试后得到原型链污染的payload:{".\"].__proto__[\"crossDomain":{"1":"2"}}
,但是不能控制原型链污染的值
审计题目代码发现,非常有意思的两个地方
显眼的dangerous
这里自己实现了数据库的CURD四种方法
学习了一波后发现第一点可以触发RCE
1 | const { JSDOM } = require("jsdom"); |
在util.js中定义了唯一会用到jsdom的函数
1 | const { |
jquery的ajax有个特性是如果返回的content-type是text/javascript等代表着js脚本,那么便会执行js,结合上面的jsdom从而RCE,但是在低版本的话确实可以这么做,但是在高版本jquery进行了限制,如果是跨域请求便不会执行脚本
调试jquery代码发现:
这里会覆盖我们的content-type,继续调试发现设置crossDomain的逻辑
如果s.crossDomain == null就会进入是否跨域的判断
利用前面的原型链污染从而绕过jquery的跨域限制
还剩下一个问题,我们如何传入自己的url
express开着一个中间件限制了我们url,而且也不让更新url类型的数据
1 | const middlewares = [ |
回到我们刚刚说的第二点有趣的地方,这个简单的数据库并不支持事务功能,也就是说删除type和data并不会同时删除是存在一定的时间差的,相关代码如下
1 | D(id) { |
在删除了type后,他进行了一个相当耗时的操作:访问url,之后才删除data,又因为这里是一个链式删除,一个接着一个删除,所有type删除完后它可能才删除一个data
于是有:
1 | import requests |