Hashsql注入攻击防御如何防御

只需一步,快速开始
后使用快捷导航没有帐号?
查看: 1709|回复: 3
内网渗透防御:如何防御Hash注入攻击
TA的每日心情慵懒 11:42签到天数: 303 天[LV.8]以坛为家I
本帖最后由 qq 于
01:01 编辑
渗透测试人员对Pass-the-Hash(PtH)攻击都很熟悉。我们常在渗透测试中用到它。如果你的职责包括网络**防御,你至少应该了解其攻击方法。不管你有多少经验,你对问题了解得可能不深,或许还不知道它是怎么解决的,注意是“解决”而不是“修复”。
攻击者通过一定办法获取了Windows计算机的本地管理员权限,可以在内存中寻找其它本地或域内账户登录后的hash,因为电脑正在运行。这些hash可以“传递”(不需要破解)给其它的计算机或者服务,作为一种认证方法。
这意味着,一开始只攻破一个看起来不重要的服务器或工作站,由于域管理员账户为了执行一些支持任务,登录了这个机器,就可以在更高的水平攻破整个域。
考虑下面比较常见的场景:
一个主机被攻陷(没重要价值)。
但是本地administrator账户和其它所有主机的密码相同。
攻击者从内存中获取了所有的hash,域管理员账户并不在里面。攻击者获取了所有的本地hash,包括administrator账号的。
攻击者使用获取的本地administrator的hash,利用PtH登录了其它的主机,然后重复这个过程(也被称为hash喷射攻击)。在这个过程中,会得到一个本地和域用户的hash列表。
最终,一个主机会在内存中包含一个有权限的域账户,可以用于访问数据库,文件服务器,以及域控制器,然后再次使用PtH。
PtH并不是一个漏洞利用技术,它是Microsoft Windows提供的一个特性。因此,没有补丁。降低PtH攻击的风险是可以的,但是它需要对认证权限横向隔离。
域中对权限横向隔离
降低PtH攻击的风险,实际上是给管理员账户赋予有限的安全边界的问题。或者可以这样理解,最小化所有支持和管理账户的访问范围。
要遵守的策略是,尽量减少黑客获取域内账户之后攻破其它服务器或主机的数量。
比如,攻破一个开发主机之后,不应该泄漏开发服务器(或者产品服务器,或者其它主机,或者域控制器)上的管理员账户。
下面是需要遵守的几个降低PtH攻击风险的步骤:
第0步:基础
确保所有的服务器、主机、笔记本或者其它开放网络端口的设备都安全加固了,确保禁用LM hash。
确保设置了非常强的密码策略。
请不要在任何地方重用密码,包括服务器或administrator账号。不要为服务账号设置简单的密码。
确保所有的本地administrator密码都是唯一的。
这将使攻击者在你的网络难以立足。没有hash就无法实施PtH攻击。
应该定义安全边界,比如HR主机,开发主机,财务笔记本,DMZ服务器,测试服务器等等。越多越好。每个安全边界都应该设置一个对这个组里的所有主机有管理员权限的域账户(绝不可以是administraotr)。这个用户应该配置成不能访问其它主机或服务,最重要的是它不能是网络中其它任何设备的管理员。
这样做的原理是,攻破一个安全边界里的机器,并不会泄漏其它的安全边界。这是因为,任何被攻陷的高权限账号都无法访问其它边界内的主机。
域administrator用户只能用于访问域控制器。每次使用这个账户都会留下一些痕迹,缓存的账号或者是LSA密钥等等。
如果攻击者想办法攻破了域控制器,那么游戏就结束了。所有的hash都可以提取,那时,PtH就变成了一个小问题。
服务账户应该一事一议来考虑,只分配服务正常工作需要的权限。这在PtH攻击方面很有风险,我们经常利用它。
hash注入是我们在渗透测试中常用的方法。它是网络渗透和扩展(可能也有提权)的一个有效办法。
正如前面讨论的,hash注入并不是一个漏洞,但是是微软提供的一个会被滥用的特性。因此,它无法修复,但是可以降低风险。
这需要对域网络有一个合理的安全管理办法。
微软在2012年和2014年发表了两篇文章,名为《Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft Techniques》和《Mitigating Pass the Hash Attacks and Other Credential Theft, version 2》,非常有趣也非常有用,链接如下:
Pass-the-Hash (PtH) – https://technet.microsoft.com/en-us/dn785092.aspx
最好使用网络访问控制,把访问管理服务(以及服务器)的权限限制在需要的主机上,这不是银弹但却有用。
TA的每日心情慵懒 11:42签到天数: 303 天[LV.8]以坛为家I
TA的每日心情无聊 20:57签到天数: 71 天[LV.6]常住居民II
收藏一下!!
TA的每日心情郁闷昨天&11:56签到天数: 18 天[LV.4]偶尔看看III
这个可以有
新年新气象!管理组对外招聘公告
手机扫我进入移动触屏客户端
关注我们可获取更多热点资讯
Honor accompaniments. theme macfee没有更多推荐了,
不良信息举报
举报内容:
如何防止SQL注入攻击
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!05-1502-1602-1602-1602-1602-1602-1602-1602-1602-16最新范文01-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-01黑客协会:Hash注入攻击中的渗透攻防
hash写入并不是一个缝隙,可是是微软供给的一个会被乱用的特性。因而,它无法修正,可是能够下
Hash注入攻击中的渗透攻防,ok,发了几篇文章,发现福利加在底部都很少人看,直接推荐吧。
攻击者小白门最喜欢的就是使用工具了,工具之后还有手工注入攻击,以及防御,技巧都会讲解,讲案例和操作,花无涯带你走进黑客世界【2017上半年技术文章合集】。
请点击此处输入图片描述
Windows Credentials Editor (WCE)是一款功能强大的windows平台内网渗透工具,它可以列举登陆会话,并且可以添加、改变和删除相关凭据(例如:LM/NT hashes)。这些功能在内网渗透中能够被利用,例如,在windows平台上执行绕过hash或者从内存中获取NT/LM hashes(也可以从交互式登陆、服务、远程桌面连接中获取)以用于进一步的攻击。,而且体积也非常小,是内网渗透手必备工具。
Hash注入攻击中的渗透攻防
请点击此处输入图片描述
在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。
举个栗子:
我们登陆新浪微博的时候都需要输入密码,那么新浪微博如果明文保存这个密码,那么黑客就很容易窃取大家的密码来登陆,特别不安全。那么新浪微博就想到了一个方法,使用hash算法生成一个密码的签名, 新浪微博后台只保存这个签名值。
由于hash算法是不可逆的,那么黑客即便得到这个签名,也丝毫没有用处;而如果你在网站登陆界面上输入你的密码,那么渣浪后台就会重新计算一下这个hash值,与网站中储存的原hash值进行比对,如果相同,证明你拥有这个账户的密码,那么就会允许你登陆。银行也是如此,银行是万万不敢保存用户密码的原文的,只会保存密码的hash值而而已。
都有提到,渗透测试人员对Pass-the-Hash(PtH)攻击者都很了解。咱们常在渗透测试中用到它。假如你的责任包含网络侵略防护,你最少应当了解其攻击者方法。不论你有多少经验,你对疑问了解得也许不深,或许还不知道它是怎样处理的,留意是“处理”而不是“修正”。
攻击者经过必定方法获取了Windows计算机的本地办理员权限,能够在内存中寻觅其它本地或域内账户登录后的hash,由于电脑正在运行。这些hash能够“传递”(不需求破解)给其它的计算机或许效劳,作为一种认证方法。
这意味着,一开始只攻破一个看起来不主要的效劳器或工作站,由于域办理员账户为了履行一些支撑使命,登录了这个机器,就能够在更高的水平攻破全部域。
思考下面比较多见的场景:
一个主机被攻陷(没主要价值)。
可是本地administrator账户和其它一切主机的暗码一样。
攻击者从内存中获取了一切的hash,域办理员账户并不在里面。攻击者获取了一切的本地hash,包含administrator账号的。
攻击者运用获取的本地administrator的hash,运用PtH登录了其它的主机,然后重复这个进程(也被称为hash喷发攻击者)。在这个进程中,会得到一个本地和域用户的hash列表。
终究,一个主机会在内存中包含一个有权限的域账户,能够用于拜访数据库,文件效劳器,以及域操控器,然后再次运用PtH。
PtH并不是一个缝隙运用技术,它是Microsoft Windows供给的一个特性。因而,没有补丁。下降PtH攻击者的危险是能够的,可是它需求对认证权限横向阻隔。
域中对权限横向阻隔
下降PtH攻击者的危险,实际上是给办理员账户赋予有限的安全鸿沟的疑问。或许能够这么了解,最小化一切支撑和办理账户的拜访规模。
要恪守的战略是,尽量削减黑客获取域内账户以后攻破其它效劳器或主机的数量。
比方,攻破一个开发主机以后,不应当走漏开发效劳器(或许商品效劳器,或许其它主机,或许域操控器)上的办理员账户。
下面是需求恪守的几个下降PtH攻击者危险的过程:
第0步:根底
保证一切的效劳器、主机、笔记本或许其它敞开网络端口的设备都安全加固了,保证禁用LM hash。
保证设置了十分强的暗码战略。
请不要在任何地方重用暗码,包含效劳器或administrator账号。不要为效劳账号设置简略的暗码。
保证一切的本地administrator暗码都是仅有的。
这将使攻击者在你的网络难以安身。没有hash就无法施行PtH攻击者。
应当界说安全鸿沟,比方HR主机,开发主机,财务笔记本,DMZ效劳器,测试效劳器等等。越多越好。每个安全鸿沟都应当设置一个对这个组里的一切主机有办理员权限的域账户(绝不能够是administraotr)。这个用户应当装备成不能拜访其它主机或效劳,最主要的是它不能是网络中其它任何设备的办理员。
这么做的原理是,攻破一个安全鸿沟里的机器,并不会走漏其它的安全鸿沟。这是由于,任何被攻陷的高权限账号都无法拜访其它鸿沟内的主机。
域administrator用户只能用于拜访域操控器。每次运用这个账户都会留下一些痕迹,缓存的账号或许是LSA密钥等等。
假如攻击者想方法攻破了域操控器,那么游戏就完毕了。一切的hash都能够提取,那时,PtH就变成了一个小疑问。
效劳账户应当一事一议来思考,只分配效劳正常工作需求的权限。这在PtH攻击者方面很有危险,咱们常常运用它。
结论(中国黑客协会官网)hash写入是咱们在渗透测试中常用的方法。它是网络渗透和拓展(也许也有提权)的一个有用方法。正如前面提到的,hash写入并不是一个缝隙,可是是微软供给的一个会被乱用的特性。因而,它无法修正,可是能够下降危险。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
中国黑客协会是一种精神的传承,黑客代表是一种精神,它是一种热爱祖国、坚持正义
创作了第一本书,作为小白入门黑客精品读物,将亲身经历和自身所学精华分享在书中
今日搜狐热点你的数字签名会被撞破么?安全Hash的攻与防 - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
你的数字签名会被撞破么?安全Hash的攻与防
共369415人围观
,发现 1 个不明物体
安全hash函数在信息系统中有相当广泛的应用,特别是用于消息签名来保护消息的完整性和不可抵赖性等任务,可以说安全hash函数是现代应用密码学最重要的基石之一。
如果安全hash函数出现安全问题,那么整个应用密码体系乃至整个互联网的安全都受到严重影响,包括软件发行、网络支付、设备升级等等。安全hash函数面临的最大技术安全威胁是同谋碰撞攻击,但我们也发现国内不少厂家的自制协议中存在着大量不正确的安全hash应用,导致可以利用简单的方法攻破其防护。
近些年随着计算机性能的提高,针对 MD5、SHA1 函数的碰撞攻击研究也进展迅速。而国内由于现实情况,替换MD5/SHA1的代价高昂,很难在短期内能解决。MD5/SHA1
碰撞究竟会对现有的信息系统产生哪些威胁?本文对 MD5/SHA1 的碰撞攻击及其应用场景进行讨论,给出了具体的攻击实例,同时给出了缓解措施。我们指出,在进行严格的约束消除同谋碰撞的条件下,要攻破MD5/SHA1依然是一个非常艰巨的任务。尽管如此,这样的机制只是给了厂商难得的喘息时间,我们依然督促各厂商尽快升级到更安全的HMAC-SHA256。
1.MD5/SHA1算法简介
密码学中的安全 hash 函数与普通的 hash 函数有着相当大的区别。在典型数据结构hash_map、hash_set中所用到的hash函数,只需要将key映射为一个索引即可,即使产生了碰撞,也可以采用开散列或者闭散列的方式进行处理。密码学中的安全hash函数[1]要求则严格的多,至少需要满足三个性质:(1)抗碰撞攻击(2)抗原根攻击以及(3)抗第二原根攻击。抗碰撞攻击是指,寻找两个不同的串x和y,使得hash(x)=hash(y)是困难的。抗原根攻击是指,在hash(x)=s中,已知s,求x是困难的。抗第二原根攻击是指,已知hash(x)=s,求一个异于x的串y,使得hash(y)=s是困难的。只有满足了以上三点的hash函数才有资格成为安全hash函数。
MD5/SHA1是用途非常广泛的安全hash函数。他们的输入是任意串,输出是128/160bit长的散列值。MD5和SHA1在1992年和1993年被发明出来,在相当长一段时间内,他们被认为是安全的。2004年和2005年,研究者发现了对他们的攻击方法,减少了特定情况下发现碰撞的计算代价。在2007年首次提出了利用MD5碰撞伪造CA证书的理论方法,2008年这种攻击方法得到了验证,攻击者成功伪造了合法的CA证书。而针对SHA1的攻击方法则一直停留在理论中,直到2017年初,对SHA1的成功碰撞攻击才首次公开出来。
这里简要描述MD5的计算过程,以便读者理解。SHA1的计算过程十分相似:
首先,加入补位,使之bit长度模512的余数为448(512-64)。接下来将长度表示为小端序,附在后面(大于64bit只取低64bit)。此时bit长度是512的倍数。接下来依次处理每个512bit的块。在处理过程中不断更新MD5的内部状态(128bit)。在处理完所有的块后,将其内部状态输出,作为最后的散列值。
2.针对安全hash的碰撞攻击
在某些情况下,攻击者需要构造一个串y使得hash(y)为一指定的值s。此时攻击者只能控制y,那么此时若要寻求一个满足hash(y)=s的实例,则属于原根攻击。对MD5/SHA1的原根攻击目前尚无好的计算方法,只能依赖彩虹表、字典或蛮力搜索,攻击复杂度相当高(MD5的状态空间是2^128,蛮力搜索要计算2^128次MD5)。
在另外一些情况下,攻击者可以同时控制两个输入串x和y,使得hash(x)=hash(y),从而欺骗基于hash的验证系统。这种情况我们称为“同谋碰撞”。同谋碰撞是可以使用“生日攻击”大幅度减少运算量的。以MD5为例,借用生日攻击,我们不需要枚举所有128bit的串计算MD5值以求碰撞,只需要计算2^64次MD5值即可有50%的几率找到这样的x和y。&
MD5/SHA1碰撞具有添加后缀依然碰撞的性质:
若hash(A)=hash(B),则hash(A+S)=hash(B+S)
但是并不满足增加前缀的性质,即
hash(A)=hash(B)推不出hash(S+A)=hash(S+B)
2.1长度扩展攻击
由碰撞的后缀延伸特性导致的一种简单易行的攻击是长度扩展攻击(Length Extension Attack) [4]。例如,某些基于MD5的协议使用了如下形式的签名值
sign =hash(secret + message)
其中的secret是密钥。在计算出签名值sign后,客户端将sign和message一起提交给服务端。在某些情况下,攻击者可以同时获得签名值sign和明文message,并且拥有在明文尾部附加任意串的能力。此时,攻击者可以直接利用MD5的性质,在明文尾部附加恶意部分s,并直接从原MD5值计算
sign' =hash(sign, s) = hash(secret + message + s)
这样构造出来的新请求message+s拥有合法的签名sign’,因此是能够通过MD5签名校验的,但是包括了攻击者注入的恶意部分s。这种攻击在某些CTF题目中也有涉及 [5]。在某些情况下长度扩展攻击可以用于绕过基于MD5的身份认证 [6]。由于SHA1或者其他的安全Hash大部分具有这样的性质,所以将MD5调换为SHA1或其他安全Hash也大都是无效的。
所有可能被长度扩展攻击的数字签名协议应该立即升级成第四节中所述的HMAC-SHA256算法,因为有很大可能黑产已经在享用你的服务了。
2.2前缀碰撞攻击
对于MD5/SHA1更复杂的攻击目前主要有共同前缀碰撞攻击(Identical PrefixCollision)和选择前缀碰撞攻击(Chosen Prefix Collision)。共同前缀攻击是构造两个不同的消息s1和s2,他们由相同的前缀,和不同的尾部“碰撞块”组成。前几天震惊世界的SHAttered攻击是对SHA1进行的共同前缀攻击。选择前缀攻击则是构造两个不同的消息s1和s2,他们不必有共同的前缀,但是经过在尾部附加不同的“碰撞块”后,两个消息的散列值相同。选择前缀攻击是包括共同前缀攻击的,因此共同前缀的攻击代价小于选择前缀攻击。在Marc
Stevens(SHAttered作者)2009年的文章中对此类攻击的计算代价总结如表1。
表1:MD5和SHA1的两种不同攻击的计算代价
这里的单位是需要计算的hash的次数。例如2004年之前,对MD5的平凡攻击(生日攻击)需要蛮力计算2的64次方次md5 hash。在2009年时,对于MD5的共同前缀攻击计算代价是2的16次方次MD5 hash,对SHA1的则是2的52次方。不难看出,无论是共同前缀攻击,还是选择前缀攻击,都可以被应用在同谋碰撞攻击中。由于共同前缀攻击和选择前缀攻击的研究进展迅速,同谋碰撞攻击逐渐成为数字签名体系最大的威胁。
计算复杂度和最后构造出的碰撞结构有很大关系。对于共同前缀碰撞攻击,由王小云教授提出的攻击方法需要构造两个碰撞块,第一个碰撞块由生日攻击得到,目的是使得计算完第一碰撞块后的hash内部状态的差分满足特定形式。第二个碰撞块则由对差分路径的搜索得到。因此构造共同前缀碰撞攻击只需要两个碰撞块。对于选择前缀碰撞攻击,需要构造多个(&=2个)碰撞块。第一个碰撞块的作用相同,后续的碰撞块则对第一个碰撞块计算完成之后内部状态的区别做逐一修正。在唯一一份公开的选择前缀碰撞代码 [2,3] 中,这个后续碰撞块的长度指定为9,意为需要构造9次修正块,以完成一次碰撞攻击。长度越短,对于每个碰撞块的要求就越高,计算所需的时间也指数级提高。在长度为9时,计算可以在普通计算机上运算几小时即可完成。
对于MD5碰撞的研究主要关注与快速发现MD5碰撞。王小云教授的著名工作[7]等,以及谢涛的后续工作[8]等,使得在短时间内构造简短的MD5碰撞成为可能。对SHA1最著名的攻击是最近的SHA1 Shattered攻击,是一种共同前缀碰撞攻击 [9]。另一方面,利用选择前缀攻击,可以伪造X509格式的CA证书 [10],以及构造多个消息的碰撞“Herding Attack”,可以用于“预测”任何一次的美国总统大选结果。 此外,对于攻击签名机制,还有一些由于签名机制实现不当而产生的漏洞和对应的攻击方法。下面我们简要介绍一下选择前缀碰撞攻击的能力,然后再讨论如何利用择前缀碰撞攻击,最后回顾一下对于基于hash的签名机制实现不当而产生的攻击。&
3.MD5的ChosenPrefix Collision攻击
对于两个给定的不同前缀p1和p2,CPC攻击可以构造出两个后缀m1和m2,使得
hash(p1+m1) = hash(p2+m2)
而且p1+m1的长度和p2+m2的长度相等。
举个例子,令p1=“希拉里会当选”,p2=“川普会当选”。在大选之前先利用CPC攻击,构造出两个后缀m1和m2,然后计算他们的MD5值v=MD5(p1+m1)=MD5(p2+m2)。然后告诉世人本次大选结果的md5值是v。在真正结果揭晓后,若希拉里当选,则展示p1+m1,否则展示p2+m2,即可完成预测。当然实际场景下没有那么简单,任何人看到“XXX当选”后面那串毫无意义的后缀字串都会产生质疑。在实际攻击场景中往往需要一个可以在末尾附加额外数据的数据结构上进行CPC攻击,例如PE可执行文件、ZIP压缩文件、JPG图像文件等末尾都可以加入后缀且不影响正常使用。
利用CPC攻击,还可以构造多个消息的碰撞。以三个消息为例(图片来自[9]):
IHV0是MD5默认的初始状态。m1/m2/m3是三个不同的前缀,经过MD5运算后得到了三个不同的MD5状态(值)IHV1、IHV2、IHV3。此时先用CPC攻击m1和m2,生成padding c1和c2,他们有共同的MD5值IHV4。此时对m3做平凡的补长p3,生成IHV5。再从IHV4和IHV5开始使用CPC攻击,即可得到c4和c5。此时
MD5(m1+c1+c4)=MD5(m2+c2+c4)=MD5(m3+p3+c5)
而且len(m1+c1+c4)=len(m2+c2+c4)=len(m3+p3+c5)。
一份公开的CPC攻击源代码是由Mark Stevens编写的HashClash [2],支持使用CUDA来加速CPC攻击中的生日攻击部分,然而这份代码目前不能很好工作。一份能工作的代码在 [11]中可以找到。由于CUDA接口的升级,[2,11]中的CUDA部分均不能正常编译。在做了一些修正后我们把现在可以工作的版本公布在 [12]中,供网友实验。
使用 [12],我们构造了两组hash碰撞,大小分别为704字节和1048576字节(1Mb)。在我们双路E5-2650V3的服务器上,我们使用了30个核心和3块K1200加速卡,运算6小时可得到一组碰撞。其中使用加速卡进行生日攻击的时间只有不到十分钟。
A.伪造CA证书
在MarcStevens 2009年的工作中,展示对CA证书的攻击使用的是选择前缀攻击。图1展示了伪造CA证书的原理 [10]。
图1 CA证书的伪造过程
图1左侧是合法的网站证书结构,右侧是需要伪造的CA证书结构。进行攻击时,攻击者可以同时控制左侧的合法网站证书结构,和右侧的伪造CA证书的结构。这里攻击者需要对头部几个域(serial number/validity period)等进行”猜测”,但是由于很强的可预测性,做这个猜测并不难。攻击者通过对发行证书的机构进行反复观测(反复申请证书),发现1. 序列号是线性增加的并且2. 有效期是可预测的。因此攻击者可以计划一个攻击的时间,并猜测那个时间段可能出现的序列号范围,并构造其对应有效期,构造出一批可能的合法证书头部,作为选择前缀攻击的消息前缀。而对于右侧伪造的CA证书,则构造了一个合法的CA证书头部。接下来攻击者就进行大量运算,计算出一批碰撞。接下来再对做出的碰撞进行尾部补全,得到一批“合法网站证书”和“伪造CA证书”,并且从“合法网站证书”中取出RSA公钥。最后,在攻击者精心计划的攻击时间,去申请网站证书。如果申请下来的网站证书的序列号/有效期恰好匹配到攻击者预测范围内的某一个证书,那么攻击就完成了,生成了一个完全“有效”的伪造的CA证书。
2007年,Alexander Sotirov和Marc Stevens的团队使用了200台PS3主机进行了基于MD5 CPC攻击的CA证书伪造攻击。每一次计算耗时1-2天,在失败了3次后,第四次终于成功。
B.SHA1 SHAttered攻击
今年2月,SHA1的碰撞攻击SHAttered首次公开在互联网上。SHAttered攻击属于共同前缀攻击,其展示形式非常直观--两个大小相等、SHA1值相同,但是显式效果迥异的PDF文档。
图2 SHAttered攻击的实例
该攻击的难点有二,一是如何完成SHA1共同前缀攻击,二是如何使用共同的前缀和后缀,以及不同的碰撞块,构造两个合法的PDF,并且他们的显示效果不同。&
第一个问题,Marc Stevens已经为此研究数年。这次他联合了Google的工程师终于把算法变成现实。在这次攻击中,他们使用了CPU来计算碰撞块的第一个block,使用GPU来计算碰撞块的第二个block。碰撞块的第一个block的第一次碰撞消耗了3583核-年的计算量,第二次碰撞消耗了2987核-年的计算量。在第二阶段,除了CPU外,还是用了GPU集群进行运算。GPU集群的计算量相当于114块K20计算一年,或是95块K40计算一年,或是71块K80一年的计算量。如果使用商业的云GPU服务,租用71块K80计算一年,就将耗费56万美元。
对于第二个问题,该攻击做了非常巧妙的构造。我们借用热心网友的回答 [17] 来做分析。首先,SHAttered攻击是一个共同前缀攻击,所以构成的pdf一定是有一个共同的pdf头部,参见图3。
图3 SHAttered攻击的PDF结构
两个PDF的头部共同部分包括:PDF文件头和image对象的一部分。在image对象中,包括了属性表引用、content结构,和属性。该攻击构造了一个巧妙的content结构,在这个结构中包含了一个JPEG图片。碰撞块Magic block 1和Magic block 2就位于这个JPEG图片内部metadata的部分,见图4。
图4 JPEG metadata部分的结构
注意其中的FFFE comment处。FF FE 这两个字节代表了comment段的开始,其后的两个字节代表该comment段的长度。在图4中出现了两个comment段,第一个段的长度是0×24,用该comment段的起始地址0×99+0×24可以得到第二个comment段的地址0xBD。可以看到0xBD位置处依然是一个FF FE标签,代表另一个comment段的开始。这个comment段的长度在两份pdf中就不相同了,在第一份pdf中,这个长度是0×173(指向0xBF+0×173=0×232),而在另一份pdf中,这个长度是0x17F(指向0xBF+0x17F=0x23E)。0×232开始的位置是一个很长的区段,而0x23E开始的部分是一个非常短的区段。其后还有一些精心布置的区段,它们的字节表示都一样,但是由碰撞块的第一字节引起差别后,所能表示的结构不同,从而使得显示出来的图像不同。&
C.对网盘的“秒传”机制进行攻击
总所周知,网盘的“秒传”机制可以大大减少文件上传的时间代价。“秒传”机制往往使用hash函数生成文件的摘要值来作为文件特征值,判断是否可以使用“秒传”功能。另一个影响“秒传”机制的参量是文件大小。往往大文件会触发“秒传”机制,而小文件不一定触发。
这里我们使用网易网盘、115网盘、城通网盘、腾讯网盘、中国移动彩云网盘、Box.com、Dropbox进行测试。除了网易网盘外,其他网盘均提供了对txt后缀文件的预览功能。我们使用了一对704字节的碰撞和一对1MB字节的碰撞作为实验文件,将他们上传到网盘中,使用下载、预览功能分别下载、预览这两个文件,测试各个网盘能否区分这两个大小相等而且MD5值相同的文件。结果如下表。如果下载下来的两个文件是相同的,则证明网盘无法区分这两个文件,我们将这个测试结果标记为“冲突”,否则标记为“不冲突”。
小文件下载
小文件预览
大文件下载
大文件预览
无预览功能
无预览功能
可以看出,网易网盘、城通网盘和彩云网盘完全无法区分MD5碰撞的文件。
著名的virustotal网站曾经使用MD5作为文件判重的标准以减少运算量。但是在CPC攻击出现之后,攻击者就可以通过先提交善意文件再传播恶意文件的方式躲避来自virusltotal的报警。因此virustotal迅速进行了修改,使用SHA256的散列值作为文件特征。
目前很多安全厂商依然在使用md5用于恶意代码识别,这里需要有额外的判重机制。由于MD5碰撞基本上都是属于上文所述的同谋攻击,因此如果相同MD5值下有一个样本是恶意的,其他的样本一般也是作为攻击的中间环节而存在,将所有样本都报警也是一种可行的办法。
D.攻击基于“尾部附加key”形式的MD5签名进行攻击
我们先回顾上一篇文章 [13]中所述的在线支付协议中基于MD5的签名机制。以请求“c=C&b=B&a=A”为例。为了签名这个请求,先将请求解析为key-value对:
{"c":"C","b":"B","a":"A"}
然后按key的字典序进行排序并连接
a=A&b=B&c=C
a=A&b=B&c=C&key=this_is_a_secret
MD5(a=A&b=B&c=C&key=this_is_a_secret)=0a1d218f9b2b029c84c84458bb6dbc00
形成最终的请求
c=C&b=B&a=A&sign=0a1d218f9b2b029c84c84458bb6dbc00
这样的请求存在于从支付平台返回给商户服务的支付结果异步通知中。商户的验签过程通常是这样的:
1、从参数中去掉sign域
2、将剩余参数decode,将每个接口的参数按照key值升序排列;
3、将排好序的参数按照 key=value&的形式链接为字符串;
4、将生成的字符串尾部附加上密钥“key=token”,然后做MD5;
5、检查MD5值是否等于sign域。若相等,则证明消息未被窜改。
这里我们注意到:验签时的参数列表默认是对“所有”参数验签。如果攻击者可以在消息中插入一个域,那么就可以使得验签时也包括这个参数。由于此类系统的复杂性,这个请求往往很长,包括很多参数以及嵌套了许多层的商品信息。攻击者一旦找到一个参数或者嵌套的参数可以注入,那么就可以控制异步通知的内容。为了叙述方便,我们假定攻击者下了两个订单,订单Id分别为和。而且攻击者可以控制参数“zzz”的尾部内容,例如将请求设置为src的形式:
customerId=4&orderId=&service=querypay&version=1.0&zzz=
这里zzz=后面可以是任意给定内容,这里留空也不影响。攻击者构造另一个请求dst:
customerId=4&orderId=&service=querypay&version=1.0&zzz=
这里只简单修改了orderId以演示效果。然后通过CPC攻击计算得出一组碰撞src.coll和dst.coll。由于攻击者能控制zzz域,于是将src.coll进行真实支付,获得支付平台的签名sign,然后将其异步通知中的订单号做简单修改,从改为,作为伪造的异步通知提交给商户服务器。由于src.coll和dst.coll的MD5值是相等的,所以他们在尾部附加上商户的密钥之后做MD5值依然是相等的(MD5碰撞的尾部附加性质)。因此伪造的异步通知也是有效的。如果商户服务器不去查账而是相信支付平台的异步通知,那么攻击者成功的用一个订单的金额完成了两个订单。
此外,之前也出现过针对微软msi签名机制不完善/双签名机制的攻击,构造具有“合法签名”的恶意代码。也发现了真实的利用CPC攻击传播的恶意代码的实例。感兴趣的读者可以参考 [14]。
4.安全的使用安全hash签名
首先为了抵抗CPC攻击,不能简单的在待签字符串后面附加密钥,而是需要在待签字符串前后均附加密钥,即计算:
sign = hash(secret1 + string + secret2)
作为签名。如果只在头部附加,那么可能受到长度扩展攻击影响。如果只在尾部附加,那么可能受到CPC攻击的影响。但是如果两端均附加,那么就不受到这两类攻击的影响了。此时,为了计算一个合法的碰撞,攻击者不得不使用基于生日攻击的蛮力搜索来进行攻击。而且如果secret安全地存储在云端,攻击者必须要产生大量的网络请求来完成碰撞,这个是难以实施且易于探测的。
如果存在同谋碰撞攻击的可能,强烈建议前后同时都加签名密钥保护,而这也恰恰是HMAC [15,16] 的设计实现。因此在实际应用中建议使用HMAC扩展算法,而不是直接使用MD5/SHA等算法,即使对于SHA256也是如此。&
若不能直接升级到HMAC-SHA256算法,则要尽可能的消除同谋碰撞攻击的机会,将攻击退化成针对一个固定hash值的单向碰撞攻击。在同谋碰撞攻击(共同前缀攻击和选择前缀攻击)中,由于碰撞块的存在,需要对输入有充分的自由选择能力。若能严格的限制参与签名的域,并且对参与签名的每一个域进行严格检查,则可以大幅度消除同谋攻击的潜在机会。
真实世界中不乏易受同谋攻击的例子。这里用AnySDK为例。AnySDK是一个第三方SDK接入工具,使用AnySDK可以接入许多不同在线支付平台。AnySDK提供了一份典型的有风险的验签代码 [17],容易受到同谋攻击威胁:
function checkSign($data, $privateKey) {& & & & if (empty($data) || !isset($data['sign']) || empty($privateKey)) {& & & & & & & && & & & }& & & & $sign =$data['sign'];& & & & //sign 不参与签名& & & & unset($data['sign']);& & & & $_sign =getSign($data,$privateKey);& & & & if ($_sign!= $sign){& & & & & & & && & & & }& & & &}
其中的getSign函数只是负责进行拼接待签字符串和计算hash。可以看出,这份代码对输入的域并没有任何限制,于是攻击者的任何输入均可进入验签过程中。这是相当危险的,使用普通服务器运算几小时即可生成完成MD5 CPC的运算,生成一组可用于发动攻击的MD5碰撞,而成本只需几元电费。若使用云计算平台则可进一步提高速度。因此,这样的签名结构,搭配有缺陷的验签代码,现在已经非常危险。
以下是一份进行了良好的输入参数验证的示例代码,可以最大程度的消除同谋碰撞的机会:
functioncheckSign($data, $privateKey) {& & & & if (empty($data) || !isset($data['sign']) || empty($privateKey)) {& & & & & & & && & & & }& & & & $this-&params['arg1'] = $data['arg1'];& & & & $this-&params['arg2'] = $data['arg2'];& & & & if (checkArgs($this-&params) == false) {& & & & & & & && & & & }& & & & $sign =$data['sign'];& & & & $_sign =getSign($this-&params,$privateKey);& & & & if ($_sign!= $sign){& & & & & & & && & & & }& & & &}
其中通过checkArgs函数对params数组的每个域进行合法性检查,通过后再进行签名计算。
在实施了这些防护措施之后,同谋碰撞攻击将会近似退回到原根攻击,目前估计针对MD5的攻击复杂度将超过112bit,而针对SHA1的攻击复杂度将超过144bit,在可见的近期代价依然非常高昂,不是普通机构能够承担。
种种关于MD5/SHA1是否过时的讨论已经持续多年,但是由于国内的实际情况,MD5/SHA1依然存在于我们日常生活的每个方面,要替换的过程依然漫长。我们在对实际系统中的MD5/SHA1进行攻击分析后发现,在完善了验签、判重机制并尽可能消除同谋碰撞后,其安全性短期之内还是可以得到保证的。尽管如此,这样的机制只是给了我们难得的喘息时间,我们依然督促各厂商尽快升级到更安全的HMAC-SHA256。最后再次强调,所有可能被长度扩展攻击的数字签名协议(节2.1)应该立即升级成第四节中所述的HMAC-SHA256算法,因为很有可能黑产已经在享用你的服务了。
1.Cryptographic Hash Function,
2.The HashClash Project,
3.Create your own MD5 collisions,
4.MD5长度扩展攻击,长度扩展攻击
5.哈希长度扩展攻击解析,ricterzheng,哈希长度扩展攻击解析
6.MD5长度扩展攻击原理,技术分享//MD5长度扩展攻击原理.html
7.How to break MD5 and other hash functions,
8.How To Find Weak Input Differences For MD5 Collision Attacks,
9.MD5 Chosen Prefix Collision,
10.Creating a rogue CA certificate,
11.Create your own MD5 collisions,
12.MD5碰撞示例代码,
13.支付安全不能说的那些事,百度安全实验室公众号
14.MD5碰撞的演化之路,
15.Keying hash functions for message authentication, Mihir Bellare ,Ran Canetti , Hugo Krawczyk
16.How did the Shattered.iogroup manage to create a SHA1 collision for a PDF that is similar looking tothe original?,
17.AnySDK签名算法及示例,
* 本文作者:百度安全中心(企业帐号),转载请注明来自FreeBuf.COM
我说怎么没有我司旗下的百度网盘,原来是安全中心那群小伙子写的,不错,明天给你们发几张我们合作医院的体检卡
必须您当前尚未登录。
必须(保密)
百度安全实验室
关注我们 分享每日精选文章
可以给我们打个分吗?}

我要回帖

更多关于 sql注入攻击与防御 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信