作者:古月蓝旻
CSRF (Change Password)--low
CSRF一直为称为“沉睡的巨人”,在OWASP 2013排名第八,很多人说是被低估了,其实CSRF之所以排名无法那么靠前主要由于几方面:
1. CSRF的发生点是否重要,比如修改密码、修改信息处的CSRF往往很重要,但是一些无关紧要功能的CSRF就会比较鸡肋。
2. 单个CSRF漏洞在多数时候需要与用户交互才能触发;
3. 有时候需要使用钓鱼手法让用户进行操作,钓鱼设计的好坏影响改漏洞是否会让用户中招;
4. 一旦页面的重要功能有二次确认、token机制、验证referer或者验证码机制,CSRF往往瞬间失效;
之前有小伙伴在理解CSRF漏洞时,会和XSS以及越权弄混淆
比如一处修改密码的漏洞
CSRF主要需要将修改密码的请求页面发送给用户,用户点开发送GET/POST请求,利用用户身份发送该请求才会生效;
仅在存在CSRF的功能点处能利用
XSS主要是通过窃取用户cookie,伪造成为用户身份,执行用户操作
几乎可以完成用户所有登录后的操作
越权主要是可以平级/低级用户甚至未登录用户身份,执行某操作,无需用户交互
仅在存在越权的功能点处能利用
好了,说了这么多,也该回归正题了
我们看一下题目,可以在本页面重置自己的密码
好了,我们用burp自带的创建CSRF的poc工具试验一下
好了,我们先测试一下越权,换一个没有登录过帐号的浏览器试一下能不能以未登录的身份修改密码
单击以后直接跳转到登录页面,果然是没有的,测试一下CSRF,以已登录的用户试验一下呢?
单击以后修改成功,注意一下,这里是真的可以改密码的,别乱改,否则只能去数据库(????)??嗨
我们看一下源码里面是怎么回事
在low级别下,没有做任何验证就把GET传来的密码直接给当前请求用户更新了...
那么medium/high是怎么做的
多了一个当前密码框,这个逻辑和我们大多数改密码的逻辑是一样的,先证明你是帐号的主人
CSRF (Change Secret)--low
和上面没啥本质区别,GET换成了POST,构造还是一样的
自然可以轻易修改成功
好了,这题我们主要看下medium/high级别下是如何防护的
果然增加了token机制,先看请求里的token字段和生成的会话变量token是否相同,相同的情况才能改密码,那么token怎么生成的
取了0到100000间的唯一随机数ID,然后计算其SHA1作为token,破解起来还是比较麻烦的
但是这样增加token,CSRF漏洞真的无解了吗?也不是,其实配合XSS可以拿到token
CSRF (Transfer Amount)--low
CSRF转账漏洞可谓是CSRF漏洞教科书第一课内容,看着本题的架势,我是可以向任意用户转账任意金额,且改请求可以多次重放
看下源码
medium和high级别下果然也是增加token机制来防
CSRF漏洞到这里结束,但是你如果仔细留意,这里还有业务逻辑漏洞
$_SESSION["amount"] = $_SESSION["amount"] - $_GET["amount"];
无论是low还是high,转账的语句就这一句,既没有验证帐户余额,也没校验转账金额正负,所以....
转100w是可以的
转-100w也是可以的
当然一个demo,我们也不能要求太多,只是以后代码审计遇到这种问题可以多考虑考虑
3道题很快就结束了,也写了7w+,快了
还不快抢沙发