记一次利用00进行短信轰炸的渗透手法

摘要

最近在一次渗透测试过程中遇到了一个比较有意思的漏洞,可利用特殊字符构造手机号以绕过发送频率限制,进行短信轰炸。并且在RD同学改完后,仍然发现可被绕过,因此再次记录一番。(文中涉及站点的图片都已打码,只在分享渗透的思路)

空格绕过姿势

在对某站进行渗透测试过程中,发现该网站上有一处发送短信验证码功能,该功能数据包截图如下:

可以看到postdata里面是一个json类型,写入目标手机号,重放数据包,可以成功发送短信验证码。由于服务端对同一个手机号发送次数做了限制,正常情况下无法通过重放数据包进行短信轰炸。然而由于服务端对前端传入的手机号处理不当,可以通过在手机号后面添加空格符号绕过限制。如上图所示,可通过不断在手机号后面添加空格,服务端会认为这是不同的手机号,以此绕过手机唯一性的检测;由于服务端在发送短信验证码时去除了特殊字符并且没有对手机唯一性进行二次检测,因此可达到短信轰炸的效果。

00绕过的姿势

在研发同学修复完此漏洞后,我进行了一次复测,发现服务端在处理手机号时,只是过滤了首位空格符号。那么这样是否就安全了呢?接下来我用回车符等其他特殊符号进行了一轮尝试,发现都无法绕过检测。这时我想到了00大法,可以将空格的16进制20改成00。我先在电话后面输入一个空格,然后在16进制下将20改成00,便可绕过限制,如下图所示:

漏洞产生的原因

服务端在发送手机验证码时分成了两个步骤:第一步服务端在收到手机号码时进行了手机号的唯一性检测(用于判断60s内是否有重复发送),然而此时没有对手机号过滤一些特殊字符,导致添加了空格符号的字符串被当成一个新的手机号;第二步在发送验证码时,却把手机号进行了一些特殊字符过滤,导致最终发送的目标都是同一个手机号。

修复建议

不建议单单使用过滤的方式来修复(很容易被绕过),个人认为可以将判断与发送逻辑合成一个。比如:当服务端收到手机号码时可以进行判断,若传入的手机号码中存在除数字以外的字符,则返回错误;或者过滤特殊字符串后,对过滤后的目标进行唯一性检查,并进行短信验证码发送。

目前评论:0 条

发表评论