本站点请求伪造(on-site request forgery,OSRF)

本站点请求伪造(on-site request forgery,OSRF)是一种利用存储型XSS漏洞的攻击手法,和跨站伪造请求的概念是一模一样的。当然,要完成OSRF攻击的条件十分苛刻,例如,Feiji 在自己的用户资料中插入了一段存储型Xss的Payload脚本,其中就可以构造我们的OSRF的语句,致使任何查看它的用户在不知情的情况下执行各种操作。从中可以看出,OSRF的苛刻条件有:一是要有存储型Xss、二是要有完成一次CSRF的条件。所以OSRF很少为人所知。

但是,即使在XSS漏洞并不存在的地方,存储型OSRF漏洞仍有可能存在,这一点常被人们忽视。

以一个留言板应用程序为例,它允许用户提交可被其他用户查看的数据。该应用程序使用以下请求提交消息:

这个请求导致以下内容被添加到消息页面中:

 

在这种情况下,网站开发人员会测试其中是否存在XSS漏洞。假设应用程序对插入页面中的任何”<和>字符进行了正确的HTML编码。如果对这种防御方法感到满意,觉得攻击者无论如何也无法避开它,网站开发人员就大错特错了

因为猥琐流黑阔们会这样想:我们将要控制的仅仅是<img>标签目标的一部分内容。虽然无法破坏引用字符串,但是可以修改URL,使得查看消息的任何用户提出任意一个本站点GET请求。例如,在type参数中提交下面的值将会使任何查看消息的用户提出一个尝试创建新的管理用户的请求:

../admin/newuser.php?username=feiji&password=feiji&role=admin#

如果一名普通用户被诱使提出攻击者专门设计的请求,攻击当然不会成功。但是,如果管理员查看消息,攻击者就可以建立一个秘密账户。呵呵,很神奇是吧?但是要找到符合条件的情况真的很少,但是一般找到了往往能够用一招爆菊!!!

注意:

1、即使网站没有Xss漏洞,但攻击者仍然能够执行OSRF攻击。而且,当管理员禁用了Javascript,攻击仍然能够成功。

2、在攻击的字符中,#符终止了.gif后缀前面的URL。但是,只需在后缀前插入一个&,构成另外一个请求参数,即可解决以上问题。

解决办法:

在将其合并到响应中之前,尽可能要严格地过滤用户的输入,即可防止OSRF漏洞。例如在前面的实例中,应用程序除了要检查type参数中是否有特殊值之外,还应该阻止任何包含&|?/与=的请求。

(注意,对这些字符进行HTML编码并不能有效地阻止OSRF攻击,因为浏览器在请求目标URL字符串之前,会对其进行解码

另一中方法的防御和CSRF是一模一样的,但是一般我们用这个方法在后台添加管理员账户,后台的安全防范措施往往会比前台的差很多很多,所以不用担心这个方法爆不了管理员叔叔的菊。

 

利用:

太多太多了,不局限在<img>标签内。各种猥琐的用法就要由各位大黑阔们想出来喔,有了方案记得到我们91ri.org投稿呀。用得比较多的是,用来拿网站后台的账号,让管理员乖乖地帮你添加账号。

 

本文原始思路由腾讯tsrc->siyu提供,参考《黑客攻防技术宝典——web实战篇》

本文由网络安全攻防研究室(91ri.org)原创,转载请注明出处。