登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
园子
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
浅谈这次ASP.NET的Padding Oracle Attack相关内容 ...
浅谈这次ASP.NET的Padding Oracle Attack相关内容
[ 复制链接 ]
边书仪
2025-5-29 19:29:52
上一周爆出了一个关于ASP.NET的安全漏洞,有关这个漏洞的第一篇文章应该是ScottGu的说明,但是其中各方面谈的也是语焉不详。由于这个漏洞关系到“安全”这样敏感的话题,其中又涉及到密码学这样常人看不明白的技术,于是导致了各种猜测和推测,其中甚至与我对ASP.NET的了解所有矛盾,因此我觉得也大都不靠谱。中秋休息在家,我简单地了解了一下与这个漏洞有关的内容,总结出了一些“能够说服自己”的内容,在此记录下来。因此,这篇文章的面向读者是那些和我差不多的同学:对ASP.NET有所了解,但对密码学知之甚少。
什么是Padding和Oracle
要谈这个问题,先要了解什么是Padding Oracle Attack。有些文章把Padding和Oracle,与CSS样式表或是那个收购了Sun的甲骨文公司联系起来,这就驴唇不对马嘴了。
Padding在这里的含义是“填充”,因为对于加密算法来说,它们是基于等长的“数据块”进行操作的(如对于RC2,DES或TripleDES算法来说这个长度是8字节,而对于Rijndael算法来说则是16、24或32字节)。但是,我们的输入数据长度是不规则的,因此必然需要进行“填充”才能形成完整的“块”。“填充”时比较常用的是PKCS #5规则,简单地说,便是根据最后一个数据块所缺少的长度来选择填充的内容。
例如,数据块长度要求是8字节,如果输入的最后一个数据块只有5个字节的数据,那么则在最后补充三个字节的0x3。如果输入的最后一个数据块正好为8字节长,则在最后补充一个完整的长为8字节的数据块,每个字节填0x8。使用这个规则,我们便可以根据填充的内容来得知填充的长度,以便在解密后去除填充的字节。
在解密时,如果算法发现解密后得到的结果,它的填充方式不符合规则,那么表示输入数据有问题,对于解密的类库来说,往往便会抛出一个异常,提示Padding不正确。Oracle在这里便是“提示”的意思,和甲骨文公司没有任何关系。
如何进行Padding Oracle Attack
刚才已经提到,如果输入的密文不合法,类库则会抛出异常,这便是一种提示。攻击者可以不断地提供密文,让解密程序给出提示,不断修正,最终得到的所需要的结果。这里的一个关键在于,攻击者所需要的提示仅仅是“解密成功与否”这样一个二元信息,例如它在一个Web程序中可能只是“200 - OK”及“500 - Internal Server Error”这样的表现形式,而不需要其他任何详细信息。
例如,现代流行的Web框架大都是开源的,因此它的加密方式完全透明(当然这点其实并不是必须的,只是大有帮助而已),对于攻击者来说唯一不知道的便是密钥。于是攻击者便可以根据这个加密方式设计有针对性的密文,最终得到密钥(及IV等信息)。在很多时候,一个网站都会使用同样的密钥和IV,于是只需从一个漏洞,便可以在网站的其他方面进行破坏,或解密信息,或绕开验证。
在具体操作上还可以有许多方式进行辅助,在Juliano Rizzo和Thai Duong的《Practical Padding Oracle Attacks》(及此)论文(下文称PPOA)中便提到了很多方式,例如使用Google搜索异常的关键字(这说明许多站点都把异常信息输出在页面上),检查代码,从外表检查一些BASE64形式的字符串,猜测常见的分割符,如“--”,“|”或是“:”等等。PPOA认为,如今Padding Oracle漏洞与SQL注入,脚本注入等漏洞一样无处不在,论文中还详细讨论了利用这个漏洞来攻击eBay拉丁美洲站点,CAPTCHA等应用,以及在JSF(包括Apache MyFaces和Sun Mojarra实现),Ruby on Rails等Web框架中的漏洞——奇怪的是其中反而没有提到ASP.NET。
关于Padding Oracle Attack的具体细节,您可以从《Automated Padding Oracle Attacks with PadBuster》及《Padding Oracle Attacks on CBC-mode Encryption with Secret and Random IVs》两篇文章中得到更详细的信息,它们似乎并不像表面那样高深莫测,尤其是前者,有机会我也打算将它翻译一下。
针对ASP.NET的攻击及其危害
那么,这次又是如何对ASP.NET站点进行攻击的呢?方式有不少,例如攻击者可以为一个需要认证的请求发送自定义的cookie值,如果没有通过认证,则会得到一个转向登陆页面的302跳转。一个更为直观和通用的作法来自于PPOA论文的作者所提供的一段视频,其中使用了WebResources.axd?d=xyz进行探测工作。WebResource.axd有一个特点,便是会对错误的密文(即d=xyz中的xyz)产生500错误,而对正确的密文产生404错误,这便形成了足够的提示。
好,那么假设攻击者已经得到了站点的Machine Key,也就是网站所使用的密钥,那么它又能造成什么危害呢?
一些危害是很容易理解的,例如解密(或注入)ViewState,或是如视频里那样设置一个管理员的cookie。在ScottGu等文章中描述这个漏洞的危害时还提到,这个漏洞可以用来下载web.config等私密文件,这又是如何办到的呢?要知道web.config文件的下载是被IIS和ASP.NET所禁止的,它似乎和加密解密或是Machine Key无关。不过您是否意识到,在ASP.NET 3.5 SP1以后,我们可以利用ScriptManager来打包输出本地的脚本文件?例如:
<CompositeScript>
<Scripts>
</Scripts>
</CompositeScript>
</asp:ScriptManager>
复制代码
这段内容会在页面上放置一段ScriptResource.axd的引用,它的Query String便包含了需要输出的文件路径,它是与ScriptManager等组件完全独立的。那么,如果攻击者告诉它输出“~/web.config”的时候……
有趣的是,PPOA论文作者同时还在今年两月和六月分别提供了攻击CAPTCHA和攻击Apache MyFaces的视频,同时也提供了一个针对JSF的自动攻击工具,不过它们并没有形成微软对ASP.NET的漏洞那样强烈反应。
防止攻击
目前ScottGu给出了多个workaround,归根结底便是消除“Oracle”,也就是提示信息。例如他强调要为404和500错误提供完全相同的反馈——不止是输出的错误页面,也包括所有的头信息(如Server Time等自然除外),这种做法会让攻击者无法得到提示信息,自然也就无法解密了。此外,ScottGu的一些代码同时让错误页面Sleep一小段时间,这也是种常用的混淆手段,让攻击者无法从响应时间长短上来了解这个请求“性质”如何。
从上面的分析中我们可以知道,这种统一错误信息的作法似乎是针对WebResource.axd和ScriptResource.axd的。由于我们知道了攻击的手段,便也可以采取其他作法。例如对于不需要这两个Handler的站点,就把它们从ASP.NET或IIS里直接摘除吧。还有,如果在日志中发现太多CryptographicException异常,便要关注站点是否遭受的攻击。
但是,Padding Oracle Attack的危害之处在于它所需要的信息实在太少,攻击者只需分辨两种状态便可以进行攻击,即便WebResource.axd的攻击被您防止了,那么之前提到的用户认证所带来的302跳转又如何?对于我们独立编写的应用程序来说,要绕开这个问题可以使用各种技巧。但对于微软来说可能就不容易了,因为ASP.NET作为一个框架,它提供的是一种统一的,普适的机制,这也是为什么这个漏洞会影响几乎所有微软ASP.NET产品的缘故。
此外还有一些做法也是可取的。例如:
避免在ViewState和Cookie中存放敏感数据。
不要过度依赖Machine Key。
在认证cookie里保存的不只是用户名,而是外界无法得知的ID,或是同时保存checksum等额外的验证信息。
为ScriptResource.axd写一个Wrapper,只让它输出扩展名为js的内容。
这些做法的目的是:即使攻击者得到了Machine Key,也无法对站点造成破坏。
总结
安全性漏洞总是不令人愉快的,但是在遇到这种状况的同时,我们也要努力得知问题的真实情况。在如今信息爆炸的时代,产生和获取一条没有多大价值甚至是错误的信息,可谓是非常容易的。排除干扰寻求真相,即便只是种态度和意愿,也是一名技术人员的基本素质。因此在这个问题上,我最反感的便是“微软的产品就是不安全”,“反正我不会被攻击”这样的态度。
原文地址:《浅谈这次ASP.NET的Padding Oracle Attack相关内容》
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
如何优雅的使用RabbitMQ
分布式锁1 Java常用技术方案
浅谈我对DDD领域驱动设计的理解
游戏编程十年总结(下)
【前端性能】高性能滚动 scroll 及页面渲染优化
验证码对抗之路及现有验证机制介绍
从零开始入门 K8s | 手把手带你理解 etcd
中文写程序,何陋之有?
NHibernate之旅(2):第一个NHibernate程序
公司的中场
Android 系统缺陷不完全点评
谈谈如何从本质上理解sql语句, 存储过程,ORM之间的联系和取舍。
FFmpeg开发笔记(六十二)Windows给FFmpeg集成H.266编码器vvenc
.net环境下跨进程、高频率读写数据
第二个iPhone应用程序:“Say Hello”
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
[一步一步MVC]第一回:使用ActionSelector控制Action的选择
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
边书仪
2025-5-29 19:29:52
关注
0
粉丝关注
10
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9988
处匈跑
9998
斜素欣
9996
4
森萌黠
9996
5
堵赫然
9996
6
凶契帽
9996
7
柴古香
9996
8
背竽
9996
9
恐肩
9994
10
都硎唷
9994
查看更多