CSRF
CSRF介绍
causes a user’s Web browser to perform an unwanted action on a trusted site for which the user is currently authenticated.
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29
CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持。
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;呵呵,因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
举个简单的例子,某个bbs可以贴图,在贴图的URL中写入退出登陆的链接,当用户阅读这个帖子之后就会logout了,因为用户以自己的身份访问了退出登陆链接,在用户看来是帖子里面有一张有问题的“图片”,而不是想要退出,但程序就会认为是用户要求退出登陆而销毁其会话。这就是传说中的CSRF攻击了。
CSRF攻击依赖于这样一个事实:许多Web应用程序使用cookie,其终结时间相对较长,从而使用户在通过最初的验证之后仍能访问应用程序。
要使CSRF攻击得逞,潜在的受害者必须使用其浏览器进行验证,并登录到公司的Web应用程序。只要用户没有退出应用程序,浏览器中的应用程序的cookie没被终止,该用户就是CSRF攻击的一个潜在受害者。
#IMG SRC <img src="http://example.com/getcredit.php?give=clay&credit=9999"> #SCRIPT SRC <script src="http://example.com/getcredit.php?give=clay&credit=9999"> #IFRAME SRC <iframe src="http://example.com/getcredit.php?give=clay&credit=9999"> #JavaScript Methods 'Image' Object <script> var obj = new Image(); obj.src = "http://example.com/getcredit.php?give=clay&credit=9999"; </script> #'XMLHTTP' Object, $_POST is vulnerable as shown below #IE <script> var post_data = 'give=clay&credit=9999'; var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST", 'http://example.com/getcredit.php', true); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) xmlhttp.responseText; }; xmlhttp.send(post_data); </script> #Mozilla <script> var post_data = 'give=clay&credit=9999'; var xmlhttp=new XMLHttpRequest(); xmlhttp.open("POST", 'http://example.com/path/file.ext', true); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) xmlhttp.responseText; }; xmlhttp.send(post_data); </script>
【例子1:
<a href="http://bank.com/transfer.do?acct=MARIA&amount=100000">View my Pictures!</a>
Assuming Alice is authenticated with the application when she clicks the link, the transfer of $100,000 to Maria's account will occur. However, Maria realizes that if Alice clicks the link, then Alice will notice that a transfer has occurred. Therefore, Maria decides to hide the attack in a zero-byte image:
<img src="http://bank.com/transfer.do?acct=MARIA&amount=100000" width="1" height="1" border="0">
If this image tag were included in the email, Alice would only see a little box indicating that the browser could not render the image. However, the browser will still submit the request to bank.com without any visual indication that the transfer has taken place.】
【例子2:
为执行CSRF攻击,黑客需要把一个特别伪造的到达公司应用程序的链接放置到其它网页上或放到电子邮件中。但黑客并不把此链接作为一个超级链接,而是将它放在一个图像或脚本标签中,从而隐藏链接,将链接作为图像或脚本的源。
现在,如果受害者在其浏览器中查看包含此图像的网页,或读取包含此链接的电子邮件程序,浏览器会跟踪链接,试图获取图片。如果受害者近来登录过此站点,其浏览器会提供一个用于验证的cookie,告诉浏览器将10万美元从“bob”的账户转移给“mallory”。一般而言,受害人不会知道执行了什么业务(至少在检查其账户余额之前),因为受害人的浏览器在执行业务时并不从bank.example.com那里显示任何反馈(如一个确认网页)。】
【例子3:
网站是通过隐式认证认证用户时,只要不关闭浏览器或者退出,以后访问相同网站时,浏览器会自动在请求中附带上认证信息。如果浏览器被其它网页控制请求了这个网站的URL,可能会执行一些用户不希望的功能。
下面用例子来说明:
假设某个网站(example.com)保存了用户的电子邮件地址信息。并且通过这个邮箱地址实现密码恢复等功能。网站仅采用了Cookie的隐式认证方式来验证用户。用户在验证登录后可以用如下这个URL来更改自己的邮件地址设置:http://example.com/setemail=邮件地址
那么攻击者只要创建一个HTML页面包含以下代码:
< IMG src=“http://example.eom/setemail = 新邮件地址” >
当已经登录过example.com的用户访问这个页面的时候,浏览器就会向example.com发出请求改变用户的邮箱地址。
对于所有使用隐式的认证方式并且没有采取针对CSRF攻击的自我保护措施的网站,几乎都可能存在CSRF漏洞。】
http://blog.csdn.net/flaght/article/details/3873590
CSRF——攻击与防御
http://www.youxia.org/2010/04/CSRF.html
CSRF攻击的原理解析与对策研究
http://hungred.com/useful-information/solutions-crosssite-request-forgery-attacks/