参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.htmlphp
CSRF,中文名字,跨站请求伪造,听起来是否是和XSS差很少?区别就在于,CSRF并无盗取cookie而是直接利用。通俗的来讲,就是攻击者盗用了你的身份,在你不知情的状况下执行一些违法操做,好比密码修改,增长管理员,转帐等敏感操做,危害很大。html
这里已DVWA为例,经过实例演示本身的学习过程。对DVWA陌生,而且想了解搭建一下的,能够参考这篇文章 https://www.cnblogs.com/lxfweb/p/12678463.html mysql
打开DVWA,选择CSRF,先从最低级别的low开始,查看源代码web
经过查看发现,代码中,password_new,password_conf,两个参数没有作任何防御,这样是至关危险的,若是攻击者对受害者的这套程序很熟悉,能够很轻易的构造连接,只要攻击者一点击这个连接,就会触发CSRF攻击。这是DVWA修改密码的连接 http://www.test.com/DVWA-master/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change# 受害者只要带登录状况下点击这个连接(同一浏览器),密码就会被修改成12345678,不过这连接一看就是改密码的,基本不会有人点,因此须要我们精心构造一下,这里以burpsuite演示。进去修改密码页面,抓包。sql
点击Generate CSRF PoC burp会构造简单的一个页面,如图浏览器
接下来,将构造的网址复制到浏览器,就会有一个按钮,用户点击就会触发CSRF攻击,密码被修改。安全
不过这个作法也有些粗糙,点击完,会自动跳转到,密码修改的页面,受害者就知道密码被修改,服务器
参考上面提到的文章里面的思路,那就是隐藏img src 标签,再能够精心构造一个错误页面,让受害者认为这是一个无效的URL,但已经进行了CSRF攻击。构造的代码以下cookie
下面看一下中级的DVWA部分源代码截图,看作了什么防护。ide
能够看到,中级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名)抓包看一下,通俗的讲,不在本域的请求,就会拒绝访问。
那该如何绕过呢,这个,只须要将我们构造的页面名字改成受害者的主机名便可,如上图,至于要将名字改成 www.test.com.html,就能够绕过啦。
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪一个地址。在处理敏感数据请求时,一般来讲,Referer字段应和请求的地址位于同一域名下。可是这样的方式,也是不安全的,上文中已经讲解了,如何绕过Referer字段的检查。
因为CSRF的本质在于攻击者欺骗用户去访问本身设置的地址,因此若是要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,而且攻击者没法伪造的数据做为校验,那么攻击者就没法再运行CSRF攻击。这种数据一般是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端经过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器可以正确获得并传回这个伪随机数,而经过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会由于校验token的值为空或者错误,拒绝这个可疑请求。
在这种状况下,攻击者在不知道原密码的状况下是没法进行CSRF攻击的。