一、漏洞的产生
常见漏洞:
身份认证安全漏洞、支付逻辑漏洞(数据纂改)
任意密码找回漏洞、验证码突破漏洞
接口调用安全、未授权访问漏洞
二、权限绕过漏洞
说明 | 方法 |
---|---|
身份认证安全: 有些网站对身份认证模块没有做好安全防护,导致漏洞产生 |
绕过身份认证有以下几种方法 1、暴力破解、撞库 2、Cookie&session类(重要)加密 3、暴力破解 : 测试方法: 在没有验证码限制或者一次验证码可以多次使用的地方,可以分为以下几种情况: 爆破用户名。 当输入的用户名不存在时,会显示请输入正确用户名,或者用户名不存在 已知用户名。 比如: 已知用户名为admin,密码可以进行字典爆破 使用一个常用密码。 比如123456对大量用户进行爆破 修复方法: 1、增加验证码。 登录失败的时候,变换验证码。(验证码不能被工具识别) 2、限制登录频率。 例如,5分钟内登录失败次数超过10次则锁定账号1小时。 3、二次验证。 可以添加手机验证码或邮箱验证码。 |
Cookie伪造: 通过修改Cookie中的某个参数来实现登录其他用户 |
测试方法: 1.使用一个账号登录,找一个可以证明身份的页面,例如首页的欢迎xxx或者是个人中心显示昵称的地方 2.刷新该页面拦截请求,观察Cookie中的字段和值,例如userid=xxx,修改Cookie中的值,把xxx改成admin 3.forword放行,页面显示admin的信息,则存在此问题。 修复方法: 对于客户端标识的用户信息,使用Session会话认证方式,避免通过Cookie去仿冒其他人的身份。 |
Session会话固定攻击: 一种诱骗受害者使用攻击者指定的会话标识(Sessionid)的攻击手段,利用了服务器的session不变的机制 |
攻击步骤: 1、攻击者通过某种手段重置目标用户的Sessionid,然后监听用户会话状态 2、目标用户携带攻击者设定的Sessionid登录站点 3、攻击者通过Sessionid获得合法会话 攻击者重置Sessionid的方法: 通过xss,嗅探等方法取得用户的session,修改数据包。 修复方法: 每次登陆成功之后重新生成session,sessionID闲置过久时,进行重置sessionID |
加密测试 | 概念: 有些网站在前端加密,然后传到后台直接和数据库里的值做对比,这时抓包就知道加密方式,然后做暴力破解。 测试方法: 1、用账号密码登录,拦截请求,查看传输信息是不是通过一些加密方式对账号和密码进行了加密,如果有则存在此问题 2、对于前端加密后的密码进行暴力破解测试时,可以在BurpSuite的Intruder模块 PayloadProcessing中选择加密方式 修复方法: 把加密对比的方法放到后台去执行 |
三、数据篡改
数据纂改分为两方面:
1、业务一致性安全:手机号篡改、邮箱和用户名篡改、订单ID更改、商品编号更改、用户ID篡改
2、业务数据安全:金额数据篡改、商品数量篡改、最大数量限制突破、本地JS参数修改
方法 | 说明 |
---|---|
手机号篡改 | 步骤: 抓包修改手机号码,之后进行越权判断,进入其他人的页面进行操作 修复: 通过session机制判断身份,还需校验手机号与登录者身份是否一致 |
邮箱和用户名纂改 | 步骤: 抓包修改用户名和邮箱为其他用户或邮箱 修复: 通过session机制判断身份,如需传输邮件,要判断发件人与session一致 |
订单ID纂改 | 步骤: 注册一普通账号,修改遍历订单ID,获取其他用户订单详情(平行越权) 修复: 查看订单是通过session判断用户身份,做好平行权限控制 |
商品编号纂改 | 步骤: 提交订单时,抓包修改商品标号,导致商品与价格不符却交易成功 举例: 例如100个积分只能换商品编号为001,1000个积分只能换商品编号005,在100积分换商品的时候抓包把换商品的编号修改为005,用低积分换取高积分商品。 修复: 金额不在客户端传入,防止被篡改,如必要,则务必检查交易金额与商品价格或对支付金额做签名校验 |
用户ID纂改 | 步骤: 抓包查看用户的ID,修改ID(加减1),查看是否能查看其它用户id信息。 修复: 通过session机制判断身份,如果必须用userID参数,要判断与session是否一致 |
金额数据纂改 | 步骤: 在提交订单时进行抓包,修改支付的金额或折扣等相关数据。 修复: 商品信息如金额、折扣等原始数据校验应来自于服务器端,不应接受客户端传来的值 |
商品数量纂改 | 步骤: 抓包修改商品数量等字段,将请求中的商品数量修改为负数或0,查看能否以修改后的数量完成业务流程。 修复: 产生异常的交易行为时直接限制、阻断 |
本地JS参数纂改 | 步骤: 部分应用程序通过Javascript处理用户提交的请求,通过修改Javascript脚本,测试修改后的数据是否影响到用户。 修复: 服务器校验;跨平台支付调用接口,要做好数据的完整性校验,确保一致性 |
最大数限制突破 | 步骤: 很多商品限制用户购买数量时,服务器仅在页面通过js脚本限制,没有在服务器端校验用户提交的数量,通过抓包修改商品最大数限制,将请求中的商品数量改为大于最大数限制的值,查看能否以修改后的数量完成业务流程。 修复: 每次提交都对其对应的各项信息做强校验 |
四、业务授权安全
越权漏洞的分类:
说明 | |
---|---|
水平越权 指相同权限的不同用户可以互相访问 |
漏洞危害: 如果出现此漏洞,那么将可能会造成大批量数据泄露,严重的甚至会造成用户信息被恶意篡改。 |
垂直越权 指使用权限低的用户可以访问权限较高的用户 |
举例: 同一个公司不同权限的管理员A和B,通过修改请求,管理员A可以修改不在他管辖范围内的员工、考勤、工资等 |
漏洞危害:
向上越权:普通用户可以执行管理员权限,比如发布文章、删除文章等操作。
向下越权:一个高级用户可以访问低级用户信息(暴露用户隐私)
检测手段:
查看所有敏感涉及到账户的操作是否有除了UID之外的验证方式,没有的话构造uid访问,可检查是否有漏洞,这里的uid代指username、email、userid等声称的账户信息
如果有验证参数,尝试是否是可以预知的或者可以猜测出来的。不是,没有漏洞,是,有漏洞,构造请求验证漏洞
发生越权行为的修复方法:
1、涉及用户信息的操作需要验证用户身份,比如查看各种用户信息的情况下,不能只根据用户uid去搜索,应该再次进行身份验证
2、特别敏感的操作应该进行二次操作
五、任意密码找回的方法
方法 | 说明 |
---|---|
用户凭证暴力破解 | 概念: 常见的是找回密码的验证码为4位,并且服务端没有加以限制,我们可以通过爆破出验证码的方式来找回密码 步骤: 验证码的位数:4or6,验证码有效时间:1min-15min 验证码爆破防护绕过 修复: 增加验证码复杂性和长度 限制请求修改次数 |
返回凭证 | 返回凭证的三种形式 1、url返回凭证 2、抓包返回凭证 3、凭证在页面中 方法: 1、URL返回凭证 使用firefox的firebug查看请求链接,看链接中是否有验证码等密码找回凭证 2、抓包直接返回 根据手机号找回密码后抓包,可以发现验证码直接显示verifycode=xxxx,如果信息被加密,解密即可(其他信息同理) 3、密码找回凭证在页面中 通过密保问题找回密码,查看源码,密保问题和答案就在源码中显示 |
邮箱弱token | 获取邮箱弱token的方法: 1、Unix时间戳+md5 例如: 通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串md5加密字符串。字符串解密,类似1491293277(10位),可以判断为Unix时间戳。 重置他人密码只需利用他人邮箱发送重置密码邮件,在短时间内对Unix时间戳进行暴力破解,即可获得重置密码的链接 2、用户名 例如:重置密码链接直接使用用户名进行区别,改变用户名即可更改他人密码 3、服务器时间 例如: 利用两个帐号同时点击找回密码,去邮箱查看找回密码的链接,发现两者的随机token只差1-2,而且可以猜测出为服务器时间。所以可以用一个未知帐号和一个已知帐号同时点击找回密码,稍微遍历随机token,就可以构造出未知帐号的密码找回链接 |
用户凭证有效性 | 通过用户凭证有效性修改密码: 1、短信验证码 通过他人手机号找回密码,抓包,将他人手机号替换成自己的手机号,获取验证码,提交后修改密码。 通过自己手机号找回密码,获取验证码后抓包,将数据包中的username改为他人用户名,提交后成功修改他人密码 2、邮箱token 通过邮箱找回密码,访问链接重置密码,输入新密码提交时抓包,虽然有token,但依然可以直接修改用户ID进而修改密码 案例: 短信验证码 P2P之通融易贷存在设计缺陷可重置任意用户密码https://www.uedbox.com/post/19507/ 说明: 点击修改密码时抓包,将邮箱号修改为自己的邮箱号,验证码就被发送到自己的邮箱中 |
重新绑定手机和邮箱 | 1、手机绑定: 给已知账户绑定手机,发现绑定手机的URL链接中有uid参数,修改uid参数为他人的,即可实现将他人的账户绑定上自己的手机,之后通过手机修改密码 修改个人资料处抓包,修改userId为他人,修改手机号为自己的手机,即可实现将他人的账户绑定上自己的手机,之后通过手机来修改密码 2、邮箱绑定: 通过邮箱找回密码,URL链接中修改用户ID为他人,邮箱不变,之后通过链接可以将他人账户绑定为自己的邮箱,之后通过邮箱找回密码 |
服务器验证 | 1、最终提交步骤 使用邮箱找回密码,通过链接至修改密码页面,修改密码后提交、抓包,获得Uid参数,修改为他人,即可修改其他用户密码 2、服务器验证的验证逻辑为空(绕过认证) 通过密码保护问题找回密码,抓包,将密码保护问题删除,直接修改密码,提交 注:此处密保问题和新密码在同一页面 案例: 最终提交步骤 携程旅行网任意用户密码修改说明:通过修改密码邮件,进行密码修改,提交时进行抓包。将Uid改为别人的,即可修改其他人的密码 |
修改凭证 | 修改凭证找回密码的方法 1、修改手机号码 2、修改邮箱地址 |
跳过验证 | 跳过验证步骤、找回方式、直接到设置新密码页面 1、正常流程下,密码找回,查看最后设置新密码页面的URL,记录下来。继续返回密码找回处,输入其他用户名,提交找回申请,直接访问上面记录下的修改密码页面,成功修改密码 2、正常流程下,修改密码页面抓包,修改其中的USERNAME_COOKIE为其他用户(有可能会经过编码,比如base64),提交即可修改其他用户密码,如果抓包其中有step参数,可以修改这个参数为最后一步(比如:5),提交便可略过之前的步骤 |
本地验证 | 1、在本地验证服务器的返回信息,确定是否执行密码重置,但是其返回信息是可控的内容,或者是可以获得的内容 例如:通过手机找回密码,随便输入验证码,抓包,发送,拦截response包(Burpsuite中可以选取do intercept–>response to this request),修改response包中的返回码,继续发送,说不定就可以绕过验证,直接跳到修改密码的页面。 2、发生短信等验证信息的动作在本地执行,可以通过修改request包进行控制 例如:通过用户名找回密码,提交后会自动发送验证码到手机中,抓包,修改手机为自己的手机(如果其中有type之类的参数,也可以尝试修改,有email之类的参数,可以尝试删除内容),发送修改后的包,手机成功接收验证码。输入验证码,继续发送,抓包,如果有type之类的参数,可以继续尝试修改,发送就可以成功修改密码 |
Token生成可控 | token生成可控 举例: 1、通过邮箱找回密码,正常流程下,抓包查看提交验证码后返回的数据,有加密字符串,这个加密字符串和后面重新设置新密码URL链接中的加密字符串一样,所以可以利用这个加密字符串 2、根据上面提交验证码的抓包,修改User为其他用户(User有可能会使用md5加密),发送,就可以返回其他用户的加密字符串 3、重新返回到找回密码首页,利用其他用户找回,点下一步,到输入验证码处,直接修改URL链接,加入加密字符串,可以直接绕过验证码,重置密码 |
注册覆盖 | 注册覆盖 举例: 注册重复的用户名,例如admin,相当于修改了密码 |
Session覆盖 | Session覆盖 举例: 同一浏览器,首先输入自己的账户进行邮箱密码找回,进入邮箱查看链接,接着输入他人账户,进行密码找回,返回刚刚自己的邮箱点击链接,由于session覆盖导致了,这个链接成为了修改他人密码的链接,成功修改他人密码 |
六、验证码突破
验证码突破方法
方法 | 说明 |
---|---|
暴力破解 | 方法 1、有的验证码输入正确一次,在一定时间内不用再输入。 2、有的验证码输入正确一次,会在你session中设定一个值,告诉服务器你已经通过验证码验证了。 3、有的验证码因为逻辑问题只是一个摆设,正常的逻辑为先对比验证码是否正确,再检测账号密码是否正确,反过来了 4、删除cookie,将验证码参数va=1234变成va[]=1234 修复建议: 1、提高验证码的长度、复杂度 2、可限制错误登录次数、有效时间突破验证码的方法 |
时间、次数突破 | 概念: 重复提交携带验证码的数据包,查看返回包,判断次数 测试方法: 填写正确登录信息和验证码–>抓取提交数据包–>重复提交该数据包–>查看是否登录成功–>登录成功则存在验证码重复使用问题 案例: Step1、输入正确信息点击登录时抓包 Step2、抓包,通过修改imageField参数的大小来实现暴力提交,自设一个两位数数字字典作为payload Step3、查看任意响应包是否登录成功,从结果来看,暴力重复提交的数据包均登录成功。 |
回显测试 | 概念: 验证码直接由客户端生成,在回显中显示,可通过浏览器工具直接查看 测试方法: 1、在源码中显示。源代码审计,搜索源码中有无验证码 2、在COOKIE中显示。抓包时分析COOKIE中是否含有验证码 案例: Step1、输入相关信息 Step2、抓包,得到验证码 Step3、输入验证码。验证通过 |
绕过测试 | 漏洞成因: 由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。 测试方法: 1、抓包,删除验证码字段,查看是否可以成功发送 2、抓包,正常流程下,记录验证码后的数据包,替换目标包中内容,直接发送,查看是否可以直接绕过验证码 案例: Step1、输入正确账户信息和错误验证码,登录时抓包 Step2、删除COOKIEStep3.客户端登陆成功 |
七、接口调用安全
方法 | 说明 |
---|---|
重放攻击 | 在短信、邮件调用业务或生成业务数据环节中(类:短信验证码,邮件验证码,订单生成,评论提交等),对其业务环节进行调用(重放)测试 常见类型: 短信轰炸(末尾空格、\n绕过) 恶意注册 修复: 1、对评论提交等操作采用验证码机制,防止生成数据业务被恶意调用; 2、短信/邮件接口,需要对接调用频率进行控制或者上限限制; 3、每一个订单(接口访问)使用唯一的token,提交一次后,token失效 |
内容编辑 | 例如: 点击获取短信验证码,抓包,可以修改短信内容,实施下一步攻击 修复: 从客户端处获取手机号、邮箱等账号信息,要与Session中的凭证进行核验,验证通过后才允许进行业务操作。 |
接口调用遍历漏洞 | Web接口一般将常见的一些功能需求进行封装,通过传入不同的参数来获取对应的数据或者执行相应的功能,其中最常见的场景就是通过接口传入id参数,返回对应id的信息。此类接口如请求合法性校验不严,很容易出现非授权访问或者越权访问的问题。 修复: 1、在session中存储当前用户的凭证或者id,只有传入凭证或者id参数值与session中的一致才返回结果。 2、一般涉及身份校验的接口,不要直接将敏感信息的明文信息在客户端与服务端间传递,可以将敏感信息在服务端关联到用户标识ID,在客户端保存用户标识ID并提交到服务端,服务端根据ID取出对应信息后进行校验; |
接口未授权访问、调用漏洞 | 在正常的业务中,敏感功能的接口需要对访问者的身份进行验证,验证通过后才允许调用接口进行操作。接口未做身份验证或身份校验不严,可能导致非授权访问或越权调用,越权又分为垂直越权和水平越权。 修复: 1、采用Token校验的方式,在url中添加一个Token参数,只有Token验证通过才返回接口数据且Token使用一次后失效; 2、在接口被调用时,服务器端对会话状态进行验证,如果已经登录,便返回接口数据;如未登录,则返回自定义的错误信息; 3、未授权访问接口做Session认证,并对用户访问的每一个URL做身份鉴别,正确的校验用户id及token等; 4、服务器端需校验身份唯一性,访问接口来源验证,不同身份只能查看修改删除添加自己的信息。 |