验证安全
思维导图
验证码
网站进行身份验证的时候,玩玩会设置验证码机制进行防爆破。验证码又包括各个种类
图片类、手机或者邮箱、语音视频类、或者操作类(例如滑动滑块等)
而关于验证码的漏洞成因往往都出现在验证码的生成过程或者验证过程中
危害:账户权限泄露,短信轰炸,遍历,任意用户操作等
常见的漏洞包括:客户端回显,验证码复用,验证码爆破,绕过等
漏洞示例:web攻防-通用漏洞&验证码识别&复用&调用&找回密码重定向&状态值_验证码复用
验证码识别
工具推荐:burpsuite安装插件captcha-killer识别验证码_burpuite 识别验证码插件
验证码爆破
对于网站验证码存在一定有效时长的类型,可以采用短时间内进行爆破的方式,
验证码回显
所谓验证码在客户端生成而非服务端生成时造成这类问题,当客户端需要和服务器交互发送验证码时,可借助浏览器工具查看客户端与服务器进行交互的详细信息。也可以通过BP抓包看看验证码。
验证码复用
验证码复用,即登陆成功后验证码不刷新,仍然可以使用上一次登陆时的验证码且有效,存在爆破风险漏洞,测试:重放登陆成功的数据包,如果仍然能登陆成功说明存在验证码复用。
只要输入账号错误和密码错误回显不一样,就可以算成用户名可爆破漏洞
例如 : 用户名不存在 , 你的密码错误,这两种回显,说明用户名可爆破
验证码绕过
验证码绕过,即验证码可以通过逻辑漏洞被绕过通常分为以下情况
案例1:验证码验证返回状态值
可以通过BP修改状态值来绕过前端的验证,修改密码页面中存在验证码绕过漏洞
用户输入的验证码交给后端进行验证,验证后返回给前端 “n”/”y”,前端只是单纯的根据 ’y/n’来对验证码进行判断,这时候,我们就可以通过bp将返回包从 n改为y
先抓一个正确的包,然后通过bp拦截响应包
然后根据正确的包的响应包的状态值来修改
案例2:点击获取验证码时,直接在返回包中返回验证码,通过抓包的来观察response包
验证码与手机未绑定认证关系
后端只验证了验证码,并没有将手机号与验证码进行绑定;只需要准备两个或者以上的手机号,找到找回密码的地方或者登录的地方,填一个自己的手机号,获取验证码之后,使用其他手机号进行登录
验证码转发
有的开发人员会使用数组接收手机号,然后一起对手机号进行发送验证码,这个时候两个手机号对应的验证码都是一样的,所以我们可以输入两个手机号,其中有一个自己的,一个是别人的,自己收到的验证码和别人的验证码是一样的,达到窃取验证码的目的。
可以发现两个手机收到的验证码都是一样的,所以如果我们输入一个自己的手机号,一个管理员的手机号,收到验证码之后相当于收到了管理员的验证码
任意验证码登陆
有些网站或者app,小程序有验证码功能,但是如同虚设,只是为了发送验证码,并没有写业务逻辑进行校验,一般在新上线的系统比较常见,因为有些开发就为了方便测试,把验证码校验注释了,从而导致任意验证码登录。进入网站,填写手机号发送验证码,随意输入一个验证码进行登录。
验证码为空登录也是同样道理,验证码为空登录是在后台接收验证码的时候没有对验证码进行过滤,可以进行空值绕过。正常点击发送验证码,然后点击登录或者其他功能之后进行抓包拦截请求,然后尝试修改验证码对应值,可以改成null,-1,true,
空数组等,或者如果携带了cookie,把cookie字段删除了试试
可以进行如下示例修改验证码的值:
null -1 -999999 1.1
[] true success
空 或者删除cookie字段
多多尝试即可。
客户端验证验证码
通过查看源代码发现验证码是前端验证码,可以直接抓包的方式在bp里爆破
怎么判断是前端验证? 开启bp,点击获取验证码,查看bp中的 HTTP history,看有没有新的包被获取到
思路:输入一个正确的验证码,抓包,然后判断后端有没有对这个验证码进行验证
怎么判断后端有没有验证: 修改验证码,查看返回包的结果
当验证码被我们修改后,后端返回的数据包不变,说明后端没有对验证码进行校验。实现了验证码绕过。
总结:判断验证码的方式(是否为前端),输入一个正确的,抓包,判断后端是否对验证码进行校验,若没有的话就可以实现验证码绕过,进入暴力破解流程
验证码前端生成和验证
验证码的生成和验证都是在前端进行,绕过方法是直接屏蔽掉前端相关的JS代码即可。
Token客户端回显
1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
3、使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
token客户端回显就是指某的开发为了简便,直接在用户成功的登陆之后或者进行正确操作之后,将下一次需要用的token放到响应包中,由响应包进行提供下一次的token,这种情况我们能在响应包中搜索到相关的值;那么我就可以利用BP的爆破机制来从响应包中提取token值,进行爆破
参考:用BP爆破有token值的密码_bp抓包工具中追踪token值的工具使用-CSDN博客
Callback自定义返回调用安全
- 1.由于浏览器的同源策略(域名,协议,ip端口相同),非同源域名之间传递会存在限制。
- 2.JSONP(用于解决跨域数据传输的问题,利用了HTML里元素标签的开放策略src引入Js文件,远程调用动态生成JSON文件来实现数据传递,并以任意javascript的形式传递,一般使用 Callback(回调函数返回,由于没有使用白名单的方法进行限制Callback的函数名,导致攻击者可以自定义Callback内容,从而触发XSS等漏洞)由浏览器的javascript引擎负责解释运行。
原理分析:
- 1.接口开发时,接收回调函数的参数值在进行拼接前未对恶意数据进行合理化处理,导致攻击者插入恶意的HTML标签并在返回的JSON数据格式原样输出;
- 2.同时服务端未**正确设置响应头content-type,**导致返回的json数据被浏览器当做Html内容进行解析,就可能造成xss等漏洞。
测试切入点:
- 1.一个使用jsonp技术的接口,参数中包含回调函数的名称(jasonp,callback,);
- 2.服务端返回的json数据时,响应头为 content-type: text/html;
- 3.服务端未对回调函数参数进行过滤净化。
测试步骤:
- 1.设置代理到burpsuite;
- 2.网站根目录开始爬取,重点关注Ajax异步(一般页面只会局部刷新)处理的网页,关注重点业务;
- 3.在HTTP history 标签页过滤功能过滤关键词 Callback,jasonp,等请求,找到URL带有Callback参数的链接。勾选Filder by file extension中的Hider,隐藏js、gif等后缀的URL);
- 4.查看URL对应得HTTP Response的Content-Type类型是否为text/html且内容是否为json形式(带有json数据的函数调用),如果是我们输入的HTML标签才会被浏览器解析;
- 5.将对应的请求发送到Repeater。在callback参数值的前面加一些类似HTML的标签,如,如callback=Testjsonp1,Go之后发现Response的内容有无影响(HTML有无被转义,没有转义则存在漏洞)。也可将callback参数换为有恶意行为的HTML标签,如callback=<img οnerrοr=alert(document.cookie) src=x />jsonp1
防御修复方案:
- 1.定义HTTP响应中content-type为json数据格式,即Content-type:application/json;
- 2.建立callback白名单,如果传入的callback参数值不在名单内就阻止继续输出,跳转到异常页面;
- 3.对callback参数进行净化,包括不限于html实体编码,过滤特殊字符< > 等。
手机短信轰炸
在一些身份校验处,有的时候需要输入手机号,接受验证码,比如登录、忘记密码、注册、绑定、活动领取、反
馈处等,如果没有对发送短信进行约束,可以达到5秒发送10条短信,甚至更多的短信,对业务造成影响,这个就
是短信轰炸漏洞,短信轰炸漏洞分为两种:
1、横向轰炸:对单个手机号码做了接收验证次数,但是可以对不同手机号发送短信无次数限制
2、纵向轰炸:对一个手机号码轰炸多次
打开需要验证码的地方,输入手机号,然后打开BP进行拦截,点击发送验证码,将拦截的请求包发送到重发器,然后根据下面的技巧进行绕过
1.利用空格绕过短信条数限制
通过在参数值的前面加上空格,或者后面加上,或者多个空格,进行绕过一天内发送次数的限制,mobile=
1222335,前面加个空格,就可以再次发送成功。
2.修改cookie值绕过短信次数
有些发送短信的次数是根据cookie值进行判断,利用当前cookie值来验证发送次数的话,很容易被绕过
所以可以尝试多次修改cookie的值,甚至删除cookie绕过。
3.利用接口标记绕过短信限制
发送短信验证,可能会设置参数值的不同,来判断是执行api什么样的功能。比如type=1是注册,type=2是忘记密
码,type=3是修改密码等。我们可以通过修收参数值,来绕过一分钟内只发送一次限制,达到短信轰炸的目的
如下图,可以修改参数值,当然有的参数名称不一样,比如是smsType,apiType等,后端程序猿会根据传的参数名称的不同来实现不同的业务。
4.修改IP绕过短信
有的验证码是通过访问数据包的IP来做限制,比如X-Forwarded-For这个包参数,因此可以修改X-Forwarded-
For后面的IP地址(可以修改为0等其他数值尝试)来进行绕过。
当然在请求头中,看到其他有关IP的参数,也可以修改,比如:
X-Remote-IP:localhost:443
X-Remote-IP:127.0.0.1
X-Remote-IP:127.0.0.1:80
X-Remote-IP:127.0.0.1:443
X-Remote-IP:127.0.0.1
X-Custom-IP-Authorization:localhost
X-Custom-IP-Authorization:localhost:80
X-Custom-IP-Authorization:localhost:443
X-Custom-IP-Authorization:127.0.0.1
X-Custom-IP-Authorization:127.0.0.1:80
X-Custom-IP-Authorization:127.0.0.1:443
X-Custom-IP-Authorization:2130706433
5.特殊字符绕过
加入一些特殊字符之后可以达到一个绕过的目的,比如
%%% ### @@@ !! \r \n tab键 -- *** () 等等
6.+86或者086绕过(区号绕过)
我们给数据包里面的手机号加上+86或者086绕过
7.改地区代码绕过
当我们注册一些网站的时候,有时候会显示该地区,我们可以通过修改地区进行绕过
8.双写手机号
网站后端只对手机号做了一次参数限制,那么双写一个手机号参数,另一个手机号参数绕过限制,进入到后端,
被识别之后就会发送短信
可以通过双写多个参数名
也可以在一个参数名中通过空格或者逗号双写手 机号
在post请求中,请求体也可以写两行带有手机号的尝试绕过: