绕过CSRF防御的一种方法
作者:xisigr
CSRF产生的本质在于,WEB主要依赖于使用cookie来传递令牌。只要WEB应用程序依赖于HTTPcookie来传递会话令牌,那么本身就存在攻击的可能性。所以,Monyer着手从cookie上面来防御CSRF的思路还是很赞的。
Monyer的两篇文章:
http://hi.baidu.com/monyer/blog/item/6097347a958babe62e73b3bf.html
http://hi.baidu.com/monyer/blog/item/00427989bbf8edb80e244420.html
防御CSRF现在最普遍的方法是使用token。通常,在第一阶段应用程序在一个隐藏的表单字段中放入一个token;在第二个阶段,程序确认这个 token是否被提交。由于CRSF是单向性的,因此实施攻击的WEB站点无法从第一个阶段获取到token,然后再第二阶段提交。如果程序使用这两个步骤,但并不保证token安全,那么这种防御就是形同虚设,因此CSRF攻击者只需轮流提出两个必要的请求,或是直接进入第二个求情。
现在例举在JSP和ASP.NET平台下,绕过CSRF保护的一种方法。
一个简单的升级Email ID的例子,服务端程序使用了token来防止csrf攻击:
客户端:
1 2 3 4 5 |
<span style="color: #ff0000;"><form method="POST"> <input type="text" name="email" value=""></input> <input type="hidden" name="csrf-token" value="a0a0a0a0a0a"/> </form></span> |
服务端:
1 2 3 4 5 6 7 8 9 10 |
<span style="color: #ff0000;">if ( request.parameter("email").isSet() && request.parameter("csrf-token").isValid() ) { //process the form and update the email ID } else { //display an empty form to the user (CSRF token included) }</span> |
1 2 3 4 |
假设通过某些方法(例如:ClickJacking),攻击者在页面中插入下面一段代码: <span style="color: #ff0000;"><iframe src="http://www.example.com/updateEmail.jsp?email=evil@attackermail.com"></span> |
然后使用ClickJacking发送到服务器请求。请求提交内容为:
1 2 3 4 5 6 7 8 9 |
<span style="color: #ff0000;"> POST /updateEmail.jsp?email=evil@attackermail.com HTTP/1.1 Host: www.example.com email=&csrf-token=a0a0a0a0a0</span> |
在POST数据中email的参数是空。
现在我们请求了两个“email”参数,一个在POST中,一个在QueryString中。当服务端request.parameter(“email”)时,取出的将是QueryString中的数据,而不是POST中的。这样我们就更新了攻击者的Email。
相关资料:http://blog.andlabs.org/2010/03/bypassing-csrf-protections- with.html (在这篇文章中,作者是想通过ClickJacking和HPP这两种攻击方式的组合来绕过CSRF防御,但我们不要陷入ClickJacking和 HPP这两概念上,只要看到过程和结果都是正确的就好。)
没有评论
暂无评论
RSS feed for comments on this post.
对不起,该文章的评论被关闭了!