利用软件安全漏洞巧设陷阱获取数据库用户名和密码

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

今天客户要求维护某信息管理系统的数据,该软件缺少相应功能,所以需要直接进入数据库系统,然后使用SQL语句进行维护。

但是该软件默认未提供连接数据库的用户名、密码和数据库名称,翻了下程序目录下的配置文件,找到了登录用户名sa以及数据库名称,但是密码却是一串奇怪的字符,看情况是被加密过了,现在要获取这个密码。

我分别尝试了好几种办法,比如使用sniffer嗅探软件,探测发送到数据库的数据包,使用编程的方式建立个假的数据库服务陷阱,但均告失败。sniffer只能探测经过网卡的数据,对于localhost本地流量一点反应都没有,至于服务陷阱,我使用Python简单写了个接收端口数据并输出的程序作为陷阱:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8000)) # 端口为8000
sock.listen(5)
 
while True:
    conn,addr = sock.accept()
    try:
        conn.settimeout(5)
        buf = conn.recv(1024)
        print(buf)
    except socket.timeout:
        print('Time out')
    conn.close()

然后我停止了数据库服务,然后用这个程序伪造了个数据库服务(监听端口相同),然后用该信息系统软件客户端程序连接,结果用户名和数据库名都搞到了,偏偏密码没有,愁人了。

在我尝试其他办法的时候注意到该软件有个备份机制,备份时弹出一个命令提示符,提示是数据库软件目录下的dump.exe实用工具,也就是说这个软件要调用dump.exe才能备份数据库,当然这个dump.exe是个命令提示符工具,要调用它必须提供调用参数,我眼前一亮,对的,这个参数说不定包含了我所期待的密码!我手动尝试着调用dump.exe备份实用工具,果然提示需要输入密码。

为了验证我的猜想,我用C语言写了个简单的替换程序用于替换dump.exe,代码很简单,如下:

#include <stdio.h>
 
int main(int argc, char **argv)
{
	int i;
	for (i = 0; i< argc; i++) {
		printf("%d\t%s\n", i, argv[i]);
	}
	getchar();
	getchar();
	return 0;
}

然后要用编译器编译,我临时下了个TCC: Tiny C Compiler轻量编译器,再将上面的代码命名为dump.c,运行tcc dump.c命令,然后自动生成dump.exe

好了,接下来我们可以用这个dump.exe替换真实的数据库备份程序了,当然我们事先备份一下dump.exe,然后把编写的假冒的dump.exe换上去,打开该信息系统软件,执行备份任务,果然用户名、密码和数据库名都有了。

最后记得把真实的备份工具dump.exe换上去,否则这个信息系统就无法正常备份了。

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

    • 呵呵,谈不上牛叉。
      好久不写C语言了,还是上学时用得多,工作后都要求快速开发,所以多用脚本去处理了,我感觉因为工作需要是接触得多精通得少了。

        • 说来惭愧,实际上我工作的不能算是IT部门,只是平常需要大量处理数据会用到编程技术,偶尔受朋友之托也会简单的帮忙维护网络,所以大部分情况下还是和脚本编程打交道。
          脚本语言还是以VBScript、JavaScript、PHP、Python为主,Python是今年刚开始研究的,觉得不错。

请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注