用了参数化查询,还是被 SQL 注入了,上线 3 天几十个用户反馈账号被盗余额被刷完,求助怎么解决?

333 天前
 drymonfidelia

Python+MongoDB 写的一个简单(虽然业务都很简单但是有九百多个接口,选型用 Python+MongoDB 就是为了往上面堆各种奇怪格式的简单接口方便)网站,拉日志排查发现有人提交了类似这种 Payload {"password":{"$ne":"111"}},登录接口好解决,直接 str 转换一下字段,剩下九百多个接口过一遍工作量太大了还容易有漏,有人了解如果我加一个中间件遍历提交的 JSON 把 $ 开头的 key 全部过滤掉就安全了吗?

每次用新技术必被坑,上次是被 Tauri 浪费了一整天

10947 次点击
所在节点    信息安全
82 条回复
yjxjn
333 天前
@drymonfidelia #9 你现在看看,工作量不仅翻倍,损失也在翻倍。
fangxiaoning
333 天前
要么就是有地方没有参数化,要么就是有其他漏洞吧,参数化了注入不了的
bunny189
332 天前
早用我们 laravel P 事没有,所有东西都给你集成好了,开箱即用爽得很
drymonfidelia
332 天前
@fangxiaoning 按二楼提供的关键词,参数化了还有一堆花样能注入
009694
332 天前
password 字段应该接受的是一个字符串 你是怎么把 dict 传递进去的?
drymonfidelia
332 天前
@009694 直接读的 json ,没有数据模型
leegradyllljjjj
332 天前
啥时代了还在被 sql 注入,就像 2024 一个计算机系大大学生说我的智能手机键盘坏了
LeeReamond
332 天前
@hlwjia 这和 ORM 有什么关系,ORM 也是调底层驱动的。正常来说应该是用参数化查询就不会被按对象解析,只能说可能它这个 mongodb 比较奇怪吧。。
sagaxu
332 天前
@LeeReamond mongodb 查询时传入的 value 可以是 bson(list/map),driver 是分不清这个 bson 是你自己构造的还是被注入的,想不被注入,代码里要保证所有传入的 value 都是 str 或者 number ,str 里无论怎么写都不会被注入
des
332 天前
@drymonfidelia 参数化还能被注入,那就说明你写的不对
MrKrabs
332 天前
神人
podel
332 天前
接入 ORM
yunye
332 天前
这项目质量也能有用户充钱?
drymonfidelia
332 天前
@yunye 因为这个项目只有我们在做。项目质量差就是因为急着上线,招了一堆临时工赶进度
drymonfidelia
332 天前
@drymonfidelia 九百多个接口从立项到上线只用了一个月多一点
scriptB0y
332 天前
不明白怎么注入的,假设 `{"$ne":"111"}` 这个字符串传回来,这也是个 string 吧,拿它来和真正的密码对比,肯定是不想等的呀? (做 hash 之后对比就更不想等了)
drymonfidelia
332 天前
@scriptB0y 因为 password 字段实际存的是短信验证码,我们偷懒直接三个条件(手机号 短信验证码 有效期)查出来有记录就登录成功
drymonfidelia
332 天前
卧槽怎么好像又被黑了,数据库有大上传流量
Belmode
332 天前
离谱......

如果不想每个接口上都单独校验,可以在中间件或者框架的过滤器上把正常接口的入参全部审查一遍。
drymonfidelia
332 天前
@Belmode 就是这么做的,目前会遍历 dict 每个 key ,只允许 number 、string 、list 的 value ,list 的 value 会再次过滤,只允许 string 和 number 的成员,希望不会再出问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1048156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX