CSRF攻击
什么是cross-site request forgery
Cross-site request
forgery:跨站请求伪造,也被称成为“one click attack”或者session
riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相
左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其
进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
示例和特性
CSRF攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户
Alice
也在此论坛中,并且后刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,
并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交 这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。
CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack)。在上面银行示例中的代理人是Bob的web浏览器,它被混淆后误将Bob的授权直接交给了Alice使用。
下面是CSRF的常见特性:
- 依靠用户标识危害网站
- 利用网站对用户标识的信任
- 欺骗用户的浏览器发送HTTP请求给目标站点
- 风险在于那些通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。
- 使用图片的CSRF攻击常常出现在网络论坛中,因为那里允许用户发布图片而不能使用JavaScript。
防范措施
对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
另一个可选的方法是“双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的
cookie在form.
post之前正被JavaScript代码读取,那么限制跨域规则将被应用。如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那
么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。
与通常的信任想法相反,使用Post代替Get方法并不能提供卓有成效的保护。因为JavaScript能使用伪造的POST请求。尽管如此,
那些导致对安全产生“副作用”的请求应该总使用Post方式发送。Post方式不会在web服务器和代理服务器日志中留下数据尾巴,然而Get方式却会留
下数据尾巴。
尽管CSRF是web应用的基本问题,而不是用户的问题,但用户能够在缺乏安全设计的网站上保护他们的帐户:通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。
影响CSRF的因素
CSRF攻击依赖下面的假定:
- 攻击者了解受害者所在的站点
- 攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie
- 目标站点没有对用户在网站行为的第二授权
在OWASP上对他的描述是:
Cross-Site Request Forgery (CSRF) is an attack that tricks the victim
into loading a page that contains a malicious request. It is malicious
in the sense that it inherits the identity and privileges of the victim
to perform. an undesired function on the victim’s behalf, like change the
victim’s e-mail address, home address, or password, or purchase
something. CSRF attacks generally target functions that cause a state
change on the server but can also be used to access sensitive data.
For most sites, browsers will automatically include with such
requests any credentials associated with the site, such as the user’s
session cookie, basic auth credentials, IP address, Windows domain
credentials, etc. Therefore, if the user is currently authenticated to
the site, the site will have no way to distinguish this from a
legitimate user request.
In this way, the attacker can make the victim perform. actions that
they didn’t intend to, such as logout, purchase item, change account
information, retrieve account information, or any other function
provided by the vulnerable website.
Sometimes, it is possible to store the CSRF attack on the vulnerable
site itself. Such vulnerabilities are called Stored CSRF flaws. This can
be accomplished by simply storing an IMG or IFRAME. tag in a field that
accepts HTML, or by a more complex cross-site scripting attack. If the
attack can store a CSRF attack in the site, the severity of the attack
is amplified. In particular, the likelihood is increased because the
victim is more likely to view the page containing the attack than some
random page on the Internet. The likelihood is also increased because
the victim is sure to be authenticated to the site already.
Synonyms: CSRF attacks are also known by a number of other names,
including XSRF, “Sea Surf”, Session Riding, Cross-Site Reference
Forgery, Hostile Linking. Microsoft refers to this type of attack as a
One-Click attack in their threat modeling process and many places in
their online documentation.
具体原文可以参考:
http://www.owasp.org/index.php/Cross-Site_Request_Forgery
http://en.wikipedia.org/wiki/Cross-site_request_forgery