短信接口被刷爆:我用Nginx临时止血
最近,朋友公司遇到了一件让他们“寝食难安”的事:他们的短信验证码接口被人盯上了,充进去的钱没多久就被刷得一分不剩。不充钱,业务直接受影响;但充钱吧,就像往无底洞里灌水。他们联系短信服务商,对方反馈说可能是“被恶意盗刷”。由于他们没自己的IT团队,App是找外包做的,现在处于无人维护状态。老板希望在不改代码的前提下想个办法帮忙止血。
断症:不是Bug,而是接口在裸奔
这个App已经稳定运行了两年左右,程序 bug 的可能性比较小。我们怀疑是短信平台信息泄露,或者接口被恶意程序利用。我上服务器看了下,他们部署非常简单:前端用 Nginx 直接代理后端 Java 服务。打开 Nginx 日志发现有人以每秒3-6次的频率请求获取短信验证码的URL。并且接口调用未做二次验证,这就等于把“发验证码”的权限完全开放了。哎!机会就这样留给了别有用心的人。
亡羊补牢
这种情况,不改代码确实有点难搞。从Nginx日志上可以看到,攻击者使用了大量代理IP,每次请求的IP和参数都在变化,所以没办法通过IP黑名单的方式解决问题。我们只能寄希望于App在请求接口的时携带了攻击者不具备的标识。由于Nginx无法直接打印完整请求头,所以考虑用OpenResty通过Lua脚步把所有的请求头内容输出到日志里(这个接口是Get请求)。又只能在夜深人静的时候加班学习,好在以前了解过一点OpenResty的知识。
分析请求头
先折腾了一个简单脚本来分析请求头,要是这一关过不了,那基本可以放弃这个思路了。
location /api/reg/getCode {
content_by_lua_block {
for k, v in pairs(ngx.req.get_headers()) do
ngx.say(k, ": ", v)
end
}
}
经过一番分析,发现App在每个请求上都带上了一个版本号信息(虽然还在1.0.0),好在正好可以用来区分是否为恶意请求。
基于请求头做验证
接下来,就是利用 Nginx 的 map 指令判断请求头中是否包含指定版本号字段。命中放行,没命中就拦下。
代码如下:
http {
map $http_app_version $allow {
default 0;
"~*xxx_1.0.0" 1;
}
server {
listen 80;
server_name xxx.xxx.com;
location /api/reg/getCode {
if ($allow = 0) {
return 403;
}
proxy_pass http://java_service;
}
}
}
部署上去后看了下 Java 的日志,接口盗刷的请求直接被干掉,效果显著。
以假乱真
虽然拦截成功,但返回403会暴露我们的防御策略,容易引起对手的注意,分分钟就能突破这道薄弱的屏障。于是做了个升级:在nginx拦截到请求后,直接返回请求成功的响应结果,从此以后双方都可以保持“成功”的假象。
改动如下:
location /api/reg/getCode {
if ($allow = 0) {
add_header Content-Type application/json;
return 200 '{"code":"200","message":"验证码发送成功","success":true}';
}
proxy_pass http://java_service;
}
经测试,妥妥的,在不看日志的情况下,根本看不出到底有没有真的请求到 Java 服务。
总结
一直不太能理解,这种攻击到底图个啥。既没带来直接利益,还要花成本搞代理搞脚本,这不是典型的损人不利己吗。在之后的几天里,一切又恢复到了往日的宁静。虽然事情已经告一段落,但临时止血不是长久之计,解决这类问题还是需加强程序安全验证,提升攻击难度。
最后
关于OpenResty,可以翻阅我的OpenResty学习笔记,欢迎点赞支持。
短信接口被刷爆:我用Nginx临时止血的更多相关文章
- asp.net两种方式的短信接口使用(提供接口的都是收费的)
一种是http请求的方式,另一种就是提供WebService接口供调用的. //服务商 sms.webchinese.cn //sms_url="http://sms.webchinese. ...
- asp.net mvc短信接口调用——阿里大于API开发心得
互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短 ...
- 模板短信接口调用java,pythoy版(一) 网易云信
说明 短信服务平台有很多,我只是个人需求,首次使用,算是测试用的,故选个网易(大公司). 稳定性:我只测试了15条短信... 不过前3条短信5分钟左右的延时,后面就比较快.... 我只是需要发短信,等 ...
- destoon短信接口修改方法
destoon是很优秀的B2B行业站程序.程序模块化开发契合度很高,二次开发起来也很顺畅.数据缓存,权限分配,SEO功能方面都不错. 但是在使用这套程序的时候,常常要用到发送短信的功能,而destoo ...
- 短信接口调用以及ajax发送短信接口实现以及前端样式
我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用.class文件加其调用. 在这里我们用class文件加调用: 首先,ThinkPHP里面自 ...
- Thinkphp框架 -- 短信接口验证码
我用的是一款名叫 短信宝 的应用,新注册的用户可以免费3条测试短信,发现一个BUG,同个手机可以无限注册,自己玩玩还是可以的. 里面的短信接口代码什么信息都没有,感觉看得不是很明白,自己测试了一遍,可 ...
- zabbix短信接口调用
#!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...
- 阿里大鱼短信接口整合Tp3.2.3开发整理
阿里大鱼 http://www.alidayu.com/ 的短信接口总体是不错的,别安驹个人认为不管是从性价比还是稳定性上都是跟同类的短信接口好些,毕竟是大公司的东西不会差到哪去.下面把之前开发的短信 ...
- C#调用短信接口(通过简单的工厂模式整合多个短信平台)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- asp.net C# 实现阿里大鱼和云片网短信接口类
云片网短信通用类 public class YunpianSMS { public YunpianSMS() { } /// <summary> /// 服务器HTTP地址 /// < ...
随机推荐
- fopen在VS中不安全的问题
问题 fopen函数哎VS中使用,报错: error C4996: 'fopen': This function or variable may be unsafe. Consider using f ...
- MySQL的7种JOIN
原文链接:https://blog.liuzijian.com/post/61e35b3c-fae7-4e0b-aaa2-1d1f2896d9b1.html -- 创建数据库 CREATE DATAB ...
- 云电脑:DPU简介及分析
本文分享自天翼云开发者社区<云电脑:DPU简介及分析>,作者:大利 随着云计算技术的快速发展,云电脑作为一种基于云计算技术的虚拟化电脑,正在逐渐受到广泛关注.然而,云电脑在实现过程中面临着 ...
- 600条Linux 命令总结
一.基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /de ...
- OI 超几何函数与Gosper算法入门
前言 据说这个东西是 19~20 初世纪数学研究的重大成果与主要研究方向.但是很可惜,由于世界形势的变化,以德国为中心的的超几何函数.椭圆函数研究开始没落于集中于美国.苏联的数学研究飞向. 第一章 定 ...
- USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]
Cake Game:小清新前缀和题,但是我场上想了半天优先队列贪心假完了 /ll/ll/ll. 观察 本题有三个重要的结论,我们依次进行观察. 不难发现,第二个牛一定会拿 \(\frac{n}{2}- ...
- 『Python底层原理』--Python对象系统探秘
Python是一种非常灵活的编程语言,它的灵活性很大程度上来自于它的对象系统. 在Python中,一切都是对象,这意味着无论是数字.字符串,还是我们自己定义的类的实例,它们在底层都遵循相同的规则. 本 ...
- LINUX 服务器安装nginx redis jdk等步聚
1.安装指令步聚 sudo yum update 更新linux系统 yum install -y nginx 安装nginx systemctl enable nginx 设置开机启动nginx s ...
- 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
引子:那个让运维集体加班的夜晚 "凡哥!线上服务响应时间飙到10秒了!"凌晨1点,实习生小李的语音带着哭腔. 监控大屏上,JVM堆内存曲线像坐了火箭--刚扩容的16G内存,30分钟 ...
- 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结
前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...