Padding Oracle Attack,ASP.NET 最新安全漏洞

如果在ASP.NET中使用了微软默认的表单验证(也叫窗体验证)登陆模式,在请求页面后,ASP.NET会把一些信息写在ViewState中发送给客户端。ViewState本身采用采用base64加密的。base64加密算法是公开的,客户端解码后,搜索解码后的内容,找出其中一些特殊的字符串,网上一段文字如下(参考网上的一篇《详解ASP.NET的最新安全漏洞,Padding Oracle攻击原理及其他》):

Then we decode each Base64 string found. If the result looks random, and its length is a multiple of common block cipher sizes, i.e. 8, 16 or 32 bytes, then there’s a good chance that it is a ciphertext. We also look for common separators, i.e. --, | or :, which are often used to separate IV, ciphertext, or MAC. Then we replace a byte in the last block of the ciphertext by a random value, then send it back to the target, and see what changes in the response. If there is an error message, then there’s a high chance that this is a Padding Oracle.

在ViewState解码后的内容中,有一部分加密字符串,是利用 AES-CBC 加密算法 对 ASP.NET 的 machine key 进行加密得到的。上面引用的一段文字,说明了如何根据cbc加密算法的特征分辨出这段machine key加密后的内容。

AES-CBC加密过程,大概如下:首先对明文进行AES加密,然后把加密后的内容写成 “加密块链”(CBC)的格式,即每8个字节一组,不均匀、不够的部分,根据特定的规则用0填充。这个加密后的内容就称为 padding oracle。

这次的安全漏洞,就是微软的两个工作人员,用padding oracle attack破解了ASP.NET的AES-CBC加密算法。客户端分辨出machine key加密后的内容,然后每次尝试改动最后一个字节,发送给服务器,观察服务器的返回结果。

微软的IIS服务器接收到客户端篡改过的加密内容,会判断是否和发送前的内容符合,如果不符合,就会返回特定的错误码,并给出加密字符串排列(padding)是VALID、INVALID的提示。

客户端根据这些提示,反复尝试,经过 128 * b(b为加密内容的字节数)次尝试后,即可破解出machine key,从而伪造出授权的高权限cookie,可以窃取session、viewstate中的内容,可以获取web应用进程涉及到的敏感数据和文件。

网上的一篇论文( http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.3870&rep=rep1&type=pdf )说明了利用AES-CBC算法的padding oracle漏洞进行破解的原理。

这个漏洞不只是ASP.NET有,采用了类似方法的Web框架都有这个问题,比如Java的JSF框架。微软给出的建议:(1)设置默认的错误页面,并且不要配置特定的错误码页面。即杜绝返回提示客户端加密内容排列INVALID、VALID的信息。(2)在错误页面执行时,让线程随机等待一下:

1 void Page_Load()
2 {
3 byte[] delay = new byte[1];
4 RandomNumberGenerator prng = new RNGCryptoServiceProvider();
5 prng.GetBytes(delay);
6 Thread.Sleep((int)delay[0]);
7 IDisposable disposable = prng as IDisposable;
8 if (disposable != null) { disposable.Dispose(); }
9 }

这是因为直接攻击费时太长,padding oracle攻击利用了IIS的side-channel泄露的漏洞,并不直接等待返回结果,而是从返回结果需要的时间判断每个字节是否破解成功(破解进度与返回时间,两者应该有一定的特定关系,不过尚未查到具体资料)。所以扰乱错误页面的运行时间,也可以阻断padding oracle攻击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值