最近,朋友公司遇到了一件让他们“寝食难安”的事:他们的短信验证码接口被人盯上了,充进去的钱没多久就被刷得一分不剩。不充钱,业务直接受影响;但充钱吧,就像往无底洞里灌水。他们联系短信服务商,对方反馈说可能是“被恶意盗刷”。由于他们没自己的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临时止血的更多相关文章

  1. asp.net两种方式的短信接口使用(提供接口的都是收费的)

    一种是http请求的方式,另一种就是提供WebService接口供调用的. //服务商 sms.webchinese.cn //sms_url="http://sms.webchinese. ...

  2. asp.net mvc短信接口调用——阿里大于API开发心得

    互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短 ...

  3. 模板短信接口调用java,pythoy版(一) 网易云信

    说明 短信服务平台有很多,我只是个人需求,首次使用,算是测试用的,故选个网易(大公司). 稳定性:我只测试了15条短信... 不过前3条短信5分钟左右的延时,后面就比较快.... 我只是需要发短信,等 ...

  4. destoon短信接口修改方法

    destoon是很优秀的B2B行业站程序.程序模块化开发契合度很高,二次开发起来也很顺畅.数据缓存,权限分配,SEO功能方面都不错. 但是在使用这套程序的时候,常常要用到发送短信的功能,而destoo ...

  5. 短信接口调用以及ajax发送短信接口实现以及前端样式

    我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用.class文件加其调用. 在这里我们用class文件加调用: 首先,ThinkPHP里面自 ...

  6. Thinkphp框架 -- 短信接口验证码

    我用的是一款名叫 短信宝 的应用,新注册的用户可以免费3条测试短信,发现一个BUG,同个手机可以无限注册,自己玩玩还是可以的. 里面的短信接口代码什么信息都没有,感觉看得不是很明白,自己测试了一遍,可 ...

  7. zabbix短信接口调用

    #!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...

  8. 阿里大鱼短信接口整合Tp3.2.3开发整理

    阿里大鱼 http://www.alidayu.com/ 的短信接口总体是不错的,别安驹个人认为不管是从性价比还是稳定性上都是跟同类的短信接口好些,毕竟是大公司的东西不会差到哪去.下面把之前开发的短信 ...

  9. C#调用短信接口(通过简单的工厂模式整合多个短信平台)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  10. asp.net C# 实现阿里大鱼和云片网短信接口类

    云片网短信通用类 public class YunpianSMS { public YunpianSMS() { } /// <summary> /// 服务器HTTP地址 /// < ...

随机推荐

  1. ReactNative开发总结

    https://www.jianshu.com/u/b09c3959ab3b ReactNative之项目结构介绍 一.初始化ReactNative工程 自动创建iOS和安卓工程,和对应的JS文件,i ...

  2. Vim编辑器退出的多种方法

    当文本编辑结束之后,通常需要退出编辑器.退出编辑器又分为4种情况:保存退出.正常退出.不保存退出及强制退出.下面简单说下吧!   1.先介绍一下保存退出.当我们编辑或修改好了文件内容,如图.   我们 ...

  3. Symbolic pg walkthrough Intermediate window 利用302进行文件csrf

    nmap nmap -p- -A -sS -T4 192.168.239.177 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-15 03:39 ...

  4. C# Dev GridView当前行

    DEV获取GridControl当前行 //直接通过gridView获取当前行 dr=this.gridView1.GetDataRow(this.gridView1.FocusedRowHandle ...

  5. 使用 SOUI 开发高 DPI 桌面应用程序[转载]

    原文:使用 SOUI 开发高 DPI 桌面应用程序_吹泡泡的小猫的博客-CSDN博客 补充说明:soui3以后版本对dpi的支持更完善了,用起来也更简单了. 1 应用程序感知 DPI 变化 在 Win ...

  6. 接口性能测试---locust脚本编写(一)

    本文分享自天翼云开发者社区<接口性能测试---locust脚本编写(一)>,作者:丁****乐 一.安装 locust是用python编写的一款开源接口性能测试工具,以python3为例, ...

  7. Flink同步kafka到iceberg数据延迟,两个checkpoint后才可查询

    一.问题描述 用户配置了高级参数很多,观察kafka增量数据不多,flink负载不高情况下两个checkpoint后才可查询到数据.   排查时hdfs有数据文件产生,但是mainfast文件中最新快 ...

  8. CAP与BASE:分布式系统设计的灵魂与妥协

    CAP 理论 CAP理论起源于 2000 年,由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会(PODC)上提出,因此 CAP 定理又被称作 布鲁尔定理(Brewer's t ...

  9. AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀!

    1 AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀! 1.1 背景   在AI编程大行其道的背景下,各种AI编程工具:Cursor.VSCode的各种插件.Trae等等搞得不亦乐乎!您 ...

  10. HBuilder X对vue的支持有多强?

      HBuilder X对vue的支持有多强? 分类:HBuilder Vue HBuilderX中使用vue,如果是打开vue文件,会自动挂载vue语法库.如果是HTML文件里引用vue框架,需要点 ...