MongoDB注入日

极客

MongoDB注入日:我差点把整个数据库都送人了!

哎呀妈呀,说到这个MongoDB注入日,我现在后背还发凉呢!真的,不骗你们,那天我差点就把公司整个用户表给“裸奔”出去了,你们猜怎么着?我居然在不知不觉中踩了MongoDB注入的大坑,而且还是在最不该出错的生产环境上!

事情是这样的……

那天下午,我正在调试一个看似平平无奇的登录接口,说实话,当时我根本没往安全那方面想——毕竟前端都做过校验了,后端也写了看似严谨的过滤函数,我还美滋滋地想着“今天应该能准时下班”,结果呢?呵呵,现实啪啪打脸啊!

我当时写的是这样的代码:

db.users.find({ $where: "this.username === '" + username + "'" })

看到没?就这短短一行,直接把数据库的查询条件变成了字符串拼接!我当时还觉得挺得意,觉得这样写既简洁又灵活,结果调试的时候,我随手在用户名框里输入了这样一段“魔法值”:

' || '1'=='1

卧槽!登录成功了!而且返回的是管理员账号!!!我整个人直接从椅子上弹起来了,咖啡都差点泼到键盘上!那一刻我脑子里的弹幕全是:“完了完了完了,这要是被黑产盯上,老板不得把我骨灰都扬了……”

MongoDB注入的危害有多大?兄弟们听我一句劝!

你们可能觉得,哎呀,不就是个登录框嘛,能有多大危害?大错特错! MongoDB的$where操作符注入可比传统SQL注入还要阴险!因为它执行的可是原生的JavaScript代码啊!这意味着什么?意味着攻击者不仅能绕权限,还能用JS内置对象做各种骚操作,

  • 直接枚举所有数据库名
  • 拿到所有集合的统计信息
  • 甚至通过sleep()函数搞时间盲注(这招最可怕,神不知鬼不觉)

我记得那天修复漏洞的时候,我盯着日志看了一下午,就害怕已经有人提前光顾过我们的数据库了,那种感觉,怎么说呢,就像你发现自己家门锁其实是纸糊的,而且门还虚掩了一整天……后怕啊,兄dei们!

我踩坑后的血泪总结(划重点!)

  1. 永远不要用字符串拼接查询条件——这条必须给我焊死在脑子里!参数化查询不好吗?非得自己拼字符串秀操作?
  2. $where能不用就不用——MongoDB官方文档里都写了,这玩意儿性能差还容易惹祸,真要复杂逻辑,先查出来再在应用层处理它不香吗?
  3. 权限一定要记得控制——我当时连数据库的只读账号都没配,用的还是带管理权限的连接串,现在想想,这波纯纯的“裸奔式开发”啊!
  4. 输入校验别一股脑信任前端——后端过滤才是最后一道防线,前端校验那纯粹是用户体验用的,防不了坏人啊!

修完漏洞那天晚上,我走在回家的路上,看着路灯下的梧桐树影,突然觉得它们都像是黑客在比“手刀”手势……哎,我这辈子算是记住MongoDB注入日这个日子了!你们现在要是还敢在代码里拼查询字符串,我求你赶紧去面壁思过!真的,千万别学我,等出事了再后悔,那可真是用全公司的数据库来交学费了!

怎么说呢,这次教训让我彻底明白了:安全无小事,哪怕是一个简单的登录接口,都可能成为整个系统的阿喀琉斯之踵,希望大家以我为戒,写代码的时候多留个心眼,别图一时爽快埋下大雷。

MongoDB注入日

如果你也想系统学习网络安全,特别是数据库安全方面的知识,可以加QQ:123456789,咱们一起交流一起进步,少踩一个坑是一个坑!毕竟,谁也不想成为下一个“MongoDB注入日”的主角,对吧?😭😭😭

文章版权声明:除非注明,否则均为咸鱼-即刻攻防原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码