数据库安全漏洞浅析之缓冲区溢出漏洞(3)
作者:安华金和 发布时间:2017-01-26

前文中,我们对于栈溢出的原理进行了实例还原,本文将开始介绍黑客如何利用漏洞进行数据库攻击,这里需要大家先对前文进行回顾——“数据库安全漏洞浅析之缓冲区溢出漏洞(2)”,在此实例基础上,我们将从2种角度讲解栈溢漏洞的攻击方式:

1改变程序逻辑, 2.直接劫持程序运行攻击者的攻击代码。

如何通过改变程序逻辑,绕过一些判断使得某些限制无效,最终达到上面的例子中假如liusicheng这个预设的密码是某银行的密码,通过密码检查后可以获取该密码保护的敏感信息。那么攻击者要想通过密码检查,要么输入正确的密码,要么就需要改变程序流程(输入错的密码但是还能走回对的分支)。为了达到这个目的,我们寻找下choose的地址(re_choose的返回值),看re_choose的图发现局部变量空间是0x30也就是48个字节。在低地址的应该就是用于溢出的buffer在最靠近栈底的4个字节的应该是result的地址,也就是choose取值的地址。result的地址是0012FB6C(由于input输入的是qwe所以返回值是1)值是1,此时密码验证过不去。看低地址的0012F840这个就是字符串buffer。buffer会拷入输入的input值。buffer里面存储的就是657771(win是小端字节序所以全是反的也就是qwe)。到这里,如果想让密码验证通过,就需要修改0012FB6C的值。除了输入正确的密码外,还可以尝试输入过长的input,让input向buffer拷数据的时候造成Buffer缓冲区溢出,用溢出的值覆盖掉在0012FB6C的值,把值修改成希望的0(0就表示通过密码验证了)。

20170126-1.png 

buffer占44个字节也就是input需要至少输入44个字节来占满buffer,然后再输入的字节将会覆盖result。修改choose的值,进而改变程序流程。由于这是字符串最后会有一位null所以咱们输入44个w来占满buffer把null挤到result中覆盖原来的1.

输入43个w

20170126-2.png

没有缓冲区溢出12FB6C未被修改

输入44个w达到缓冲区溢出

20170126-3.png

12FB6C正好被结束符null覆盖掉从1改成0,最终跳转到密码验证通过的支路。

至此,基于栈溢出漏洞的原理,黑客可以通过改编程序逻辑的方法,完成了绕过密码检验的全部步骤,从而获取了数据库高权限账户。在过往的数据库安全事件中,此类漏洞攻击方式屡见不鲜,这是缓冲区溢出漏洞的最基本用法,也是黑客们的惯用手法。