【笔记】网易微专业-Web安全工程师-04.WEB安全实战-4.CSRF

某天你登陆了某银行的网上银行,正在欣赏自己的余额,突然接收到一个QQ消息,“XX大学校花全裸照”。你兴奋地点击链接一看,照片是草地上一朵小花,背后是XX大学的大门。你生气地关掉了网页,过了几分钟,突然收到银行转账成功提醒短信!这可能就是中了CSRF的招。

CSRF(Cross-site request forgery):跨站请求伪造,是指攻击者伪装成受害者向服务器进行请求,利用的是受害者尚未生效的身份认证信息,如cookie,session等。

 

DVWA实战:

1. 打开phpStudy或xampp,运行Apach和MySQL;

2. 浏览器进入DVWA主界面,在左侧栏选择DVWA Security安全等级为Low,然后进入CSRF;

作为用户,当你输入新密码提交后,就能完成密码修改,那怎么才能在不知不觉中修改掉你的密码呢?

3. 这里我们需要利用一下Firefox的插件TamperData,搜索安装之后打开,看到如下页面:

我们通过浏览器的每一笔请求,都会被TamperData记录。我们可以看到当我们改密码的时候,请求头里的Referer是如下信息:

Referer=http://localhost/DVWA-1.9/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change

因此,如果我们能构造同样的报文头,改掉其中的password_new和password_conf,向服务器发送请求,就能改掉该用户的密码,而TamperData就能帮我们做到。

4. 点击TamperData菜单的Start Tamper,这样当用户提交修改密码请求时,我们能拦截下这一请求,并修改其中的内容(tamper),例如:我们把Referer里的密码修改为password3,然后submit,这时收到返回200,说明修改成功。

5. 当然,我不可能坐在你面前,等待你每次提交用户,然后把它拦截下来修改。但是,如果我发给你一个链接:

http://localhost/DVWA-1.9/vulnerabilities/csrf/?password_new=password3&password_conf=password3&Change=Change

当你正在浏览dvwa页面,cookie未过期时点击了它,那么就会不知不觉中密码被改成password3。

6. 不过正常的人看到这样的链接,肯定不敢轻易去点,那么如果是短链接形式呢?t.cn/Dvwa,也许你就不小心点了。更进一步,如果我在自己的服务器构造了一个页面,加载onload的时候就自动完成请求,然后用美女图片诱骗你来点击,就像文章最前面描述的那样,应该很多人会中招吧!

7. 上面就是一个简单的CSRF,接下去我们把安全等级切换为medium,在自己的机器上采用拦截修改的方式仍然能成功,但是如果采用黑客服务器构造页面诱骗受害者点击的方式,方法失效。查看后台源码,关键的一行:

    // Checks to see where the request came from
    if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {

发现后台对Referer中是否与主机Host名一致,换言之,对服务器的请求必须来源于服务器的页面,即请求来源不允许跨站!那么跨站时应该怎么办?

这里既然只是单纯要求Referer中包含主机名,那么虽然我的主机名是128.199.242.5,但是我可以把我的文件夹或者html文件命名为真正的主机名,那么在Referer中就会带上真正主机名,就可以通过检测啦。

http://128.199.242.5/hack/localhost.html

8. 接下去,我们调高安全等级为high,我们发现前面的方法不管用了,查看后台源码,发现多了Token的生成和校验:

// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
......
// Generate Anti-CSRF token
generateSessionToken();

多么熟悉的身影.....,记得我们在第4章第2节里介绍暴力破解时曾经介绍过Token的功能和破解,因此如果能够通过用户的cookie获得每一次服务器返回的token,问题就迎刃而解。但是目前浏览器都不允许跨站请求,因此企图在自己服务器构造页面获取用户token比较难,所以一种思路是结合之后的XSS获取token。

9. 最后我们来看看impossible等级的CSRF,当切换后,我们发现输入框里多了一栏,“原始密码”,攻击者在不知道用户密码的情况下很难通过跨站伪造请求。

 

实战心得:

CSRF本质是利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。有效的防护措施就是不要轻易点击任何不可信的链接和图片,服务器也可通过token和需要提供原始信息的方式来提高安全等级。

posted @ 2018-02-24 20:52  KPlayer  阅读(518)  评论(0编辑  收藏  举报